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

