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

watchOS智能闹钟强制关闭后,WKExtendedRuntimeSession无法触发重启问题

问题:watchOS智能闹钟应用强制关闭后无法触发闹钟

我正在为watchOS开发一款智能闹钟应用,目前大部分功能已实现,但存在一个问题:当用户设置闹钟后强制关闭应用,到预定时间闹钟不会响起,只会弹出通知提示:

闹钟应用曾在后台运行,但未能播放预定闹钟。是否要禁用该应用未来运行后台任务的权限?

若未强制关闭应用,无论应用在前台还是后台,闹钟都能正常响起。

我已开启Background Modes(智能闹钟)权限,且知道该功能可实现——比如Sleep Cycle这类闹钟应用在手表被强制关闭后仍能正常触发闹钟。但我的handle()方法从未被触发,按官方文档说明该方法应该会被调用。

我的ExtendedRuntimeSessionDelegate代码如下:

import WatchKit

class ExtendedRuntimeSessionDelegate: NSObject, WKExtendedRuntimeSessionDelegate {
    var selectedVibration: String = "medium"
    var vibrationRepeatDelay: Double = 3.0
    
    let vibrationStrengths: [String: WKHapticType] = [
        "very low": .click,
        "low": .directionUp,
        "medium": .success,
        "high": .start,
        "very high": .notification
    ]
    
    func extendedRuntimeSessionWillExpire(_ extendedRuntimeSession: WKExtendedRuntimeSession) {
        print("extendedRuntimeSessionWillExpire: Session about to expire")
    }
    
    func handle(_ extendedRuntimeSession: WKExtendedRuntimeSession) {
        print("handle: Resuming extended runtime session")
        extendedRuntimeSession.delegate = self
        startVibration(session: extendedRuntimeSession)
    }
    
    func extendedRuntimeSessionDidStart(_ extendedRuntimeSession: WKExtendedRuntimeSession) {
        print("extendedRuntimeSessionDidStart: runtime session started")
        startVibration(session: extendedRuntimeSession)
    
    }
    
    func extendedRuntimeSession(_ extendedRuntimeSession: WKExtendedRuntimeSession, didInvalidateWith reason: WKExtendedRuntimeSessionInvalidationReason, error: Error?) {
        print("Session invalidated: \(reason)")
        if let error = error {
            print("Error: \(error.localizedDescription)")
        }
    }
    
    private func startVibration(session: WKExtendedRuntimeSession) {
        print("Start Vibration called")
        let hapticType = vibrationStrengths[selectedVibration] ?? .success
        
        session.notifyUser(hapticType: hapticType) { outHapticType in
            // Repeat the same haptic type based on the vibration repeat delay
            outHapticType.pointee = hapticType
            return self.vibrationRepeatDelay
        }
        
        // Set alarmState to active when the vibration starts
        DispatchQueue.main.async {
            UserDefaults.standard.set(AlarmState.active.rawValue, forKey: "alarmState")
            print("startVibration: Alarm state saved as \(AlarmState.active)")
        }
    }
    
    func stopVibration(session: WKExtendedRuntimeSession) {
        session.invalidate()
        
        // Update the app's state when the vibration stops
        DispatchQueue.main.async {
            UserDefaults.standard.set(AlarmState.notSet.rawValue, forKey: "alarmState")
            print("stopVibration: Alarm state saved as \(AlarmState.notSet)")
        }
    }
}

补充:已联系苹果官方,对方表示这是预期设计行为。虽然Sleep Cycle团队实现了该功能,能提升应用鲁棒性,但目前只能放弃该功能提交应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:50:57