我认为我现在已经解决了这个问题。首先,我不得不将新的WCSessionDelegate方法添加到我的iOS应用程序中:
@available(iOS 9.3, *)
func session(session: WCSession, activationDidCompleteWithState activationState: WCSessionActivationState, error: NSError?) {
if activationState == WCSessionActivationState.Activated {
NSLog("Activated")
}
if activationState == WCSessionActivationState.Inactive {
NSLog("Inactive")
}
if activationState == WCSessionActivationState.NotActivated {
NSLog("NotActivated")
}
}
func sessionDidBecomeInactive(session: WCSession) {
NSLog("sessionDidBecomeInactive")
}
func sessionDidDeactivate(session: WCSession) {
NSLog("sessionDidDeactivate")
self.session.activateSession()
}
同样地,我的watchOS应用程序也是如此:
@available(watchOSApplicationExtension 2.2, *)
func session(session: WCSession, activationDidCompleteWithState activationState: WCSessionActivationState, error: NSError?) {
if activationState == WCSessionActivationState.Activated {
NSLog("Activated")
}
if activationState == WCSessionActivationState.Inactive {
NSLog("Inactive")
}
if activationState == WCSessionActivationState.NotActivated {
NSLog("NotActivated")
}
}
但是对我来说,transferUserInfo仍然无法正常工作,特别是当Apple Watch的屏幕关闭时。以下是我在iOS 9.2/watchOS 2.1中在iPhone和Apple Watch之间发送信息的方法:
func tryWatchSendMessage(message: [String : AnyObject]) {
if self.session != nil && self.session.paired && self.session.watchAppInstalled {
self.session.sendMessage(message, replyHandler: nil) { (error) -> Void in
self.session.transferUserInfo(message)
}
}
}
我曾以为当Apple Watch屏幕关闭时,从iPhone发送消息到Watch会导致transferUserInfo无法传输,因为它在sendMessage的错误处理程序中。当Watch屏幕开启时,sendMessage也按预期工作。然而,似乎即使请求失败,sendMessage的错误回复处理程序并不总是被调用,如果您的手表屏幕关闭,这与之前的操作系统版本有不同的行为。这也似乎引起了级联效应,导致后续的消息即使条件适当也失败了。这就是让我相信transferUserInfo有问题的原因。
我发现要可靠地通过我的消息,我需要检查reachable和activationState。由于我还想继续支持早期版本的iOS和watchOS,我的tryWatchSendMessage方法变成了以下内容:
func tryWatchSendMessage(message: [String : AnyObject]) {
if #available(iOS 9.3, *) {
if self.session != nil && self.session.paired && self.session.watchAppInstalled && self.session.activationState == .Activated {
if self.session.reachable == true {
self.session.sendMessage(message, replyHandler: nil) { (error) -> Void in
self.session.transferUserInfo(message)
}
} else {
self.session.transferUserInfo(message)
}
}
} else {
if self.session != nil && self.session.paired && self.session.watchAppInstalled {
if self.session.reachable == true {
self.session.sendMessage(message, replyHandler: nil) { (error) -> Void in
self.session.transferUserInfo(message)
}
} else {
self.session.transferUserInfo(message)
}
}
}
}
对这些更改进行的修改似乎已经解决了我所看到的问题。我很想知道这些更改是否有助于解决其他人的问题,或者与transferUserInfo不起作用还存在相关问题。
transferCurrentComplicationUserInfo:
似乎无法成功地将userInfo有效载荷传输到手表。直到我重新启动手表,事情才开始正常工作。 - ospr