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

在MainActor类中获取UNAuthorizationStatus遇Non-Sendable错误的解决方法

解决UNNotificationSettings的Non-Sendable错误问题

问题根源

UNNotificationSettings未被Apple标记为遵循Sendable协议,你在@MainActor隔离类中通过await调用notificationSettings()时,会将非Sendable的UNNotificationSettings从UNUserNotificationCenter的非隔离上下文传递到MainActor隔离域,从而触发编译错误。

可行解决方案

无需使用@preconcurrency,可以通过在非隔离上下文中处理非Sendable类型,仅传递Sendable的结果来规避问题:

import UserNotifications

@MainActor
final class Test {
    func aStatus() async -> UNAuthorizationStatus {
        await getAuthorizationStatus()
    }
}

// 非隔离辅助函数:在非隔离上下文处理UNNotificationSettings,仅返回Sendable的状态值
private nonisolated func getAuthorizationStatus() async -> UNAuthorizationStatus {
    let nCenter = UNUserNotificationCenter.current()
    let settings = await nCenter.notificationSettings()
    return settings.authorizationStatus
}

原理说明

  • 非隔离的getAuthorizationStatus()函数与UNUserNotificationCenter的上下文一致,在该函数内获取和访问UNNotificationSettings不会触发跨隔离域的Sendable检查。
  • 最终仅将本身遵循Sendable的UNAuthorizationStatus枚举值传递到@MainActor隔离类中,完全符合并发安全要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:42:05