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

启动Live Activity时无法将错误转为ActivityAuthorizationError,求解决方法

解决Live Activity错误无法转为ActivityAuthorizationError的问题

你遇到的问题是因为Activity.request抛出的错误是经过包装的外层错误(ActivityInput相关),真正的ActivityAuthorizationError被放在了NSError的NSUnderlyingErrorKey对应的底层错误中,所以无法直接进行类型转换。下面是具体的处理方案:

核心思路

  1. 将捕获到的Error转为NSError,获取其userInfo中的底层错误
  2. 通过底层错误的domain和code,手动映射到ActivityAuthorizationError的枚举值
  3. 根据不同的错误类型,向用户展示对应的失败原因和恢复建议

完整处理代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:17:50