使用Beacon Ranging更新WatchKit应用程序

时间:2015-07-07 21:32:47

标签: ios swift

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

如何构建应用程序(一般来说,我知道足够的代码,我不一定需要逐行细分,但如果您认为它会自由地执行此操作帮助他人)其中:

  1. 应用用户启动观看应用以检查附近的数据。
  2. 手表应用程序从iOS应用程序请求近/立即信标列表。
  3. iOS应用程序返回符号信标的列表符合此条件的信标的主要字符串。
  4. 最理想的是,iOS应用程序可让Watch App知道该列表何时更改以及WatchKit应用程序是否更新。
  5. 我有一种感觉,我的解决方案的一部分在于DarwinNotification和注册观察者,这不是我之前曾经使用过的很多东西,但是StackOverflow上有足够的例子可以实现它们,如果是案子。我想真正的问题是如何在iOS应用程序尚未启动时收集信标数据。

1 个答案:

答案 0 :(得分:2)

将代码移至=>只能部分解决问题;主要问题在于您的信标没有立即就绪(CLLocationManager是非常多的异步组件),因此实际获取所需信息需要一些时间。

我个人正在研究类似于我的有趣项目 - 它实际上是Watch OS1的视频播放器(没有视频播放器功能),我设法做到了。 因此,WK1的模型非常简单 - 您需要应用程序,您可以选择回复

application:handleWatchKitExtensionRequest

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

所以你认为你可以做的是:

  • 在观看应用中,请求信标数据
  • 在您的应用中,检查您是否有信标数据
  • 如果你有它们,只需将它们呈现在WKInterfaceTable中,或者你这样做
  • 如果不这样做,请求信标,存储回复结束
  • 一旦从beacon接收数据,就像在(3)
  • 中一样调用闭包

可能存在一个问题,即您的应用程序将在您获得所需响应之前终止。在这种情况下,调用以下内容应该处理

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

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

另外,不要忘记您可以将数据保存到NSUserDefaults,或者如果您使用某个数据库,那么。这样,您可以立即向用户显示结果,然后在完成提取后使用新结果刷新结果,但这更像是优化而非完全解决方案。

如果您有任何其他问题或该解决方案存在问题,请询问,我们会弄清楚!祝你好运!

编辑:

在我发布这个答案之后,我实际上偶然发现了this answer,它为您提供了几乎所有需要的东西。但我认为它可能有点过于复杂。无论如何,我只是在这里发布它作为参考,所以你可以使用更多的材料。