iOS应用和WatchKit扩展之间的数据同步

当我们与合作伙伴一起获得Apple Watch支持时,我认为我会分享一些有关Apple Watch开发的技巧。

它是如何工作的?

将WatchKit应用程序目标添加到现有项目时,Xcode会创建2个目录:WatchKit扩展名和WatchKit应用程序。 WatchKit扩展程序可以在iPhone上运行,但可以在与iOS应用程序不同的沙箱中运行。 WatchKit应用程序仅包含情节提要和资源。 数据通过蓝牙低功耗在WatchKit应用程序和WatchKit扩展之间进行同步,因此,避免在这两个目标之间发送大量数据是一个好习惯。

如何同步您的数据?

在WatchKit扩展程序和运行在iPhone上的iOS应用之间可以通过多种方式发送数据。 在尝试了NSKeyedUnarchiver和NSUserDefaults之后,我遇到了一个很好的开源库,名为MMWormhole,由MutualMobile的人员开发。 它基本上使用NSKeyedArchiver将数据写入文件,然后将文件写入应用程序的共享App Group。 它还使您可以将对象注册为侦听器,以便在传递新消息时得到通知。

让我们尝试一下吧!

我创建了一个名为Contacts的简单应用程序,该应用程序可让您在iPhone上浏览,添加和显示联系人的详细信息。 每次用户进入联系人详细信息视图时,相应的联系人详细信息都会显示在AppleWatch上。

考虑到您必须是Apple Developer程序的成员才能运行和测试Xcode中的演示项目。 这是有关如何配置您的应用程序以支持应用程序组的简短指南。

因此,我们只想发送Contact对象。 联系人模型如下所示:

由于MMWormhole使用NSKeyedArchiver编码对象,使用NSKeyedUnarchiver解码,
我们的Contact类必须符合NSCoding协议,因此我们需要重写以下两种方法:

同样,我们需要指定Contact对象用来编码或解码其实例变量的唯一键。

为此,我们需要在尝试通过蠕虫孔发送消息之前放入以下代码行

在我们尝试从虫洞读取消息之前

否则,我们将收到以下错误:

就是这样。 现在,我们准备使用MMWormhole传递自定义类对象。

我创建了一个WatchKitDataManager类,负责在iOS应用和WatchKit扩展之间发送和读取消息。

就这么简单!

MMWormhole库的另一个重要功能是能够将对象注册为新消息的侦听器,因此我们可以非常轻松地更新UI。 这样做的方法如下:

现在,当我们同时运行我们的iOS和WatchKit应用程序时,我们可以看到,每次用户在相应的iOS应用程序上输入联系人详细信息视图时,Apple Watch上的联系人详细信息都会更新。

如果您有任何疑问,请随时通过mateusz.nadolski@tooploox与我联系。 您可以在此处在Github上查看源代码。