我知道,如果一个应用程序使用“的显著变化位置服务”,将iOS的唤醒它,如果有要传递位置更新,即使该应用程序被终止。
我找不到任何有关的情况下一个明确的答案,如果应用程序是使用标准定位服务,并指定位置为UIBackgroundModes的关键:将iOS版也唤醒它为客户提供更新,即使它的终止? 抑或是应用程序需要在后台运行,以获得位置更新回调?
UPDATE:当时我问这个,我没有测试它的时间。 但之后,我得到了一个答案在这里,我写这片我的应用程序的委托代码看看,当它得到一个位置更新我的终止应用程序将被重新启动。 我显示UILocalNotification当我通知了更新。 然而,当我结束我的应用程序,然后在这个城市改变了我的位置,应用程序没有重新启动,我没有得到任何更新。 你能告诉我那是什么,我做错了吗?
更新#2:根据本Q&A的最终调查结果,有没有错代码,它是为那些使用标准定位服务,而不是终止后重新启动应用程序的预期行为。
我已经添加位置作为Info.plist文件中UIBackgroundModes之一。
这是我的应用程序代理的位置相关的部分:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
m_locManager = [[CLLocationManager alloc] init];
m_locManager.delegate = self;
[m_locManager startUpdatingLocation];
return YES;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[m_locManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog("%@", [NSString stringWithFormat:@"Background Fail %@", [error localizedDescription]]);
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
UILocalNotification * theNotification = [[UILocalNotification alloc] init];
theNotification.alertBody = [NSString stringWithFormat:@"Background location %.06f %.06f %@" , newLocation.coordinate.latitude, newLocation.coordinate.longitude, newLocation.timestamp];
theNotification.alertAction = @"Ok";
theNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
[[UIApplication sharedApplication] scheduleLocalNotification:theNotification];
}
是的,它的行为以同样的方式,除了它会更频繁地收到更新(从而消耗更多的电池)。
资料来源: 应用国和多任务下的部分跟踪用户的位置 。
编辑重新阅读后,似乎,程序会从暂停状态被唤醒而不是终止一个。 我不认为你真的需要这种背景模式,虽然。 它是专为那些需要精确的位置信息(如转由turn导航)应用程序。 踩点编程指南关于“基于区域的”编程节。 在您的评论的例子被列为该应用程序的用途之一。
再次编辑按在评论中讨论,最终的解决方案似乎是设置显著位置的变化,直到用户足够接近,然后切换到精确的位置变化(并希望应用程序没有得到在这段时间内终止^^ )
看起来你找到一个可行的解决方案,它似乎像使用显著变化框架会节省一些电池寿命,只要它是你的目的不够准确。 您的解决方案也是有利的,因为它可以让你忙里忙外可能比允许同时监测的20个地区的每个应用程序的限制较多,仅监控那些你是最接近的区域。
我需要类似的功能,但不认为显著变化将是我的应用程序不够准确,所以我周围挖一些,发现以下。
按照位置感知编程指南 “监视基于形状的区域”下:
在iOS中,与应用相关联的区域随时跟踪,当您的应用程序没有运行,包括。 如果在应用程序无法运行的区域越过边界情况下,该应用程序是为重新启动的背景来处理该事件。 类似地,如果事件发生时该应用被暂停时,它被唤醒并给予的时间来处理该事件短量。
而也是在“处理一个区域过境事件”:
每个用户的当前位置,跨过边界区域时,系统会生成你的应用程序适当区域的事件。 如果您的应用程序已经在运行,这些事件直接进入任何当前的位置管理器对象的代表。 如果您的应用程序没有运行,系统将启动在后台,以便它可以回应。 应用程序可以实现以下方法来处理过境通道:
的LocationManager:didEnterRegion:
的LocationManager:didExitRegion:
就我而言,我只是需要火的通知边界被跨越的时候,所以我把我的AppDelegate符合CLLocationManagerDelegate,创造了一个的LocationManager财产,并把这个在我的实现文件:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.locationManager.delegate = self;
return YES;
}
- (CLLocationManager *)locationManager
{
if (!_locationManager) {
_locationManager = [[CLLocationManager alloc] init];
_locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
}
return _locationManager;
}
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = NSLocalizedString(@"You crossed a boundary!", @"user crossed a boundary");
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}
测试表明,这种作品,未经UIBackgroundModes位置关键需要进行设置。 在这个用例中,OS为你处理边界监控,然后发送事件到您的应用程序只是足够长的时间来处理该事件。 这不启动应用程序,它只是运行在后台几秒钟时间来处理边界事件,在此期间,你只能做相关活动。 希望这可以帮助别人,太!
一旦你杀的应用程序,位置更新发送到应用程序
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
您需要通过如下寻找发射键来收集这些委托方法里面的位置更新,
if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
{
//Code to handle the location update
}
希望这是你在找什么。 是的,你需要与价值“的应用程序注册了位置更新”中的plist设置键“要求的底色模式”。
文章来源: Will iOS wake up the terminated app if it's registered with location for UIBackgroundModes?