我正在开发一个iOS应用程序,该应用程序必须使用WCSession将更新发送到Apple Watch应用程序。在iOS / Watch模拟器中,它工作得很完美,但在实际设备中却没有。
当我尝试使用sendMessage:replyHandler:errorHandler:
方法发送消息时,如果Apple Watch应用程序处于后台,则会出现以下错误:
[WCSession _onqueue_notifyOfMessageError:messageID:withErrorHandler:] B322D88E-8F50-4BAB-86FF-AFD3B851E1CC errorHandler:否与WCErrorCodeMessageReplyFailed-> WCErrorCodeNotReachable
但是在我的代码中,我添加了各种检查:
if (_session &&
_session.isPaired &&
_session.isWatchAppInstalled &&
_session.isReachable &&
_session.activationState == WCSessionActivationStateActivated)
{
[_session sendMessage:dictionary
replyHandler:nil
errorHandler:^(NSError * _Nonnull error) {
NSLog(@"%@",error);
}
];
}
else
{
[_session transferUserInfo:dictionary];
}
发送消息时,为什么我会收到“ Not Reachable”错误消息,但是session.isReachable
返回true
是什么原因吗?
我还处理了会话无法访问的情况,并且在其中将消息transferUserInfo:
放入队列,但是由于检测到该会话为“可到达”,因此该消息会立即发送并因此丢失
答案 0 :(得分:0)
您是否还编写了sendMessage选择器的错误处理程序参数? 在该处,您还可以检查尝试发送消息时WCSession引发的错误类型,并且根据应用逻辑,还可以将消息数据重新发送为ApplicationContext / UserInfo / FileTransfer。 当我收到以下错误代码时,通常会再次将消息数据作为userInfo发送: WCErrorCodeNotReachable, WCErrorCodeDeliveryFailed, WCErrorCodePayloadTooLarge, WCErrorCodeTransferTimedOut
尽管在您的情况下,sendMessage选择器可能是这样的:
if (YES == self.session.isReachable) {
__weak typeof(self) weakSelf = self;
[self.session sendMessage:dictionary
replyHandler:nil
errorHandler:^(NSError * _Nonnull error) {
switch (error.code) {
case WCErrorCodeNotReachable:
case WCErrorCodeDeliveryFailed:
case WCErrorCodePayloadTooLarge:
case WCErrorCodeTransferTimedOut:
[weakSelf.session sendUserInfo:dictionary];
break;
default:
NSLog(@"Unrecoverable WCSession transfer error: %@", error);
break;
}
}];
} else {
[self.session sendUserInfo:dictionary];
}