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

