从 Apple Watch 复杂功能获取核心位置数据的最佳方式?

Posted

技术标签:

【中文标题】从 Apple Watch 复杂功能获取核心位置数据的最佳方式?【英文标题】:Best way to get Core Location data from an Apple Watch Complication? 【发布时间】:2018-10-16 21:55:43 【问题描述】:

从复杂度中算出用户的经纬度的规定方法是什么?

我尝试在复杂控制器中实例化一个位置管理器,并使用 requestLocation 和 startUpdatingLocation 请求位置。两者均未响应更新。

我正在使用 watchOS 4.0 和 ios 9.3。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

几个要点:

    不要在您的复杂控制器中进行任何计算或异步请求,您将很快耗尽一天的复杂更新预算,而且操作系统会在几秒钟后暂停该进程。

    您可以在前台(无限制)或后台使用扩展委托中的核心位置。如果您想在后台使用它,您需要在 WatchKit 扩展的 Info.plist 中将 UIBackgroundModes 设置为 location 并将您的位置管理器的 allowBackgroundLocationUpdates 属性设置为 true。当您不需要不断更新位置时,不要忘记将其设置为 false。例如,如果您需要在后台请求一次位置,请在收到位置修复后关闭该属性。

    您只能在一天中多次更新您的并发症(Apple 没有公布确切的数字)。您可以期望每小时至少更新 4-6 次,可能更多,但绝对不是每分钟。这样您就可以忘记显示任何有关您的并发症的实时数据。

【讨论】:

谢谢。我现在让我的复杂功能正常工作,每半小时获取一次数据。我确实有些担心我做得不好。为了更新我的位置,我安排了一个后台应用刷新事件。然后我调用“requestLocation”,它不会进行持续更新。它只运行一次。当它返回一个位置时,我使用纬度/经度调用苹果的地理编码器服务。当它返回时,我再次使用 lat/lon 调用另一个端点。问题是,为了使用 Apple 的地理编码器服务,我不能在后台运行 NSURLSession。 (续...) 所以我没有按照 Apple 的规定在应用程序刷新中执行 BackgroundURLRefresh。相反,我获取了一个共享数据管理器,并从 handleBackgroundTasks 函数内部将后台任务传递给它。然后我使用 requestLocation 开始调用链。一旦链完成,我调用 [backgroundTask setTaskCompletedWithSnapshot:YES] 来释放对后台的控制。但这似乎是错误的做法。一方面,我不确定 backgroundTask 对象在另一个类中的持久性(我将其作为非原子的、强的)。有什么建议吗? 嗯,这不一定是错误的方式,根据我的经验,后台处理程序中的数据任务比后台 URL 获取会话更可靠和可预测。但是,对于所有背景内容,包括获取位置和两个 URL 请求,您仍然受到 15 秒挂钟时间的限制,因此,如果您的连接不良,您的进程可能会在请求中间被终止,并且请求永远不会完成。 我不会担心将引用传递给后台任务,只要您在完成后处理该引用。 我有一个类似的工作流程,但我在接收到位置后发出一个 URL 请求而不是两个,所以一旦我检索到位置,我就会将控制权传递给后台 URL 会话,因此即使连接不良也能正常工作.但是,我建议不要使用链接请求来执行此操作,因为如果您开始链接它们,后台 URL 会话会引入人为延迟(以防止它被用作将您的应用程序保持在后台的解决方法)。您将需要使用自己的服务器并将所有工作整合到一个请求中。【参考方案2】:

复杂功能本身只是用户界面的一个显示项目。任何需要的处理都必须在 WKExtensionDelegate 中使用 WKRefreshBackgroundTask 进行处理。阅读背景模式。

【讨论】:

以上是关于从 Apple Watch 复杂功能获取核心位置数据的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

自定义时复杂功能会冻结 Apple Watch

为 Apple Watch 复杂功能设置 tintColor

为啥我的 Apple Watch 复杂功能不显示任何内容?

为啥我的 iPhone 无法从 Apple Watch 获取心率数据,但手表扩展程序却可以?

为啥我的 iPhone 无法从 Apple Watch 获取心率数据,但手表扩展程序却可以?

将 GraphicCircular Apple Watch 复杂功能添加到现有 Xcode 项目