如何测试未连接iPhone的Apple Watch场景

11

我正在开发一个使用WCSession与iPhone通信的watchOS扩展程序。然而,由于没有Apple Watch,我必须依靠Watch Simulator来测试我的代码。

在模拟器中有没有一种测试场景,可以测试手表与手机断开连接的情况?

如果没有,是否有一些关于这种情况下WCSession行为的文档或经过深入研究的博客文章提供了一些见解?


1
即使您使用真实设备,这个问题也是相关的:一旦您断开 iPhone 的连接,您将无法在 Apple Watch 上调试任何内容。 - Ely
6个回答

3
退出iPhone模拟器应该能让你近似这种情况。

好主意!在退出模拟器后,我确实无法向iPhone发送数据。但是,在手表上session.reachable仍然为true,并且在sendMessage(...)errorHandler中收到的错误是Code=7001“未知WatchConnectivity错误。”,底层错误是Code=23“超时”。当iPhone不在范围内时,您在手表上是否也遇到了这个问题? - fabian789
这是一个可能的错误,但只有在遇到相当小的竞争时才会出现。另一个更有可能的错误是不可达错误(我相信是7007)。 - ccjensen
好的。根据 WCError.h,确实是7007。但通常情况下,当iPhone断开连接时,session.reachable会变为false吗? - fabian789
1
这是正确的。苹果推荐的最佳实践是在激活会话时使用reachability来检查会话的可达性,然后从那时起使用reachabilityDidChange委托回调(或KVO)来通知更改,以了解何时检查已更新到什么可达性。 - ccjensen

2
我不认为这是可能的,因为苹果文档上写道:

此外,WatchKit应用程序与模拟主机设备之间有可靠的连接,因为它们都在模拟器中运行。

苹果在模拟器用户指南的硬件差异部分提到了这一点。


有趣的链接,谢谢!然而,在我看来,这并不能完全排除模拟我的情况的可能性! - fabian789

1

我了解您想要一个测试场景。

但是,您想要测试哪个通信方向?如果检查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

我认为在模拟器上无法进行测试。您只能将您的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(....")
    }
}

我想测试或“模拟”iPhone与手表不接近的真实场景,以了解WatchConnectivity API的表现。 - fabian789

1

在发起 WC 请求之前,您应该使用 if 查询,判断 iPhone 是否可达:

if (WCSession.defaultSession().reachable) {

   //do your request here

} else {

   //handle non-reachability

}

如果您想测试应用程序在无法到达的情况下的反应,请将WCSession.defaultSession().reachable替换为false

感谢您的回复,但是我的意思是“测试”我的代码,而不是如何在代码中测试可达性 :) - fabian789

0

当 Apple Watch 模拟器正在运行时退出 iPhone 模拟器可以实现您所描述的特定状态...与实际的 Apple Watch 一样,当您退出 iPhone 模拟器时,Watch 模拟器将在屏幕顶部显示一个已断开连接的电话图标。请参见下面的图片。

还有另一个需要考虑的状态,即 WCSession 只能在两个应用程序都在前台时进行通信。因此,您还应该测试 Watch 和 iPhone 已连接(两个模拟器都在运行),但 iPhone 应用程序不在前台的情况。(同样,在 iPhone 应用程序在前台而 Watch 应用程序不在前台时也是如此。) 带有已断开连接的 iPhone 模拟器的 Apple Watch 模拟器


不幸的是,在Xcode 8中,这对我似乎没有起作用。此外,关于iPhone应用程序在后台的部分是不正确的;虽然iPhone应用程序可以在后台通信,但手表应用程序不能。 - Jeff Kelley

0

您可以通过将处于前台状态的应用程序放置在后台状态来模拟isReachable即将为false,方法是按下手表上的其中一个按钮。
它具有与iPhone距离过远而无法连接(超出范围)相同的效果。
参考链接:https://developer.apple.com/documentation/watchconnectivity/wcsession/1615683-isreachable
直到今天,还没有一种直接模拟断开连接的方法,或者我还没有找到,如果您关闭iPhone模拟器以模拟断开连接,则isReachable仍然为true。
只需将要测试的函数放置在委托的sessionReachabilityDidChange(_ session: WCSession)中,并假定它具有相同的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接