通过静默推送通知启动LocationManager的StartUpdatingLocation

时间:2014-02-06 12:19:42

标签: ios objective-c ios7 cllocationmanager uibackgroundtask

我正在创建需要在特定时间在后台唤醒的应用。

我试过了:

  1. UILocalNotification:但我不想使用 UILocalNotification ,因为它需要用户互动来点按通知,而且只有应用才会唤醒并启动位置管理器。

    < / LI>
  2. 我还使用[locationManager startUpdatingLocation];启用后台模式位置更新,这是有效的,但需要大量电池。

  3. 因此,使用新的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"}
    

    但这不会启动位置经理,请有人帮助我。

    修改

    如果不可能,请给我一些建议。

4 个答案:

答案 0 :(得分:3)

我已经成功实现了这个使用Silent Pushnotification&amp;它调用startUpdatingLocation,我能够在委托方法中获取位置数据:

使用此有效负载:

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

我启用了位置&amp;后台模式的远程通知: 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]];
}

答案 1 :(得分:1)

你做不到。当应用程序在后台时,明确不允许启动位置服务。用户必须知道应用程序打开时的开始。

想象一下,如果您可以发送静默通知以触发位置更新回服务器而无需用户了解,那么可以使用哪种颠覆性跟踪...

答案 2 :(得分:1)

在后台,你可以做的是接收重要事件和边界事件。我可以想象利用这种能力来保持最近的位置记录。收到远程通知后,通过发送最后的已知位置进行响应。 通过一些实验,我相信你可以将其改进为合理准确,对电池的影响很小。

答案 3 :(得分:0)

如果要在后台模式下更新位置,只需在plist文件中启用UIBackgroundModes。见startUpdatingLocation description in apple's doc ..

  

如果您启动此服务并且您的应用程序被暂停,则   系统会停止事件的传递,直到您的应用程序启动   再次运行(在前台或后台)。如果你的   应用程序终止,新位置事件的交付停止   共。因此,如果您的应用程序需要接收位置   在后台的事件,它必须包括UIBackgroundModes   密钥(带位置值)在Info.plist文件中。

您可以在xcode5 +中为背景更新启用此功能,如下所示。

enter image description here