如何用@available排除tvOS的通知响应方法以解决编译报错?
解决tvOS下UserNotifications代理方法编译报错问题
针对你遇到的tvOS编译报错,有两种可靠的解决方式:
方法一:用@available明确标记tvOS不可用
在你的代理方法前添加完整的平台可用性声明,既要指定支持的平台,又要明确排除tvOS:
@available(iOS 10.0, iPadOS 10.0, macOS 10.14, watchOS 3.0, tvOS, unavailable) override func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 这里编写你的通知响应处理逻辑 completionHandler() }
之前只加@available(iOS 10.0, *)没用的原因是,*会匹配所有平台,编译器仍会尝试在tvOS下编译该方法,而tvOS中UNNotificationResponse本身就不可用,且该代理方法在tvOS的UNUserNotificationCenterDelegate中不存在,所以触发报错。加上tvOS, unavailable后,编译器会跳过tvOS平台下该方法的编译,直接忽略。
方法二:使用条件编译指令跳过tvOS编译
如果更习惯用条件编译,可以直接用!os(tvOS)包裹整个方法,让tvOS编译时跳过这段代码:
#if !os(tvOS) override func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 这里编写你的通知响应处理逻辑 completionHandler() } #endif
注意平台标识要写对,tvOS的正确标识是tvOS(首字母小写,其余大写),之前写错标识导致无效的话,修正后就能正常生效。
两种方法都能解决你遇到的UNNotificationResponse不可用和重写不可用方法的报错,选你觉得更顺手的即可。
内容的提问来源于stack exchange,提问作者NightFuryLxD
相关产品推荐
相关产品推荐

