启动Live Activity时无法将错误转为ActivityAuthorizationError,求解决方法
你遇到的问题是因为Activity.request抛出的错误是经过包装的外层错误(ActivityInput相关),真正的ActivityAuthorizationError被放在了NSError的NSUnderlyingErrorKey对应的底层错误中,所以无法直接进行类型转换。下面是具体的处理方案:
核心思路
- 将捕获到的
Error转为NSError,获取其userInfo中的底层错误 - 通过底层错误的
domain和code,手动映射到ActivityAuthorizationError的枚举值 - 根据不同的错误类型,向用户展示对应的失败原因和恢复建议
完整处理代码
do { let _ = try Activity.request(attributes: activityAttributes, contentState: initialContentState) as Activity<MyActivityAttributes> } catch { let nsError = error as NSError // 优先处理底层的授权错误 if let underlyingError = nsError.userInfo[NSUnderlyingErrorKey] as? NSError, underlyingError.domain == "com.apple.ActivityKit.ActivityAuthorization" { // 根据code映射到ActivityAuthorizationError枚举 let authError: ActivityAuthorizationError? switch underlyingError.code { case 1: authError = .notEntitled case 2: authError = .disabled case 3: authError = .notAvailable case 4: authError = .notAllowed default: authError = nil } if let authError = authError { // 生成对应提示信息 let promptMessage: String switch authError { case .notEntitled: promptMessage = "当前应用无Live Activity权限,请检查签名和Capabilities配置。" case .disabled: promptMessage = "系统已禁用Live Activity功能,请前往「设置」开启。" case .notAvailable: promptMessage = "当前设备不支持Live Activity功能。" case .notAllowed: promptMessage = "您已拒绝Live Activity权限,请前往「设置」允许。" @unknown default: promptMessage = "启动Live Activity失败,请稍后重试。" } // 替换为你的弹窗展示逻辑 showErrorAlert(title: "启动失败", message: promptMessage) } else { showErrorAlert(title: "启动失败", message: "未知授权错误,请稍后重试。") } } else { // 处理其他非授权类错误(比如输入参数错误) let generalMessage: String switch nsError.code { case 1: generalMessage = "Live Activity配置参数无效,请检查后重试。" default: generalMessage = nsError.localizedDescription } showErrorAlert(title: "启动失败", message: generalMessage) } } // 示例弹窗方法(根据你的项目实际实现调整) func showErrorAlert(title: String, message: String) { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) // 注意:需确保在主线程展示UI DispatchQueue.main.async { UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true) } }
注意事项
ActivityAuthorizationError的code与枚举值的对应关系,需对照Apple官方文档确认(不同iOS版本可能有微调)- 展示弹窗时务必切换到主线程,避免UI操作异常
- 如果后续Apple调整错误包装逻辑,可能需要重新适配错误解析方式
内容的提问来源于stack exchange,提问作者Craig Swanson
相关产品推荐
相关产品推荐

