当手表应用程序处于后台状态时,WCSession无法从iPhone发送消息以观看手表

时间:2018-06-25 21:44:24

标签: objective-c watchconnectivity

我正在开发一个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:放入队列,但是由于检测到该会话为“可到达”,因此该消息会立即发送并因此丢失

1 个答案:

答案 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];
}