【问题标题】:iOS9 not tracking location while in backgroundiOS9在后台不跟踪位置
【发布时间】:2015-12-21 20:47:25
【问题描述】:

我的应用程序在后台跟踪位置...位置背景模式已启用,我使用

[self.locationManager startUpdatingLocation];

这在 iOS7-8 上运行良好,但在 iOS9 上停止运行

在模拟器中它可以工作,但在真实设备上我在后台没有回调...在 iOS8 设备上运行相同的代码时,我会像以前一样得到正常的回调

这有记录吗?为什么它在模拟器中而不是在设备中工作?这是一个错误吗?

在iOS9上使用startSignificantChangeUpdates时,我想知道这是否是某种省电功能,他们可能禁止startUpdatingLocation

【问题讨论】:

标签: ios cocoa-touch gps cllocationmanager


【解决方案1】:

用途:

if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
    [self.locationManager setAllowsBackgroundLocationUpdates:YES];
}

避免使用评估系统版本的宏。这将在 iOS 9 上调用 setAllowsBackgroundLocationUpdates:,但在 iOS 8 上不调用。

【讨论】:

  • 这节省了我的周末 :) 奇怪的是在模拟器中它可以正常工作
【解决方案2】:

请使用以下参考在 ios 9 中定位

allowsBackgroundLocationUpdates in CLLocationManager in iOS9

WWDC 会议“核心位置的新功能”中解释了这个新属性。

如果您链接到 iOS 9,则默认值为 NO。

如果您的应用在后台使用位置(不显示蓝色状态栏),除了在 Info.plist 中设置后台模式功能外,您还必须将 allowBackgroundLocationUpdates 设置为 YES。否则位置更新仅在前台传递。优点是您现在可以在同一应用程序中拥有具有后台位置更新的位置管理器和仅具有前台位置更新的其他位置管理器。您还可以将该值重置为 NO 以更改行为。

文档很清楚:

默认情况下,对于链接到 iOS 9.0 或更高版本的应用程序,无论最小部署目标如何,这都是 NO。

将 UIBackgroundModes 设置为在 Info.plist 中包含“位置”,您还必须在运行时将此属性设置为 YES,无论何时调用 -startUpdatingLocation 以在后台继续。

当 UIBackgroundModes 不包含“位置”时将此属性设置为 YES 是一个致命错误。

将此属性重置为 NO 相当于从 UIBackgroundModes 值中省略“位置”。只要应用程序正在运行(即未挂起)并具有足够的授权(即它具有WhenInUse 授权并且正在使用中,或者它具有Always 授权),仍然允许访问位置。但是,该应用仍将遵守通常的任务暂停规则。

有关可能的授权值的更多详细信息,请参阅 -requestWhenInUseAuthorization 和 -requestAlwaysAuthorization。

谢谢

【讨论】:

  • 请注意,如果您在低于 9.0 的系统版本中包含此属性,您的程序将会崩溃。您将看到: [CLLocationManager setAllowsBackgroundLocationUpdates:]:发送到实例的无法识别的选择器。请参阅我的答案以管理此问题。
  • Xcode 7 将此建议更改为: if #available(iOS 9.0, *) { self.locationManager.allowsBackgroundLocationUpdates = true } else { // 回退到早期版本 }
【解决方案3】:

我有同样的问题,你需要添加这样的东西:

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){

    [self.locationManager setAllowsBackgroundLocationUpdates:YES];

}

我检查系统版本的宏是这样的:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

以下论坛帖子帮助了我:

https://forums.developer.apple.com/thread/6895

【讨论】:

    【解决方案4】:

    新方法是 locationManager -> requestLocation() 见https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/ 还添加了allowBackgroundLocationUpdates(仅适用于iOS9)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 2017-04-13
      • 2013-07-02
      • 2017-11-24
      • 2020-08-04
      • 2021-09-14
      相关资源
      最近更新 更多