我正在开发一个使用WCSession
与iPhone通信的watchOS扩展程序。然而,由于没有Apple Watch,我必须依靠Watch Simulator来测试我的代码。
在模拟器中有没有一种测试场景,可以测试手表与手机断开连接的情况?
如果没有,是否有一些关于这种情况下WCSession
行为的文档或经过深入研究的博客文章提供了一些见解?
我正在开发一个使用WCSession
与iPhone通信的watchOS扩展程序。然而,由于没有Apple Watch,我必须依靠Watch Simulator来测试我的代码。
在模拟器中有没有一种测试场景,可以测试手表与手机断开连接的情况?
如果没有,是否有一些关于这种情况下WCSession
行为的文档或经过深入研究的博客文章提供了一些见解?
session.reachable
仍然为true
,并且在sendMessage(...)
的errorHandler
中收到的错误是Code=7001“未知WatchConnectivity错误。”
,底层错误是Code=23“超时”
。当iPhone不在范围内时,您在手表上是否也遇到了这个问题? - fabian789WCError.h
,确实是7007。但通常情况下,当iPhone断开连接时,session.reachable
会变为false
吗? - fabian789此外,WatchKit应用程序与模拟主机设备之间有可靠的连接,因为它们都在模拟器中运行。
苹果在模拟器用户指南的硬件差异部分提到了这一点。
我了解您想要一个测试场景。
但是,您想要测试哪个通信方向?如果检查WCSession
的文档,它始终说明手表和iOS设备的行为。
此外,“断开连接”是什么意思?
您可以检查WCSession.defaultSession().reachable
,但文档说明如下:
在iOS上,当配对的Apple Watch在范围内且相关的Watch应用程序在前台运行时,该值为YES。
您可以检查paired
,但还需要检查watchAppInstalled
。
我认为所有通信都是异步的。您想检查您的errorHandler:
代码吗?
- (void)sendMessageData:(NSData *)data
replyHandler:(void (^)(NSData *replyMessageData))replyHandler
errorHandler:(void (^)(NSError *error))errorHandler
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = _modelController
session.activateSession()
_modelController!.transferArrayToWatchWithSession()
}
func transferArrayToWatchWithSession() {
let session = WCSession.defaultSession()
if WCSession.isSupported() && session.watchAppInstalled {
session.transferUserInfo([kWatchControlsDictKey:self.verifiedWatchArray])
} else {
log.info(....")
}
}
WatchConnectivity
API的表现。 - fabian789在发起 WC 请求之前,您应该使用 if 查询,判断 iPhone 是否可达:
if (WCSession.defaultSession().reachable) {
//do your request here
} else {
//handle non-reachability
}
WCSession.defaultSession().reachable
替换为false
。您可以通过将处于前台状态的应用程序放置在后台状态来模拟isReachable即将为false,方法是按下手表上的其中一个按钮。
它具有与iPhone距离过远而无法连接(超出范围)相同的效果。
参考链接:https://developer.apple.com/documentation/watchconnectivity/wcsession/1615683-isreachable
直到今天,还没有一种直接模拟断开连接的方法,或者我还没有找到,如果您关闭iPhone模拟器以模拟断开连接,则isReachable仍然为true。
只需将要测试的函数放置在委托的sessionReachabilityDidChange(_ session: WCSession)中,并假定它具有相同的效果。