⌚️ WatchSync
带有类型消息、更好的错误处理和简化订阅 API 的 WatchConnectivity 包装器。
示例
发送消息
创建一个遵循 SyncableMessage
协议的新消息类型。在内部使用 Codable
。
import WatchSync
struct MyMessage: SyncableMessage {
var myString: String?
var myDate: Date?
}
你可以从 iOS 或 watchOS 应用中的任何地方发送消息。
let myMessage = MyMessage(myString: "Test", myDate: Date())
WatchSync.shared.sendMessage(myMessage) { result in
}
你也可以发送一个简单的字典。
WatchSync.shared.sendMessage(["test": "message"]) { result in
}
订阅新消息
监听来自配对设备(iOS 或 watchOS)的更改
class ViewController: UIViewController {
var subscriptionToken: SubscriptionToken?
override func viewDidLoad() {
super.viewDidLoad()
subscriptionToken = WatchSync.shared.subscribeToMessages(ofType: MyMessage.self) { myMessage in
print(String(describing: myMessage.myString), String(describing: myMessage.myDate))
}
}
}
更新应用程序上下文
WatchSync.shared.update(applicationContext: ["test": "context"]) { result in
}
订阅应用程序上下文更新
appDelegateObserver =
class ViewController: UIViewController {
var subscriptionToken: SubscriptionToken?
override func viewDidLoad() {
super.viewDidLoad()
subscriptionToken = WatchSync.shared.subscribeToApplicationContext { applicationContext in
print(applicationContext)
}
}
}
如何工作
- 如果已配对的设备可达,
WatchSync
将尝试使用session.sendMessage()
通过交互式消息发送。 - 如果已配对的设备不可达,它将回退到使用
sendUserInfo()
。 - 所有符合
SyncableMessage
的消息都将被 JSON 序列化以减少有效负载大小。这是为了减少遇到WCErrorCodePayloadTooLarge
错误的可能性。 - 对于交互式消息,它使用
replyHandler
用于交付确认。
安装 & 设置
在您的 AppDelegate
(iOS) 和 ExtensionDelegate
(watchOS) 的 applicationDidFinishLaunching
下,您需要激活 Watch Connectivity 会话。
WatchSync.shared.activateSession { error in
if let error = error {
print("Error activating session \(error.localizedDescription)")
return
}
print("Activated")
}
错误处理
sendMessage
方法返回一个闭包,其中包含一个用于切换以减少可能状态的数量以及错误的链接,您的应用可能最终会遇到。
WatchSync.shared.sendMessage(myMessage) { result in
switch result {
case .failure(let failure):
switch failure {
case .sessionNotActivated:
break
case .watchConnectivityNotAvailable:
break
case .unableToSerializeMessageAsJSON(let error):
break
case .watchAppNotPaired:
break
case .watchAppNotInstalled:
break
case .unhandledError(let error):
break
case .badPayloadError(let error):
break
case failedToDeliver(let error):
break
}
case .sent:
break
case .delivered:
break
}
}