我正在创建需要在特定时间在后台唤醒的应用。
我试过了:
UILocalNotification:但我不想使用 UILocalNotification ,因为它需要用户互动来点按通知,而且只有应用才会唤醒并启动位置管理器。
< / LI>我还使用[locationManager startUpdatingLocation];
启用后台模式位置更新,这是有效的,但需要大量电池。
因此,使用新的iOS 7功能Silent pushNotification
和didReceiveRemoteNotification:(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 :(得分:3)
我已经成功实现了这个使用Silent Pushnotification&amp;它调用startUpdatingLocation,我能够在委托方法中获取位置数据:
使用此有效负载:
{
"aps": {
"content-available": 1
},
"SilentPush": "4"
}
我启用了位置&amp;后台模式的远程通知:
- (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 +中为背景更新启用此功能,如下所示。