我希望在背景中跟踪时获得蓝色条,但不希望在背景中跟踪时获得蓝色条.

我的应用在激活时一直使用位置服务,所以在iOS8中,我使用CLLocationManager上的requestWhenInUseAuthorization.通常,当你关闭应用程序时,它会停止跟踪你的位置,但用户也可以 Select 让应用程序在后台跟踪他的位置.因此,我在信息中有UIBackgroundModeslocation选项.plist文件.这非常有效:当切换到后台时,应用程序会不断获得位置更新,并且会出现一个蓝色条,提醒应用程序正在使用位置服务.一切都很完美.

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

- (void) applicationDidEnterBackground:(UIApplication *)application
{
    if (!trackingInBackground) {
        [theLocationManager stopUpdatingLocation];
    }
}

在关闭应用程序后,蓝色条只会显示一秒钟,但它看起来仍然很烦人.

我知道用requestAlwaysAuthorization而不是requestWhenInUseAuthorization可以解决这个问题,但这样我就不会得到任何蓝色条,也不会在背景跟踪实际打开时得到任何蓝色条.

我已经在applicationWillResignActive:法中try 了stopUpdatingLocation,但这没有什么区别.

有人知道在背景中跟踪时如何获得蓝色条,但不知道在背景中跟踪时如何获得蓝色条吗?

推荐答案

我们经常向苹果公司汇报情况,有时他们会采取实际行动.正是为了防止蓝条像问题中描述的那样在短时间内出现,苹果在iOS-9的CLLocationManager上引入了一个新属性.在您知道需要背景中的位置时进行设置:

theLocationManager.allowsBackgroundLocationUpdates = YES;

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

if ([theLocationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
    [theLocationManager setAllowsBackgroundLocationUpdates:YES];
}

Swift :

if #available(iOS 9.0, *) {
    theLocationManager.allowsBackgroundLocationUpdates = true 
}

如果未设置此属性,则退出应用程序时不会出现蓝色条,并且应用程序无法使用用户位置.

苹果的解释见the WWDC video.

Objective-c相关问答推荐

覆盖@property setter 和无限循环

Objective C 布尔数组

如何从 Appdelegate 显示 UIAlertController

如何将 NSMutableArray 中的字符串按字母顺序排序?

indexOfObject 对比indexOfObjectIdenticalTo

具有匿名函数/块的 NSTimer?

iOS 中 textField 上的Electron邮件验证

如何以编程方式退出 mac 应用程序?

Objective-C:如何从子类访问父属性?

奇怪的错误 NSAssert

声音在 iPhone 模拟器中不起作用?

'supportedInterfaceOrientations' 实现中的返回类型冲突: - 警告

使用 OpenCV 在 iOS 中进行透视变换 + 裁剪

在字符串Objective-c中连接字符串

在 Objective-C 中,你在哪里声明一个常量?

自定义 colored颜色 我的 UIActivityIndi​​catorView

检测平移手势结束

从带有参数的方法名称创建 Select 器

请求访问相机胶卷的权限

使用 cocoaLumberjack 将日志(log)文件存储在哪里