[免责声明:此问题旨在成为一个维基问题,以回答有关在watchkit
和watch-os
标记下在iOS和观看应用之间发送数据的常见问题。]
我正在开发Apple Watch应用,并希望在iOS
应用及其WatchKit extension
之间发送数据。我查看了WatchConnectivity
框架,但并不是真正了解其所有方法之间的区别。
如果我希望即使我的应用程序在后台也能发送数据,我应该使用哪个功能?
我应该使用哪种功能向手表发送UI更新?
我应该使用哪个功能发送大数据?
答案 0 :(得分:10)
在撰写此答案时(watchOS3
是当前的稳定版本且watchOS4
处于测试版阶段),{{>>直接之间的唯一选择{{1>} 1}} app及其iOS
是WatchConnectivity框架。 (我直接说过,因为这个Q& A并不关心使用WatchKit extension
等云技术从一台设备上传文件到另一台设备并将其下载到另一台设备上。)< / p>
首先,让我们讨论CloudKit
的哪个函数应该用于什么目的。有关代码示例,请向下滚动。
关于每个功能的快速,单线,以及何时使用它们,然后深入细节:
WCSession
:同步应用之间的状态,发送要在UI上显示的数据(仅用于发送小块数据)updateApplicationContext
:在后台发送数据字典transferUserInfo
:在后台发送文件transferFile
:在至少监视应用程序正在前台运行 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