手表应用程序终止时 WatchConnectivity transferUserInfo 不起作用

WatchConnectivity transferUserInfo not working when watch app terminated

我看了文档,transferUserInfo是一个队列为1的进程,最新的数据一定会到达watch沙箱。

这是 iOS 应用程序上的代码:

-(void)sendViaTransferUserInfo {
    NSDictionary *weatherData = [[NSDictionary alloc] initWithObjectsAndKeys:
                                     self.cityName, @"City",
                                     self.tempCelciusStr, @"Temp",
                                     nil];

    WCSession *session = [WCSession defaultSession];
    [session transferUserInfo:weatherData]; 
}

如果 iOS 应用程序和手表应用程序都处于活动状态,这将一直有效。

但是当我关闭手表应用程序,然后从 iOS 应用程序再次调用此方法,等待几秒钟然后再次打开手表应用程序时,手表委托 didReceiveUserInfo: 没有被完全触发。

我是否正确理解 transferUserInfo: 用法?谁能解释一下为什么 delegate 没有在 watch app 上被调用?

As I read the doc, transferUserInfo is a queued process of 1,

不,可以对多个用户信息传输进行排队,每个信息都将按传送顺序接收。

您描述的是updateApplicationContext。只能将一个上下文排队,最新的上下文将替换之前收到的任何上下文。

and the latest data will surely reach the watch sandbox.

不,传输只有在会话处于活动状态时才会完成。如果会话处于非活动状态,传输将失败并出现错误。

这就是为什么在手表端没有调用委托,因为您的手表应用没有收到任何数据。 phone 方 发送之前传输失败,实际上没有任何内容传输到手表。

如何解决问题:

  • 在传输任何数据之前检查activationState。仅在会话处于活动状态时尝试传输数据。

    Check the value of this property before attempting to transfer data or files using the methods of this object. When the value is WCSessionActivationStateActivated you may initiate the transfer of data and files normally. If it is any other value, do not initiate any transfers.

  • 使用session(_:didFinishUserInfoTransfer:error:)判断是否传输成功

    The session object calls this method when a data transfer initiated by the current app finished, either successfully or unsuccessfully. Use this method to note that the transfer completed or to respond to errors, perhaps by trying to send the data again at a later time.