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

如何从Apple Watch应用调用handleWatchKitExtensionRequest获取字典?

在Apple Watch应用中调用iPhone端AppDelegate方法获取字典

嘿,我来帮你搞定这个问题!要让Watch端调用你在iPhone AppDelegate里写的handleWatchKitExtensionRequest方法拿到字典,其实有两种可行的方式,我分别给你拆解清楚:

一、传统方式:使用openParentApplication(适配旧版本)

这是对应你现有代码的直接调用方式,在WatchKit Extension的界面控制器(比如WKInterfaceController的子类)里,你可以通过openParentApplication方法触发iPhone端的回调:

Watch端调用代码

找个合适的时机(比如按钮点击、界面加载完成时)添加这段代码:

// 这里可以传空字典,也可以带参数给iPhone端
WKInterfaceController.openParentApplication([:]) { (replyDict, error) in
    if let error = error {
        print("请求出错啦:\(error.localizedDescription)")
        return
    }
    // 拿到iPhone返回的字典并处理
    if let receivedDict = replyDict as? [String: String] {
        print("收到的字典:\(receivedDict)")
        // 要是要更新Watch界面,记得切回主队列
        DispatchQueue.main.async {
            // 这里写更新UI的代码,比如给标签赋值之类的
        }
    }
}

注意点

  • 这个方法在iOS 10和watchOS 3之后被苹果标记为废弃了,如果你的应用是面向新版本系统开发的,更推荐下面的Watch Connectivity方案。
  • 要确保iPhone端的App处于前台或后台活跃状态,不然回调可能没法及时响应。

二、推荐方案:使用Watch Connectivity框架的WCSession

这是苹果现在主推的设备间通信方式,比传统方法更可靠,支持更多场景:

第一步:iPhone端配置(在AppDelegate/SceneDelegate里)

先导入框架并配置会话:

import WatchConnectivity

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 检查设备是否支持WCSession
    if WCSession.isSupported() {
        let session = WCSession.default
        session.delegate = self
        session.activate()
    }
    return true
}

// 实现WCSessionDelegate的方法来处理Watch端的请求
extension AppDelegate: WCSessionDelegate {
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
    
    // 接收Watch的消息并返回字典
    func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
        let passDict = ["One": "Two"]
        replyHandler(passDict)
    }
}

第二步:Watch端配置(在WKInterfaceController里)

同样导入框架,配置会话并发送请求:

import WatchConnectivity

class InterfaceController: WKInterfaceController, WCSessionDelegate {
    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        // 初始化WCSession
        if WCSession.isSupported() {
            let session = WCSession.default
            session.delegate = self
            session.activate()
        }
    }
    
    // 写个方法来请求iPhone端的字典
    func getDictFromiPhone() {
        guard WCSession.default.isReachable else {
            print("iPhone当前不可达哦")
            return
        }
        // 发送请求并处理回复
        WCSession.default.sendMessage([:], replyHandler: { replyDict in
            if let receivedDict = replyDict as? [String: String] {
                print("收到字典:\(receivedDict)")
                // 更新UI要切主队列
                DispatchQueue.main.async {
                    // 这里处理界面更新
                }
            }
        }, errorHandler: { error in
            print("请求失败:\(error.localizedDescription)")
        })
    }
    
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
}

这样不管iPhone App是前台还是后台,都能更稳定地完成数据交互啦。


内容的提问来源于stack exchange,提问作者user2537535

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:42:21