0

내 응용 프로그램에서 백그라운드 위치 모드를 사용하려고합니다. 내 plist 파일에서 '위치 업데이트'배경 모드를 활성화했습니다. 앱에 15 초마다 업데이트되는 타이머가 포함되어 있습니다.위치 iOS에서 배경 모드가 작동하지 않습니다.

응용 프로그램이 백그라운드로 이동하는 경우, 내가, 내 타이머를 내가 전 10 분 다시 응용 프로그램을 탐색 할 때 initializeLocationManager는

-(void)initializeLocationManager 
{ 
    if(!self.locationManager) 
     self.locationManager = [[CLLocationManager alloc] init]; 
    else 
     [self.locationManager stopUpdatingLocation]; 

    if ((![CLLocationManager locationServicesEnabled]) 
     || ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusRestricted) 
     || ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied)) 
    { 
     //user has disabled his location 
    } 
    else 
    { 
     self.locationManager.delegate = self; 
     self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
     self.locationManager.distanceFilter = kCLDistanceFilterNone; 
     [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 
     [self.locationManager startUpdatingLocation]; 
    } 
} 

아래에 다음과 같은

- (void)applicationDidEnterBackground:(UIApplication *)application { 
UIApplication* app = [UIApplication sharedApplication]; 
self.bgTaskID = [app beginBackgroundTaskWithExpirationHandler:^{ 
     NSLog(@"background task %lu expired", (unsigned long)self.bgTaskID); 
     [app endBackgroundTask:self.bgTaskID]; 
     self.bgTaskID = UIBackgroundTaskInvalid; 
}]; 


[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(initializeLocationManager) userInfo:nil repeats:NO]; 

      if(self.timerLocationBackground) 
      { 
       [self.timerLocationBackground invalidate]; 
       self.timerLocationBackground = nil; 
      } 
      self.timerLocationBackground = [NSTimer scheduledTimerWithTimeInterval:15 
                      target:self 
                      selector:@selector(initializeLocationManager) 
                      userInfo:nil 
                      repeats:YES];}` 

를하고있는 중이 야

앱이 일시 중지되는 3 분에 중지됩니다. 앱을 다시 포 그라운드로 돌아

내 코드는 다음과 같습니다 :

- (void)applicationWillEnterForeground:(UIApplication *)application { 
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 

// 
//Remove the baground task 
// 
if (self.bgTaskID != UIBackgroundTaskInvalid) { 
    [[UIApplication sharedApplication] endBackgroundTask:self.bgTaskID]; 
    self.bgTaskID = UIBackgroundTaskInvalid; 
} 
[self.locationManager stopUpdatingLocation]; 

어떤 도움?

+0

self.bgTaskID를 설정 한 코드를 게시 할 수 있습니까? – rjpadula

+0

@rjpadula 업데이트되었으므로 didenterbackground 메서드의 첫 번째 줄이 설정되어 있는지 확인하십시오. –

+0

"백그라운드 작업 % lu가 만료되었습니다"메시지가 표시되는지 확인할 수 있습니까? 백그라운드 작업을 갱신해야 할 가능성이 큽니다. 내 경험상, 3 분은 필요한 때까지 얼마나 걸릴지에 대한 것입니다. – rjpadula

답변

0

이렇게해야합니다. 나는 자신을 신속하게 전환 했으므로 나의 목표는 완벽하지 않을 수도있다.

- (void)applicationDidEnterBackground:(UIApplication *)application { 

    [self keepAwakeInBackground ] ; 

    /// rest of your function to set up timers 
} 

- (void) keepAwakeInBackground { 

    //Remove the old background task, if there was one 
    if (self.bgTaskID != UIBackgroundTaskInvalid) { 
     [[UIApplication sharedApplication] endBackgroundTask:self.bgTaskID]; 
     self.bgTaskID = UIBackgroundTaskInvalid; 
    } 
    /* 
    * You probably want something here to decide that the app should really be suspended here 
    * if () return 
    */ 

    // Set up new background task 
    UIApplication* app = [UIApplication sharedApplication]; 
    self.bgTaskID = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [self keepAwakeInBackground] 
    }]; 
} 
+0

나는 하나의 (나는 그것이 당신의 부분으로부터의 유일한 변화라고 생각한다) 옛날 배경 작업을 제거하려고 노력했다. 그러나 나는 전경으로 되돌아 갈 때 3 분 후에 타이머를 정지시켰다. 나는이 문제에 관해 필사적이다! –

+0

내가 만난 변경으로 만료 처리기가 첫 번째 만료시 새로운 배경 작업을 생성합니다 (보고있는 3 분). 잘못된 게시 죄송합니다. – rjpadula

+0

위의 코드를 시도했지만 여전히 작동하지 않았습니다. 백그라운드 작업이 완료되면 keepAwakeInBackground 메서드를 호출하고 self.bgTaskID = UIBackgroundTaskInvalid; 이 수행되면 앱은 새 작업을 계속하지 않고 일시 중단 상태로 자동 설정됩니다. –

관련 문제