大家晚上好!
我有一个简单的问题:当我在 iOS 7 上使用 didReceiveRemoteNotification:fetch 收到正确的推送通知时,如何启用 [CLLocationManager startUpdateLocation]?
现在,我有:
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
if ([userInfo objectForKey:@"aps"] && [[userInfo objectForKey:@"aps"] objectForKey:@"content-available"])
{
if ([userInfo objectForKey:@"update-location"])
{
[self performSelectorInBackground:@selector(handleLocationNotificationPush:) withObject:completionHandler];
}
if ([userInfo objectForKey:@"update-sensors"])
{
}
}
}
-(void)handleLocationNotificationPush:(void (^)(UIBackgroundFetchResult))completionHandler
{
[CLController.locMgr startUpdatingLocation];
++nbPushReceive;
[self.pushLockForLocation lock];
if ([self.pushLockForLocation waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:25]] == TRUE && self.lastKnownLocation != nil)
{
[self.pushLockForLocation unlock];
// Send my new location to server using HTTP request
[self sendLocationForPushUpdates:self.lastKnownLocation fetchCompletionHandler:completionHandler];
if (![UIApplication sharedApplication].applicationState == UIApplicationStateActive)
// it stops location updates
[self stopAllLocationUpdates];
return;
}
// In case we didn't receive any new position during 25 secondes
[self.pushLockForLocation unlock];
if (![UIApplication sharedApplication].applicationState == UIApplicationStateActive)
{
[self stopAllLocationUpdates];
}
completionHandler(UIBackgroundFetchResultNoData);
}
- (void)locationUpdate:(CLLocation *)location
{
NSLog(@" *** LocationContrller - LocationUpdate location");
self.lastKnownLocation = location;
if (location.horizontalAccuracy < 500)
{
[self.pushLockForLocation signal];
}
}
当然,我的 CLController 委托(delegate)是同一个类(当应用程序位于前台时位置更新有效)。在我的 plist.file 中,我选中了“远程通知”。
我错过了什么?
感谢您的帮助! :D
最佳答案
这可能与以下事实有关:在 iOS7 中,在后台启用位置服务不会像以前的 iOS 版本那样为您提供无限的后台处理时间。请观看 WWDC 2013 Core Location 的新增功能视频,大约 5 分钟 30。因此,您的应用程序在收到推送通知后大约 30 秒再次暂停。
我也遇到了类似的问题,目前还没有找到解决办法。但是,如果您想到达同一个地方,我会尝试以下操作 -
首先将 NSLog 放入 didReceiveRemoteNotification 中,在设备上运行您的应用程序,将其置于后台并向其发送推送通知。如果您看到 NSLog,您就会知道推送中的内容可用标志设置正确。
接下来在 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 中添加 NSLog。如果得到提示,那么您就知道您确实正在启用位置服务。
如果您到目前为止,您可能遇到了与我相同的问题。 30 秒并不总是足以让位置达到我想要的精度。
顺便说一句,如果您使用的是 iPhone 5 或更高版本,您可以使用延迟定位并保持定位服务持续运行。遗憾的是,我需要它才能在 iPhone 4s 上运行。
更新 - 我现在发现这与后台推送通知和 didReceiveRemoteNotification 特别相关。从标准后台任务启用位置管理器将像 iOS7 之前一样工作。因此,您仍然可以将后台任务与位置管理器一起使用,以每 x 分钟获取您的位置,只是无法使用后台推送来开始整个操作。
关于ios - 在didreceiveremotenotification期间StartUpdateLocation :fetch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19408962/