WatchConnectivity 在iPhone与Apple Watch上无法正常工作的问题求助
我之前也碰到过几乎一模一样的问题,折腾了好一阵才揪出几个容易被忽略的细节,给你列出来逐一排查下:
仔细核对 App Group 配置的每一步
虽然你提到用了同一个组标识符,但要确认iPhone和Watch两个target都在Signing & Capabilities中添加了完全相同的App Group,并且都勾选了对应的组选项。有时候可能给iPhone端配置了,但Watch端漏勾;或者组名有细微拼写错误(比如大小写、多了空格)。另外,别忘了同步更新Provisioning Profile——有时候Xcode不会自动刷新,去开发者后台确认对应的Profile已经包含App Group权限,再重新下载到本地。确认 WatchConnectivity 初始化的时机与执行状态
你说在delegate中启动session,但要注意:- iPhone端:如果用SceneDelegate,要在
scene:willConnectToSession:options:中初始化;如果是传统的AppDelegate,就在application:didFinishLaunchingWithOptions:里处理。必须先判断WCSession.isSupported(),再调用activate()。 - Watch端:要在
WKExtensionDelegate的applicationDidFinishLaunching()中做同样的操作。
关键是给两端都加打印日志,比如iPhone端打print("iPhone WCSession activated: \(WCSession.default.isActivated)"),Watch端打print("Watch WCSession activated: \(WCSession.default.isActivated)"),确认代码真的执行到了,并且session确实被激活了。
- iPhone端:如果用SceneDelegate,要在
再检查 Bundle ID 的层级关系
Apple对Watch相关的Bundle ID有严格的层级要求:- iPhone主App:
com.yourapp.yourname - Watch App:
com.yourapp.yourname.watchkitapp - Watch Extension:
com.yourapp.yourname.watchkitapp.extension
哪怕只是多打了一个点或者少了后缀,都会导致配对失败。再仔细核对这三个ID的层级是否完全符合要求。
- iPhone主App:
测试环境的隐藏问题
- 用模拟器测试时:确保iPhone模拟器和Watch模拟器是已配对状态,有时候重启Xcode或模拟器后配对会失效,去Xcode的
Window > Devices and Simulators里检查,必要时删除现有配对重新建立。 - 用真机测试时:确保iPhone和Watch登录了同一个Apple ID,并且都开启了蓝牙和Wi-Fi(处于同一局域网)。如果Watch开了蜂窝网络,暂时关闭试试,部分情况下蜂窝网络会干扰WatchConnectivity的配对。
- 用模拟器测试时:确保iPhone模拟器和Watch模拟器是已配对状态,有时候重启Xcode或模拟器后配对会失效,去Xcode的
确保 WCSession 的 Delegate 生命周期正确
很多人会犯这个错:把WCSession的delegate设为局部变量,方法执行完delegate就被释放了,导致session无法正常回调,进而触发“counterpart not installed”的错误。正确的做法是把delegate设为AppDelegate、SceneDelegate或Watch ExtensionDelegate本身,或者用一个全局单例对象,确保delegate的生命周期和App一致。清理缓存后重新构建
Xcode的缓存有时候会搞出各种玄学问题,试试这些操作:- 清理项目:按下
Cmd + Shift + K - 清理构建文件夹:按下
Cmd + Option + Shift + K - 删除模拟器/真机上的所有相关App
- 重启Xcode和测试设备,再重新编译安装
- 清理项目:按下
你可以按这个顺序排查,大概率能找到问题所在。
内容来源于stack exchange

