Apple Watch Ultra实体动作按钮:UI联动与启动逻辑技术问询
Apple Watch Ultra 动作按钮 Intent 与 UI 关联及冷启动处理方案
1. 在 StartWorkoutIntent 的 perform() 中关联 UI 动作
Intent 的处理逻辑运行在后台队列,要更新 UI 必须切换到 WatchKit 主线程,通过获取当前活跃的界面控制器触发对应业务动作。示例代码如下:
class StartWorkoutIntentHandler: NSObject, StartWorkoutIntentHandling { func handle(intent: StartWorkoutIntent, completion: @escaping (StartWorkoutIntentResponse) -> Void) { // 切回主线程执行 UI 相关操作 DispatchQueue.main.async { // 获取根界面控制器并强转为你的业务控制器类型 if let rootController = WKExtension.shared().rootInterfaceController as? WorkoutMainController { // 调用控制器中预定义的启动训练方法 rootController.triggerWorkoutStart() } } // 返回 Intent 处理成功的响应 completion(StartWorkoutIntentResponse.success(result: nil)) } }
对应的界面控制器需实现业务方法:
class WorkoutMainController: WKInterfaceController { func triggerWorkoutStart() { // 这里编写具体 UI 更新逻辑:比如启动计时、切换训练状态视图、更新按钮样式等 self.updateWorkoutStatusLabel(to: "训练中") self.startSessionTimer() } }
2. 冷启动时识别 Intent 触发并直接启动训练
当 App 未运行时,动作按钮的 Intent 会唤醒 App,可通过以下两种方式实现自动启动训练:
方式1:在 Intent 处理逻辑中直接执行核心业务
Intent 唤醒 App 时会优先触发 handle() 方法,此时可先执行训练的核心逻辑(如启动 HealthKit 会话、初始化训练数据),同时标记状态供后续 UI 同步:
func handle(intent: StartWorkoutIntent, completion: @escaping (StartWorkoutIntentResponse) -> Void) { // 1. 执行训练核心逻辑(与 UI 无关的部分) WorkoutSessionManager.shared.startNewSession() // 2. 标记启动状态,供 UI 加载后读取 UserDefaults.standard.set(true, forKey: "autoStartWorkoutOnLaunch") // 3. 同步已加载的 UI 状态 DispatchQueue.main.async { if let rootController = WKExtension.shared().rootInterfaceController as? WorkoutMainController { rootController.syncSessionState() } } completion(StartWorkoutIntentResponse.success(result: nil)) }
方式2:在 ExtensionDelegate 中处理启动逻辑
在 App 启动完成时检查标记,自动触发训练动作:
class ExtensionDelegate: NSObject, WKExtensionDelegate { func applicationDidFinishLaunching() { DispatchQueue.main.async { let shouldAutoStart = UserDefaults.standard.bool(forKey: "autoStartWorkoutOnLaunch") guard shouldAutoStart else { return } if let rootController = WKExtension.shared().rootInterfaceController as? WorkoutMainController { rootController.triggerWorkoutStart() } // 重置标记,避免下次启动重复触发 UserDefaults.standard.set(false, forKey: "autoStartWorkoutOnLaunch") } } }
如果你的 App 使用了 Scene 架构,需在 WKExtensionSceneDelegate 的 sceneDidActivate(_:) 方法中执行上述检查逻辑。
内容的提问来源于stack exchange,提问作者Zifigo
相关产品推荐
相关产品推荐

