2014-02-06 2 views
1

특정 시간에 백그라운드에서 깨어나야하는 앱을 만들고 있습니다.startUpdating 자동 푸시 알림을 통한 LocationManager의 위치

  1. UILocalNotification을 :

    나는 시도하지만이 일어나 위치 관리자를 시작합니다 통지에 만 응용 프로그램보다 활용할 사용자 상호 작용이 필요하기 때문에 나는 UILocalNotification을 사용하지 않습니다.

  2. 배경 모드로 활성화 된 [locationManager startUpdatingLocation];도 사용했습니다. 위치 업데이트는 작동하지만 배터리가 많이 소모됩니다.

그래서 새로운 아이폰 OS 7 기능 Silent pushNotificationdidReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: 방법을 사용하여 내가 PushNotification를 들어,

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ 

    NSLog(@"Receive RemoteNotification in fetchCompletionHandler with UserInfo:%@",userInfo); 
    application.applicationIconBadgeNumber=0; 
    __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 

     [self.locationManager startUpdatingLocation]; 

     [application endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

} 

자동 푸시 알림이 제대로 작동, 배경 위치 관리자를 시작

페이로드가 필요합니다

{"aps" : {"content-available" : 1},"SilentPushId" : "07"} 

하지만 위치 관리자를 시작하십시오 누군가 제발 도와주세요.

편집 :

나에게 몇 가지 제안을주지하시기 바랍니다 할 수없는 경우.

+0

앱은 포 그라운드로 될 수 있습니까? – Mani

+0

@iMani : 아니요, 그렇지 않습니다. – Optimistic

+0

항상 위치 관리자를 백그라운드에서 시작하지 않았거나 때때로 실패하고 백그라운드에서 시작합니다. – Mani

답변

3

내가 성공적으로 사용하여 자동 Pushnotification &을 구현 한이 startUpdatingLocation를 호출하고 난 대리자 메서드에서 위치 데이터를 얻을 수 있어요 : 나는 위치를 & 원격 통지를 활성화

{ 
    "aps": { 
     "content-available": 1 
    }, 
    "SilentPush": "4" 
} 

이 페이로드를 사용

배경 모드 용 : enter image description here

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler 
{ 
    __block UIBackgroundTaskIdentifier bgTask =0; 
    UIApplication *app = [UIApplication sharedApplication]; 
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [self.locationManager startUpdatingLocation]; 

}]; 
이 알림은 사용자 상호 작용없이 해고 후

didUpdateLocations

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
     lastLoc=[locations lastObject]; 
     [logFile addLocObject:[NSString stringWithFormat:@"Loc: %@",lastLoc]]; 
} 
+0

iOS 8 이상에서 작동하나요? –

+0

애플이 애플 리케이션을 승인 할 예정입니까? –

1

수 없습니다. 응용 프로그램이 백그라운드에있는 동안 위치 서비스를 시작하는 것은 명시 적으로 허용되지 않습니다. 사용자는 앱이 열려있는 상태에서 시작을 인식해야합니다.

다시 그것에 대해 알고있는 사용자없이 서버에 위치 업데이트를 트리거 침묵 알림을 보낼 수 있다면 당신은 백그라운드 모드에서 위치를 업데이트 할 경우 파괴 추적

+0

하지만 처음으로 사용자가 열린 앱을 사용하면 '알림'과 '위치 정보'둘 다에 대한 허가가 필요합니다. 그래서 그것에 문제가 있습니까? – Optimistic

+0

:하지만 위치 관리자가 백그라운드 작업을 사용하여 많은 장소를 보았습니다. – Optimistic

+0

지금 당장은 설명서를 찾을 수 없지만 허용되지 않았 음을 확신합니다. 사용자가 앱을 열도록해야합니다. 그러나 어쨌든 왜 이것을하고 싶습니까? – Wain

0

... 가능 어떨지 상상해 plist 파일에서 UIBackgroundModes를 활성화하십시오. 이 서비스를 시작하고 응용 프로그램이 일시 중단 된 경우 응용 프로그램 (전경 또는 배경 중 하나) 다시 실행 을 시작할 때까지

는 시스템은 이벤트의 전달을 중지 .. startUpdatingLocation description in apple's doc 참조하십시오. 응용 프로그램이 종료되면 새 위치 이벤트 배달이 모두 이 아닙니다. 따라서 응용 프로그램이 백그라운드에서 이벤트를 수신해야하는 경우 Info.plist 파일에 UIBackgroundModes 키 (위치 값 포함)가 포함되어야합니다.

당신은

할 수있는 일

enter image description here

+0

imani : 백그라운드에서 '위치 업데이트 및 원격 알림'을 사용하도록 설정했습니다. 백그라운드에서 'startUpdates'메소드를 호출하고 있습니까? – Optimistic

+0

Apple은 특정 상황에서만이를 허용합니다. 여기 없을 가능성이 높습니다. –

1

은, 배경, significantLocation 이벤트와 경계 이벤트를받는 것입니다 .. 당신의 xcode5 + 아래 등의 배경 그 갱신이 활성화 할 수 있습니다. 최근 위치 기록을 유지하기 위해이 기능을 활용한다고 상상해보십시오. 원격 통지가 수신되면 마지막으로 알려진 위치를 전송하여 응답하십시오. 약간의 실험을 통해 배터리 성능에 거의 영향을 미치지 않으면서도 합리적으로 정확해질 수 있다고 확신합니다.

+0

백그라운드에서 푸시를 통해 위치 관리자를 성공적으로 시작했지만 새로운 문제가 발생했습니다 [이 항목 확인] (http://stackoverflow.com/questions/21626286/app-killed-by-os-in-ios7-after-some-seconds) – Optimistic

관련 문제