You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模拟器的设置中确认配对状态。

二、代码修复要点

  1. 补充必需的WCSession代理方法
    iOS端WCSessionDelegate缺少两个强制实现的方法(Watch端建议也添加),否则会导致会话激活失败:

    func sessionDidBecomeInactive(_ session: WCSession) {}
    func sessionDidDeactivate(_ session: WCSession) {
        session.activate() // 重新激活会话,支持多设备切换场景
    }
    

    将上述方法添加到iOS和Watch的ContentViewModel中。

  2. 完善错误排查逻辑
    为会话激活和消息发送添加错误处理,方便定位问题:

    • 会话激活回调修改:
      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)")
          }
      }
      
  3. 移除重复初始化代码
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 08:17:47