在真正的Apple Watch上调试WatchKit – 什么都没发生
我正在努力在真正的Apple Watch上调试我的WatchKit扩展/应用程序。 使用模拟器调试iPhone App和WatchKit Extension,模拟器没问题:
- 选择WatchKit应用程序配置文件并在模拟器中运行==>在Watch Simulator中启动应用程序,我可以在扩展代码中使用断点进行调试。
- 为了调试iPhone应用程序,我在模拟器中启动应用程序并手动附加调试器==>我可以使用iPhone代码中的断点进行调试。
观察iPhone应用程序和手表应用程序的工作是没有问题的。 至少不在模拟器中。
我想在真正的Apple Watch上做同样的事情。 但是,当我选择WatchKit应用程序配置文件和我的真实iPhone(而不是模拟器)并单击“运行”时,没有任何反应。 这意味着Xcode似乎构建并启动应用程序,但设备上没有任何反应。 Xcode中的状态字段显示:
构建MyApp WatchKit应用程序:MyApp WatchKit扩展
构建MyApp WatchKit应用程序:完成…
在我的iPhone 6上运行MyApp
这就是全部。 没有调试窗口,断点被忽略或不起作用,并且应用程序既不在iPhone上也不在Apple Watch上启动。
我发现了有关在真实设备上调试问题的其他问题(例如此处 ),但它们都涉及安装和签名问题。 在我的情况下,iPhone App和WatchKit App都安装没有任何问题。 当我点击Watch上的应用程序图标时,我可以启动并使用该应用程序。 问题是我无法调试此过程。
为什么我需要在真实设备上调试该过程? 好吧,有一件事我无法使用模拟器进行测试:当Watch App尝试使用openParentApplication:reply:
联系iPhone应用程序时会发生什么openParentApplication:reply:
当iPhone应用程序尚未运行时? 这在模拟器中完美运行,但在真实设备上,Watch Apps似乎没有得到iPhone应用程序的回复,只是永远等待。
我已经找到解决这个问题的提示 ,但是无法调试Watch App并看看代码是如何执行的,我无法确定发生了什么……
谢谢您的回答。 我终于设法在我真正的Apple Watch上运行调试(大部分时间)。 然而,它非常麻烦且不太可靠。 评论中没有足够的空间,所以我将使用这个答案来描述我的解决方案。 也许这对其他人有帮助:
- 确保您手表上的应用程序未运行(如BalestraPatrick所述)。 启动应用程序并按住侧面按钮几秒钟以显示“关闭手表”对话框。 按住侧面按钮几秒钟以关闭应用程序并返回到Watch主屏幕。
-
确保iPhone未锁定。
-
选择
WatchKit App
目标和真正的iPhone并运行项目。 - 运行Watch App经常导致错误
SPErrorInvalidBundleNoGizmoBinaryMessage
。 重新启动Xcode并清理Watch App和App目标解决了这个问题。 - 如果Watch App的构建成功,Xcode中会有一条短消息,但iPhone或Watch上没有消息。 如果您对Watch App进行了更改,则需要几秒钟的时间来刷新Watch上的应用程序。 这通过应用程序图标上的进度圆覆盖来指示。 如果您在应用程序转移后未进行任何更改: 通过点击图标手动启动监视应用程序 。 没有自动启动。
- 在大多数情况下,Xcode会识别应用程序启动并将其调试程序附加到它。 这将允许使用断点,检查代码等。
在我的情况下,我想知道iPhone应用程序如何处理application:handleWatchKitExtensionRequest:reply:
应用程序之前未激活时调用。 这很重要,因为使用模拟器无法做到这一点。 如果应用程序需要很长时间来处理请求,Watch将不会收到有效响应。
按照上述步骤操作后,Xcode仅附加到手表应用程序,并且不会保留iPhone应用程序代码中的断点。 要做到这一点,必须手动将调试器连接到手表应用发送其呼叫时启动的iPhone应用程序进程。
为了能够附加调试器,我在apps主函数中添加了一个延迟: [NSThread sleepForTimeInterval:5]
:
- 在Watch App中选择将启动对iPhone App的调用的function
- iPhone应用程序将在后台启动。 延迟使您可以在5秒内连接调试器。
- 在Xcode中选择
Debug\Attach To Process\Likely Targes\Your iPhone App
以附加调试器。 - 延迟5秒后,该过程将继续,您也可以在iPhone应用程序代码中使用断点。
- 不要忘记在完成测试后删除延迟代码:-)
注意:您将无法从iPhone应用程序中看到NSLog
输出(或任何控制台输出),因为连接调试器不会重新路由控制台输出。
使用这款令人敬畏的新Apple产品进行快乐测试:-P
我遇到了同样的问题,但为了改善一点调试经验,我通常会重启我的设备几次。 尝试重新启动Apple Watch或iPhone。
在从Xcode启动应用程序之前,请确保Apple Watch上的应用程序已完全关闭(例如,未插入加载屏幕)。 要做到这一点,你必须强制关闭应用程序:进入你的应用程序,按住侧面按钮,直到出现关闭手表的菜单,然后按下同一侧按钮几秒钟直到手表将返回到主屏幕和强制关闭您的应用程序。
现在您可以尝试从Xcode构建和运行应用程序,它应该更可靠地工作。
watchOS 3+:
通过按住侧面按钮(数字表冠下方的按钮)直到出现关机屏幕,然后松开侧面按钮,然后按住数字表冠来完成强制退出。
这是一种似乎对我来说最可靠的技术,即使它仍然只能在25%的时间内运行(Xcode 7 beta 4,7A165t):
- 在调试中运行手机目标(当然在你的实际iPhone上)
- 当iPhone应用程序仍在运行时,切换到监视目标并在调试中运行它。
- 随着应用安装,请密切注意您的手表主屏幕。 安装应用程序后,点按它即可打开它。 这有时会“启动”手表应用程序,并允许调试器捕获它。 此时,您应该能够同时调试iPhone应用程序和watchOS应用程序。
这个问题有不同的答案。 一切都很好。
原因是:根据我的经验,至少有两个不同的问题阻碍了真正的手表上的调试。 两者都需要不同的策略。
这个答案试图帮助您决定何时使用哪种策略。
- XCode安装,告诉你它正在运行一小段时间,然后停止显示“正在运行…”。
- 从BalestraPatrick的答案开始:
- 重启你的设备。
- 别忘了重启iPhone。 这是我第一次遇到这个问题时的伎俩。
- XCode安装,告诉你它正在运行更长的时间:“在
的Apple Watch上运行 。 - 从Jay Hickey或Andrei Herford的回答开始
- 手动启动监视应用程序可能会成功。
我也有时候XCode能够在没有我任何帮助的情况下启动我的手表应用程序。
奖金:
从XCode 7.1开始,似乎XCode并不总是编译所有必需的Swift文件(比以前更频繁)。 这不是特定于手表的,它也适用于iOS应用程序。 症状看起来与此问题的症状相似。 – >清理项目,然后重新启动XCode。
- 如何使用iOS Objective C在容器内创buildUIPageviewcontroller?
- 如何使可选的圆angular和边框UIView?
- 如何在UIAlertView(iOS)中的其他两个button(堆叠)之间添加Cancelbutton
- 使用AutoLayout垂直调整UITextView文本的大小
- Swift中的JSQMessagesViewController与Xcode 6.3的Objective-Cselect器问题
- 如何从数组中随机抽取项目在Swift中?
- 使用Swift进行设计模式:立面模式– iOS开发技巧–中
- 没有GameKit的iOS蓝牙
- 在列表中重新sortingEKReminder