WCSession配对失败:Watch模拟器无法加载,无法测试跨设备消息
WCSession模拟器配对失败,无法测试Watch与iPhone通信问题
问题描述
我正在开发一款通过WCSession实现Apple Watch向配对iPhone发送数据/消息的应用,代码编译无报错,但仅启动iOS模拟器时提示WCSession未配对,无法测试程序。尝试启动watchOS模拟器、更换模拟器均无效。
相关代码
Watch App代码
import SwiftUI import WatchConnectivity class ContentViewModel: NSObject, ObservableObject, WCSessionDelegate { @Published var message: String = "" override init() { super.init() setupWatchConnectivity() } func setupWatchConnectivity() { if WCSession.isSupported() { let session = WCSession.default session.delegate = self session.activate() } } func sendMessageToPhone() { if WCSession.default.isReachable { let message = ["text": "Hello, iPhone!"] WCSession.default.sendMessage(message, replyHandler: nil, errorHandler: nil) } } func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { // Handle activation completion } func session(_ session: WCSession, didReceiveMessage message: [String: Any]) { if let text = message["text"] as? String { DispatchQueue.main.async { self.message = text } } } } struct ContentView: View { @StateObject private var viewModel = ContentViewModel() var body: some View { VStack { Text("Message from iPhone:") Text(viewModel.message) .font(.title) Button(action: viewModel.sendMessageToPhone) { Text("Send Message to iPhone") } } .onAppear { viewModel.setupWatchConnectivity() } } }
iOS App代码
import SwiftUI import WatchConnectivity class ContentViewModel: NSObject, ObservableObject, WCSessionDelegate { @Published var message: String = "" override init() { super.init() setupWatchConnectivity() } func setupWatchConnectivity() { if WCSession.isSupported() { let session = WCSession.default session.delegate = self session.activate() } } func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { // Handle activation completion } func session(_ session: WCSession, didReceiveMessage message: [String: Any]) { if let text = message["text"] as? String { DispatchQueue.main.async { self.message = text } } } } struct ContentView: View { @StateObject private var viewModel = ContentViewModel() var body: some View { VStack { Text("Message from Apple Watch:") Text(viewModel.message) .font(.title) } .onAppear { viewModel.setupWatchConnectivity() } } }
解决方案
一、模拟器配对的正确操作步骤
- 同时启动对应模拟器:在Xcode运行目标中选择包含Watch App的iOS应用,然后选择带有配对Watch的iPhone模拟器(如
iPhone 15 Pro + Apple Watch Series 9),确保两者同时启动。 - 手动配对检查:如果Watch模拟器未自动启动,打开Xcode菜单
Window > Devices and Simulators,选中目标iPhone模拟器,在右侧Paired Watches中添加并启动对应的Watch模拟器;再分别在iPhone模拟器的「Watch」App、Watch模拟器的设置中确认配对状态。
二、代码修复要点
补充必需的WCSession代理方法
iOS端WCSessionDelegate缺少两个强制实现的方法(Watch端建议也添加),否则会导致会话激活失败:func sessionDidBecomeInactive(_ session: WCSession) {} func sessionDidDeactivate(_ session: WCSession) { session.activate() // 重新激活会话,支持多设备切换场景 }将上述方法添加到iOS和Watch的
ContentViewModel中。完善错误排查逻辑
为会话激活和消息发送添加错误处理,方便定位问题:- 会话激活回调修改:
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { if let error = error { print("会话激活失败: \(error.localizedDescription)") return } print("会话激活状态: \(activationState.rawValue)") } - 消息发送方法修改:
func sendMessageToPhone() { guard WCSession.default.isReachable else { print("iPhone不可达,无法发送消息") return } let message = ["text": "Hello, iPhone!"] WCSession.default.sendMessage(message, replyHandler: nil) { error in print("发送消息失败: \(error.localizedDescription)") } }
- 会话激活回调修改:
移除重复初始化代码
Watch和iOS端的ContentView在onAppear中重复调用了setupWatchConnectivity(),而ViewModel的init已经完成初始化,重复调用可能引发异常,建议删除onAppear中的该调用。
三、额外排查项
- 确保使用最新稳定版Xcode,旧版本可能存在模拟器配对bug。
- 重置模拟器:分别对iPhone和Watch模拟器执行
Device > Erase All Content and Settings,然后重新配对。 - 检查Bundle Identifier:Watch App的Identifier必须是iOS App的Identifier加上
.watchkitapp后缀,Extension的Identifier则是Watch App的加上.watchkitextension,三者需保持关联。
内容的提问来源于stack exchange,提问作者Deven Nahata
相关产品推荐
相关产品推荐

