2014-02-06 89 views
1

我正在創建需要在特定時間在後臺喚醒的應用程序。startUpdating LocationManager通過靜默推送通知

我曾嘗試:

  1. UILocalNotification:但我不希望使用UILocalNotification,因爲它需要用戶交互輕按通知,並不僅僅是應用程序將被喚醒並啓動位置管理。

  2. 我也使用[locationManager startUpdatingLocation];啓用背景模式位置更新,這是行得通的,但它會佔用大量的電池。

所以使用全新的iOS 7的功能Silent pushNotificationdidReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:方法我要開始在後臺位置管理,

-(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; 
    }]; 

} 

無聲推送通知是否正常工作,

有效載荷PushNotification:

{"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

並且該應用程序是否會得到Apple的批准? –

1

你不能。在應用程序處於後臺時顯式不允許啓動位置服務。用戶必須知道應用程序打開的開始。

想象一下,顛覆性的跟蹤將可如果你能發送無聲通知觸發位置更新回未經用戶不知情的服務器...

+0

但第一次用戶已打開應用程序,它將獲得'notification'和'Location'的許可。那麼它有什麼問題呢? – Optimistic

+0

:但是我已經看到很多地方的位置管理器正在使用後臺任務來放樣。 – Optimistic

+0

我現在找不到文檔,但我很確定它不被允許。您需要讓用戶打開應用程序。但是,爲什麼你要這樣做呢? – Wain

0

如果你想在後臺模式更新位置信息,您只需在plist文件中啓用UIBackgroundModes即可。見startUpdatingLocation description in apple's doc ..

如果啓動該服務,你的應用程序被暫停,直到您的應用程序啓動 (無論是前臺還是後臺)再次運行 系統停止事件的傳遞。如果您的 應用程序已終止,則新位置事件的傳送將完全停止 。因此,如果您的應用程序在後臺需要接收位置 事件,則它必須在其Info.plist文件中包含UIBackgroundModes 鍵(具有位置值)。

您可以在xcode5 +像下面啓用此背景更新用..

enter image description here

+0

imani:我已啓用'位置更新和遠程通知'&在你的情況下,你是否在後臺調用'startUpdates'方法? – Optimistic

+0

Apple在某些情況下只會允許這樣做。很可能不在這裏。 –

1

你可以做什麼,在後臺,是接收significantLocation事件和邊界事件。我可以想象利用這種功能來保持最近的排序日誌。當收到您的遠程通知時,通過發送最後一個已知位置來回應。 通過一些實驗,我相信您可以將其細化爲相當準確,對電池影響很小。

+0

我已經成功地通過在後臺推入locationManager,但有新問題[檢查此](http://stackoverflow.com/questions/21626286/app-killed-by-os-in-ios7-after-some-秒) – Optimistic