我正在为iOS 7创建基于导航的应用程序,为此我正在获取用户位置数据,使用 CoreLocation 框架,
应用程序要求是在特定时间开始在后台获取用户位置,为此我已经使用didReceiveRemoteNotification fetchCompletionHandler:
方法实现了 Silent Pushnotification,
我已经成功地实现了这个 Using Silent Pushnotification & it CallstartUpdatingLocation
并且我能够在委托方法中获取位置数据:
使用此有效负载:
{"aps" : {"content-available" : 1},"SilentPush" : "4"}
我为后台模式启用了location
& :remote notification
- (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]];
}
但问题是:
几秒钟后,位置类的委托方法停止,如果设备正在移动,它不会发送任何数据,当我将应用程序与前台交谈时,它会调用“didFinishLaunhing”方法,所以我猜即使位置正在更新,操作系统也会杀死应用程序,在Diagnostics & usage
我收到以下崩溃报告的设备:
Application Specific Information:
MockUpApp2[390] has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x145ac790> identifier: Called by MockUpApp2, from -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] process: MockUpApp2[390] permittedBackgroundDuration: 40.000000 reason: finishTaskAfterBackgroundContentFetching owner pid:390 preventSuspend preventIdleSleep preventSuspendOnSleep
)}
昨天我问了这个问题,现在我可以通过推送通知在后台启动位置管理器,
所以请任何人都可以解决这个问题。
谢谢你。
注意: 如果我在调试模式下运行应用程序,意味着我通过 XCode 运行应用程序并且不停止它或不断开连接,应用程序将运行。在这种情况下,应用程序不会被操作系统停止。
编辑 1
根据@Stephen Darlington 的回答,如果我删除了所有的 backgroundfacher 之类的,
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
[self.locationManager startUpdatingLocation];
}
现在应用程序甚至不会调用didUpdateLocations
一次,:(
我应该用这种方法写什么?
Edit 2
根据Apple Doc说:
If your app is suspended or not running, the system wakes up or launches your app and puts it into the background running state before calling the method.
那么,只要我启用了位置背景模式,应用程序是否应该在后台运行?