【问题标题】:iBeacon ranging in backgroundiBeacon 在后台测距
【发布时间】:2015-09-09 11:19:56
【问题描述】:

我发现 iBeacon 测距在 iOS 8.X 和 iOS 9 beta 上的工作方式存在巨大差异。

在 iOS 8.X 上,我可以在后台对信标进行测距(当应用程序在后台并且屏幕关闭时,测距继续工作),但在 iOS 9 上,一旦应用程序进入后台,它就会停止,转动屏幕打开和关闭,将恢复测距几秒钟,然后再次停止。

有没有其他人遇到过这种情况?如果是这样,您是否找到了适用于 iOS 9 的解决方案?

【问题讨论】:

  • 您在 iOS 8.x 上看到后台测距工作多久了?除非您采取特殊措施来扩展它,否则在应用程序转换到后台后,后台测距不应超过 10 秒。 developer.radiusnetworks.com/2014/11/13/…
  • 我能够让它工作几个小时

标签: ios location ibeacon


【解决方案1】:

好的, 在我用来定位信标的 CLLocationManager 上设置 allowsBackgroundLocationUpdates = YES 似乎可以解决这个问题,并且我可以像以前一样继续在后台定位信标。

【讨论】:

  • 如果您想将您的应用提交到 AppStore,请注意该设置,因为除非您能说服审阅者您已经创建了导航应用,否则它不会被批准。
  • 是的,它不应该被轻易使用,但在我们的例子中,它是应用程序运行所必需的。我希望如果他们批准了 iOS 8 上的应用程序,他们也会为 iOS 9 做同样的事情。
【解决方案2】:

如果您使用 ios 9 或更高版本,您应该添加所有请求位置声明 仍然允许访问位置 每当应用程序正在运行(即未挂起),并且有 足够的授权(即它有WhenInUse授权并且在 使用,或者它具有始终授权)。

[self.locationManager requestAlwaysAuthorization];
[self.locationManager requestWhenInUseAuthorization];

现在要允许后台模式,您需要添加此链接 self.locationManager.allowsBackgroundLocationUpdates = YES;

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

对于UIBackgroundModes set to include "location" in Info.plist,当 UIBackgroundModes 不包含“位置”是致命错误时,您必须将此属性设置为 YES

将此属性重置为 NO 相当于从 UIBackgroundModes 值。

【讨论】:

    【解决方案3】:

    我从here 复制了 Gualtier 的回复 Personnaly 我发现它非常有帮助,有一个清晰的解释!希望对您有所帮助

    无论哪种情况都将开始位置更新。改变的是,当应用程序在前台(并且设置了“位置”UIBackgroundMode)时调用 startUpdatingLocation 时,系统会为您的应用程序保存一个后台任务断言;这意味着只要位置更新正在运行,您的应用就不会暂停。

    如果您的应用在后台中调用 startUpdatingLocation,CoreLocation 仍会通过启动您的应用的位置更新来响应,但系统将不再为您保留断言,并且您的一旦在后台花费了允许的时间,应用将暂停。该文档在技术上是正确的 - 您可以从任一状态开始位置更新 - 保持活动而不被暂停是另一回事。

    这个时间(目前)是 10 秒,这就是您认为更新在 10 秒后停止的原因。但实际上您的应用现在已暂停,无法再接收更新。有一种方法可以通过使用 beginBackgroundTaskWithExpirationHandler 将此持续时间延长至(当前)最多 3 分钟:(在此处阅读更多信息:https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW1

    这个延长的时间是否足够取决于你的应用。

    如果您尝试等到稍后再开始位置更新的目标是省电,那么还有其他方法。 - 如果它适合您的用例,显着位置更改服务非常有效,并且更适合与标准位置服务结合使用 - 您可以在您的应用处于前台时开始位置更新,并在您的应用处于后台时推迟位置更新。当您的应用程序跟踪将有开始和结束的旅程时,在旅程期间运行位置更新,同时推迟更新可能适合您的情况。 当更新被推迟时,系统会在它认为这样做是省电的时候唤醒你的应用程序。你可以在这里阅读更多信息:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW14

    另外,我建议您观看 WWDC 2015 演示文稿“核心位置的新功能”了解 iOS 9 中的新功能。有一种新方法可以轻松获取当前位置,这可能感兴趣,还有一个额外的步骤可以让后台位置更新工作。视频在这里:https://developer.apple.com/videos/wwdc/2015/?id=714

    【讨论】:

    • 这很有趣,但对 iBeacon 测距并没有太大帮助,因为它依赖于区域监控 API,而不是位置更新。
    【解决方案4】:

    对于后台执行,只需使用UIBackgroundTaskIdentifier,您的代码也将在后台运行。

    查看我的答案iBeacon ranging in the background

    【讨论】:

    • 您的解决方案仅在后台运行几秒钟,这很好,但对于我的目的来说还不够好,allowBackgroundLocationUpdates 设置为 YES,应用程序将永远在后台运行,附近的信标
    猜你喜欢
    • 2014-01-27
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多