3

看了文档,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:了用法?谁能解释为什么没有在手表应用程序上调用代表?

4

1 回答 1

3

当我阅读文档时, transferUserInfo 是 1 的排队进程,

不,它可以将多个用户信息传输排队,并且每个都将按照交付的顺序接收。

你所描述的是updateApplicationContext。只有一个上下文可以排队,并且最近的上下文替换任何先前收到的上下文。

最新的数据一定会到达手表沙箱。

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

这就是为什么在手表端没有调用代理的原因,因为您的手表应用程序没有收到任何数据。发送前在手机端传输失败,实际上没有传输到手表。

如何解决问题:

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

    在尝试使用此对象的方法传输数据或文件之前检查此属性的值。当值为 时,WCSessionActivationStateActivated您可以正常启动数据和文件的传输。如果它是任何其他值,则不要启动任何传输。

  • 用于session(_:didFinishUserInfoTransfer:error:)确定传输是否成功。

    当当前应用程序发起的数据传输成功或失败时,会话对象调用此方法。使用此方法来记录传输已完成或响应错误,可能通过稍后尝试再次发送数据。

于 2016-08-19T07:13:07.170 回答