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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:45:36