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

