如何测试 Apple Watch 未连接到 iPhone 的场景
How to Test Scenario Where the Apple Watch Is Not Connected to an iPhone
我正在开发 watchOS 扩展,它使用 WCSession
与 iPhone 进行通信。但是,我没有 Apple Watch,因此必须依靠 Watch Simulator 来测试我的代码。
有没有办法在模拟器中测试手表与phone断开连接的场景?
如果不是,是否有一些文档或经过充分研究的博客 post 可以深入了解 WCSession
在这种情况下的行为?
退出 iPhone 模拟器应该可以让您大致了解这种情况。
我认为这不可能,因为 Apple 文档说,
Additionally, WatchKit apps have a reliable connection to the
simulated host device because they both are running in the Simulator.
Apple 在 Simulator User Guide
的硬件差异部分提到了这一点
您应该使用 if 查询,在开始 WC 请求之前 iPhone 是否可达:
if (WCSession.defaultSession().reachable) {
//do your request here
} else {
//handle non-reachability
}
如果您想测试您的应用对无法访问的反应,只需将 WCSession.defaultSession().reachable
替换为 false
。
我了解到您确实想要一个测试场景。
但是你想测试哪个通信方向?如果您查看 WCSession
的文档,它总是说明手表和 iOS 设备的行为。
另外,'disconnected'是什么意思?
您可以检查 WCSession.defaultSession().reachable
,但文档说明
On iOS, the value is YES when the paired Apple Watch is in range and
the associated Watch app is running in the foreground.
您可以检查 paired
,但您还需要检查 watchAppInstalled
。
我相信所有的通信都是异步的。你想检查 errorHandler:
中的代码吗
- (void)sendMessageData:(NSData *)data
replyHandler:(void (^)(NSData *replyMessageData))replyHandler
errorHandler:(void (^)(NSError *error))errorHandler
我认为无法在模拟器上进行测试。您只能暂时将您的errorHandler 代码复制到replyHandler 进行测试。
这是我用来测试可用性的代码:
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = _modelController
session.activateSession()
_modelController!.transferArrayToWatchWithSession()
}
并在 _modelController
中
func transferArrayToWatchWithSession() {
let session = WCSession.defaultSession()
if WCSession.isSupported() && session.watchAppInstalled {
session.transferUserInfo([kWatchControlsDictKey:self.verifiedWatchArray])
} else {
log.info(....")
}
}
在 Apple Watch 模拟器 运行 达到您描述的特定状态时退出 iPhone 模拟器...与实际的 Apple Watch 一样,Watch 模拟器将显示 phone 退出 iPhone 模拟器时屏幕顶部的断开连接图标。见下图。
还有一个状态需要考虑,就是WCSession
只有两个app都在前台才能通信。所以,你也应该测试一下watch和iPhone连接(两个模拟器都是运行)但是iPhoneapp不在前台的场景。 (同样,当 Watch 连接时 iPhone 应用程序在前台,但 Watch 应用程序不在前台。)
您可以通过按下手表上的这两个按钮之一将位于 foregroundState 的应用程序置于 backgroundState 中来模拟 isReachable 变为 false。
iPhone距离待连接手表两远(out of range)效果相同。
CF:https://developer.apple.com/documentation/watchconnectivity/wcsession/1615683-isreachable
直到今天,还是没有办法直接模拟断开连接,或者我还没有找到它,如果您关闭 iPhone 模拟断开连接的模拟器,isReachable 仍然为真。
只需将要测试的函数放在委托的 sessionReachabilityDidChange(_ session: WCSession) 中,并假设它具有相同的效果。
我正在开发 watchOS 扩展,它使用 WCSession
与 iPhone 进行通信。但是,我没有 Apple Watch,因此必须依靠 Watch Simulator 来测试我的代码。
有没有办法在模拟器中测试手表与phone断开连接的场景?
如果不是,是否有一些文档或经过充分研究的博客 post 可以深入了解 WCSession
在这种情况下的行为?
退出 iPhone 模拟器应该可以让您大致了解这种情况。
我认为这不可能,因为 Apple 文档说,
Additionally, WatchKit apps have a reliable connection to the simulated host device because they both are running in the Simulator.
Apple 在 Simulator User Guide
的硬件差异部分提到了这一点您应该使用 if 查询,在开始 WC 请求之前 iPhone 是否可达:
if (WCSession.defaultSession().reachable) {
//do your request here
} else {
//handle non-reachability
}
如果您想测试您的应用对无法访问的反应,只需将 WCSession.defaultSession().reachable
替换为 false
。
我了解到您确实想要一个测试场景。
但是你想测试哪个通信方向?如果您查看 WCSession
的文档,它总是说明手表和 iOS 设备的行为。
另外,'disconnected'是什么意思?
您可以检查 WCSession.defaultSession().reachable
,但文档说明
On iOS, the value is YES when the paired Apple Watch is in range and the associated Watch app is running in the foreground.
您可以检查 paired
,但您还需要检查 watchAppInstalled
。
我相信所有的通信都是异步的。你想检查 errorHandler:
中的代码吗
- (void)sendMessageData:(NSData *)data
replyHandler:(void (^)(NSData *replyMessageData))replyHandler
errorHandler:(void (^)(NSError *error))errorHandler
我认为无法在模拟器上进行测试。您只能暂时将您的errorHandler 代码复制到replyHandler 进行测试。
这是我用来测试可用性的代码:
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = _modelController
session.activateSession()
_modelController!.transferArrayToWatchWithSession()
}
并在 _modelController
中func transferArrayToWatchWithSession() {
let session = WCSession.defaultSession()
if WCSession.isSupported() && session.watchAppInstalled {
session.transferUserInfo([kWatchControlsDictKey:self.verifiedWatchArray])
} else {
log.info(....")
}
}
在 Apple Watch 模拟器 运行 达到您描述的特定状态时退出 iPhone 模拟器...与实际的 Apple Watch 一样,Watch 模拟器将显示 phone 退出 iPhone 模拟器时屏幕顶部的断开连接图标。见下图。
还有一个状态需要考虑,就是WCSession
只有两个app都在前台才能通信。所以,你也应该测试一下watch和iPhone连接(两个模拟器都是运行)但是iPhoneapp不在前台的场景。 (同样,当 Watch 连接时 iPhone 应用程序在前台,但 Watch 应用程序不在前台。)
您可以通过按下手表上的这两个按钮之一将位于 foregroundState 的应用程序置于 backgroundState 中来模拟 isReachable 变为 false。
iPhone距离待连接手表两远(out of range)效果相同。
CF:https://developer.apple.com/documentation/watchconnectivity/wcsession/1615683-isreachable
直到今天,还是没有办法直接模拟断开连接,或者我还没有找到它,如果您关闭 iPhone 模拟断开连接的模拟器,isReachable 仍然为真。
只需将要测试的函数放在委托的 sessionReachabilityDidChange(_ session: WCSession) 中,并假设它具有相同的效果。