ios - 使用信标测距更新 WatchKit 应用程序

标签 ios swift

我正在努力创建一个基于 Swift 的 iOS 应用程序,它包含 iBeacons 以向 WatchKit (OS 1) 应用程序提供数据。该应用根据信标 CLProximity 设置为 .Near 还是 .Immediate 将数据从 JSON 加载到 tableView。 iOS 应用程序在启动时能够毫无问题地检测到信标,填充变量,并将其提供给 WatchKit 应用程序。但是,当 WatchKit 应用程序尝试使用 application:handleWatchKitExtensionRequest 从应用程序请求返回信标数据时,iOS 尚未首先启动,信标对象返回为 nil。我的假设是,当应用程序在手机上关闭时,用于打开父应用程序的 WatchKit 调用不会触发存储在 AppDelegate 中的信标测距代码。将信标初始化代码移动到 application:handleWatchKitExtensionRequest 中并不能解决问题。

如何构建应用程序(一般来说,我知道足够多的代码,我不一定需要逐行分解,但如果你认为这对其他人有帮助,你可以自由地这样做)在哪里:

  1. 应用用户启动 watch 应用以检查附近的数据。
  2. watch 应用程序从 iOS 应用程序请求附近/即时信标列表。
  3. iOS 应用返回符合此条件的信标的信标主要字符串列表。
  4. 最理想的情况是,iOS 应用让 Watch 应用知道该列表何时更改以及 WatchKit 应用何时更新。

我觉得我的部分解决方案在于 DarwinNotification 和注册观察者,这不是我以前经常使用的东西,但 StackOverflow 上有足够的示例,如果是这样的话,我可以实现它们.我想真正的问题是在 iOS 应用程序尚未启动时如何收集信标数据。

最佳答案

将代码移动到 application:handleWatchKitExtensionRequest 只能部分解决问题;主要问题在于您的信标没有立即准备好(CLLocationManager 是非常异步的组件),因此需要一些时间才能真正获得您需要的信息。

我个人正在从事与我的有趣项目类似的项目 - 它实际上是 Watch OS1 的视频播放器(没有视频播放器功能),我设法做到了。 所以 WK1 的模型非常简单 - 你请求应用程序,你可以选择回复

  func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!)

现在关于它的有趣部分以及我实际最终使用的是您不必在该方法中调用 reply(),您可以在某些事件完成后等待回复。在我的例子中,这是将视频的所有帧异步地放入某个 X 秒缓冲区,然后在视频处理结束后发回“是的,我现在准备好加载它们”。

所以我认为您可以执行以下操作:

  • 在 watch 应用中,请求信标数据
  • 在您的应用中,检查您是否有信标数据
  • 如果你有它们,只需将它们呈现在 WKInterfaceTable 中,或者你这样做
  • 如果不这样做,请求信标,商店回复关闭
  • 从信标接收到数据后,按照与 (3) 相同的方式调用闭包

可能存在一个问题,那就是您的应用程序将在您获得所需响应之前终止。在这种情况下,调用 following 应该会解决这个问题

UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({})

detail here 解释了如何使用后台任务的正确方法,所以我只是为您提供链接。

此外,不要忘记您可以将数据保存到 NSUserDefaults,或者如果您使用某些数据库,也可以将数据保存到那里。通过这种方式,您可以立即向用户展示结果,然后在获取完成后用新结果刷新它们,但这更像是优化而不是完整的解决方案。

如果您有任何其他问题或该解决方案有问题,请尽管提出,我们会解决! :) 祝你好运!

编辑:

在我发布这个答案之后,我实际上偶然发现了 this answer ,它为您提供了几乎所有您需要的东西。但我认为这可能有点过于复杂。不管怎样,我只是将它张贴在这里供您引用,这样您就可以使用更多的 Material 了。

关于ios - 使用信标测距更新 WatchKit 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31279676/

相关文章:

ios - 如何以编程方式搜索App Store并返回App信息

javascript - 使用 JavaScript 检测低于 5 的 iOS 版本

ios - 如何在运行时更改渐变层的框架?

Xcode Swift : How to stop variables from changing back after each viewDidLoad, 如何保存和更新来自不同 ViewController 的数据?

ios - 解析没有有效凭据的登录过程

ios - 如何在 SceneKit Editor 中使用 Action

swift - UITableView 自定义类不显示结果

swift - tintedImageProvider 在图形复杂功能中不提供色调颜色

ios - 将非常大尺寸的图像缩小为非常小的图像,而不会失真和质量损失

ios - 空字符串使 Swift 有条件地崩溃