3

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

我努力了 :

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

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

编辑:

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

4

4 回答 4

4

我已经成功实现了这个 Using Silent Pushnotification & it Call startUpdatingLocation 并且我能够在委托方法中获取位置数据:

使用此有效负载:

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

我为后台模式启用了位置和远程通知: 在此处输入图像描述

- (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]];
}
于 2014-02-11T08:27:02.333 回答
1

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

想象一下,如果您可以在用户不知道的情况下发送静默通知以触发位置更新回服务器,将会有什么颠覆性的跟踪......

于 2014-02-06T12:21:50.250 回答
1

您可以在后台接收重要的位置事件和边界事件。我可以想象利用这种能力来保存最近的位置日志。收到您的远程通知后,通过发送最后一个已知位置来响应。通过一些实验,我相信您可以将其改进为相当准确,而对电池的影响很小。

于 2014-02-06T16:20:26.260 回答
0

如果要在后台模式下更新位置,只需在 plist 文件中启用 UIBackgroundModes。请参阅苹果文档中的 startUpdatingLocation 描述

如果您启动此服务并且您的应用程序被挂起,系统将停止传递事件,直到您的应用程序再次开始运行(无论是在前台还是在后台)。如果您的应用程序终止,则新位置事件的传递将完全停止。因此,如果您的应用程序需要在后台接收位置事件,它必须在其 Info.plist 文件中包含 UIBackgroundModes 键(带有位置值)。

您可以在 xcode5+ 中启用此功能以进行后台更新,如下所示。

在此处输入图像描述

于 2014-02-06T12:36:31.123 回答