首页 文章

当观看应用程序处于后台时,WCSession不会将消息从iPhone发送到Watch

提问于
浏览
1

我正在开发一个iOS应用程序,它必须使用WCSession向Apple Watch应用程序发送更新 . 它在iOS / Watch模拟器中起着瑕疵的作用,但在真实设备中却没有 .

当我尝试使用 sendMessage:replyHandler:errorHandler: 方法发送消息时,如果Apple Watch应用程序在后台,我会收到以下错误:

[WCSession _onqueue_notifyOfMessageError:messageID:withErrorHandler:] B322D88E-8F50-4BAB-86FF-AFD3B851E1CC errorHandler:NO with 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 吗?

我've also handled the case where the session is not reachable, and I' m在那里用 transferUserInfo: 排队消息,但由于会话被检测为Reachable,因此消息立即发送,因此丢失了 .

1 回答

  • 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];
    }
    

相关问题