如何使用WatchConnectivity在iOS和Watch应用程序之间共享信息?

时间:2017-08-03 15:49:00

标签: ios swift watchkit apple-watch watchconnectivity

[免责声明:此问题旨在成为一个维基问题,以回答有关在watchkitwatch-os标记下在iOS和观看应用之间发送数据的常见问题。]

我正在开发Apple Watch应用,并希望在iOS应用及其WatchKit extension之间发送数据。我查看了WatchConnectivity框架,但并不是真正了解其所有方法之间的区别。

如果我希望即使我的应用程序在后台也能发送数据,我应该使用哪个功能?

我应该使用哪种功能向手表发送UI更新?

我应该使用哪个功能发送大数据?

1 个答案:

答案 0 :(得分:10)

在撰写此答案时(watchOS3是当前的稳定版本且watchOS4处于测试版阶段),{{>>直接之间的唯一选择{{1>} 1}} app及其iOSWatchConnectivity框架。 (我直接说过,因为这个Q&amp; A并不关心使用WatchKit extension等云技术从一台设备上传文件到另一台设备并将其下载到另一台设备上。)< / p>

首先,让我们讨论CloudKit的哪个函数应该用于什么目的。有关代码示例,请向下滚动。

关于每个功能的快速,单线,以及何时使用它们,然后深入细节:

  • WCSession:同步应用之间的状态,发送要在UI上显示的数据(仅用于发送小块数据)
  • updateApplicationContext:在后台发送数据字典
  • transferUserInfo:在后台发送文件
  • transferFile:在至少监视应用程序正在前台运行
  • 之间发送即时消息

详细说明

如果要同步应用程序(例如保持UI更新或发送状态信息,如用户登录等),则应使用

updateApplicationContext(_:)。您可以发送数据字典。对此函数的后续调用将替换先前发送的字典,因此对应应用程序仅接收使用sendMessage发送的最后一项。系统尝试在适当的时间调用此功能,以便在需要时接收数据,同时最大限度地降低功耗。因此,当应用程序在前台运行时,可以调用该函数,但需要激活updateApplicationContext才能使传输成功。尝试使用WCSession传输大量数据的频繁调用可能会失败,因此对于此使用情况,请调用updateApplicationContext

如果您想在后台发送需要其他应用程序接收的数据,则应使用

transferUserInfo(:) transferCurrentComplicationUserInfo( :)。对此方法的后续调用将排队,并且将接收从一个应用程序发送到另一个应用程序的所有信息。可能会使用transferUserInfo使用高优先级消息向transferCurrentComplicationUserInfo发送与并发症相关的数据,并在需要时唤醒WatchKit extension。但是,请注意,此函数具有每日限制,一旦超出,则使用WatchKit app函数传输数据。

transferFile(_:metadata:)在实现和性质上与transferUserInfo类似,但它接受fileURL而不是字典作为其输入参数,因此它应该用于将设备本地的文件发送到其对应的。后续呼叫排队。接收的文件必须保存到transferUserInfo方法中的新位置,否则将被删除。

sendMessage(:replyHandler:errorHandler:) sendMessageData( :replyHandler:errorHandler:)立即将数据发送到对方应用。在调用此方法之前,必须可以访问对应的应用程序。 iOS应用程序始终被认为是可访问的,并且从您的Watch应用程序调用此方法会根据需要在后台唤醒iOS应用程序。 Watch应用程序仅在安装并运行时才被视为可访问。必须在前台启动传输。对此方法的后续调用已排队。

有关详细信息,请参阅App programming guide for watchOS - Sharing Data

现在有一些代码示例:

session(_:didReceive:)应用WatchConnectivity中设置iOS

AppDelegate

让您的import UIKit import WatchConnectivity @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { if WCSession.isSupported() { let session = WCSession.default() session.delegate = self session.activate() } return true } } extension AppDelegate: WCSessionDelegate { func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { print("Message received: ",message) } //below 3 functions are needed to be able to connect to several Watches func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {} func sessionDidDeactivate(_ session: WCSession) {} func sessionDidBecomeInactive(_ session: WCSession) {} } 课程符合WatchKit

WCSessionDelegate

使用即时消息功能extension InterfaceController: WCSessionDelegate { func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {} }

如果您想立即向sendMessage应用发送信息,请WatchKit app使用此代码。

iOS