iOS8:退出应用后不久出现蓝色条"正在使用您的位置"

fis*_*ear 38 objective-c core-location ios

我想在后台跟踪时获得蓝色条,但不是时候.

我的应用程序在活动时始终使用位置服务,因此在iOS8中我使用requestWhenInUseAuthorizationon CLLocationManager.通常情况下,应用会在您关闭时停止跟踪您的位置,但用户可以选择让应用跟踪其在后台的位置的选项.因此,我有location对选项UIBackgroundModes中的Info.plist文件.这非常有效:当切换到后台时,应用程序会不断获取位置更新,并显示一个蓝色条,提醒应用程序正在使用位置服务.一切都很完美

但问题是,当用户未选择在后台跟踪时,蓝色条也会出现.在这种情况下,我只需在进入后台时停止AppDelegate的位置更新:

- (void) applicationDidEnterBackground:(UIApplication *)application
{
    if (!trackingInBackground) {
        [theLocationManager stopUpdatingLocation];
    }
}
Run Code Online (Sandbox Code Playgroud)

蓝色条在关闭应用程序后仅显示一秒钟,但它仍然看起来很刺激.

我知道使用requestAlwaysAuthorization而不是requestWhenInUseAuthorization将解决问题,但后来我根本不会得到任何蓝色条,也不会在后台跟踪时实际开启.

我已经尝试过stopUpdatingLocation已经在applicationWillResignActive:方法中,但这没有任何区别.

有没有人知道如何在后台跟踪时获得蓝条,但不是在没有时?

fis*_*ear 15

我们经常向Apple报告事情,有时他们会对此采取行动.正是为了防止问题中描述的蓝条很快出现,Apple CLLocationManager在iOS-9中引入了一个新属性.在您知道在后台需要该位置的那一刻设置它:

theLocationManager.allowsBackgroundLocationUpdates = YES;
Run Code Online (Sandbox Code Playgroud)

或者,以向后兼容的方式:

if ([theLocationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
    [theLocationManager setAllowsBackgroundLocationUpdates:YES];
}
Run Code Online (Sandbox Code Playgroud)

在斯威夫特:

if #available(iOS 9.0, *) {
    theLocationManager.allowsBackgroundLocationUpdates = true 
}
Run Code Online (Sandbox Code Playgroud)

如果未设置此属性,则退出应用时不会显示蓝条,并且您的应用无法使用该用户位置.请注意,在iOS 9中,您必须设置属性才能在后台使用位置.

有关Apple的解释,请参阅WWDC视频.