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

userNotificationCenter方法参数类型冲突:突发错误是Bug还是更新所致?

解决UNUserNotificationCenter代理方法的Block类型冲突问题

嘿,这个问题我之前踩过坑!既不是Bug也不是系统更新导致的,就是Objective-C里Block类型声明的修饰符顺序细节在搞事情。

问题根源

你看,系统官方的方法声明里,completionHandler的Block类型是void(^ _Nonnull __strong)(void),而你写的是void (^)()——虽然看起来都是无参无返回的Block,但编译器对_Nonnull和__strong的顺序非常敏感,会把这两个判定为不同的类型,于是就抛出了类型不匹配的错误。

快速解决办法

最稳妥的方式就是严格照搬系统的方法签名,或者直接用Xcode的自动补全功能生成方法(输入userNotificationCenter:didReceiveNotificationResponse:后按回车),这样能完全避免类型不一致的问题。

正确的方法实现应该是这样的:

// 用户点击已展示的通知后处理通知消息。
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^ _Nonnull __strong)(void))completionHandler {
    // 这里写你的通知处理逻辑,比如跳转页面、更新UI等
    
    // 一定要记得调用completionHandler,系统需要这个来确认你已经处理完通知
    completionHandler();
}

额外提示

如果开启了Xcode的严格类型检查(比如Enable Strict Checking of objc_msgSend Calls),这类修饰符顺序的差异更容易触发报错。只要保证你的方法签名和UserNotifications.framework头文件里的声明完全一致,就能彻底解决这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:26:18