如何从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
相关产品推荐
相关产品推荐

