iOS Push Notification Service Extension在模拟器正常运行但真机无法生效
我之前也碰到过一模一样的糟心事——模拟器上推送扩展改图顺得不行,一到真机就完全没反应,折腾了好一阵才捋清楚几个关键排查点,你可以挨个试试:
先盯紧签名配置(重点!)
虽然Xcode 16.2里确实找不到「Code sign on copy」这个选项了,但扩展的签名必须和主APP严格匹配:
选中你的Push Notification Service Extension target,切换到「Signing & Capabilities」标签,确认Team和主APP完全一致,签名方式建议用「Automatically manage signing」,如果之前手动改过配置,不妨先关掉自动管理再重新打开,让Xcode重新生成签名配置,有时候自动签名抽风会导致扩展没被正确签名。检查Bundle ID的格式
苹果对推送扩展的Bundle ID有硬性要求:必须是主APP的Bundle ID加上后缀(比如主APP是com.yourcompany.yourapp,扩展就得是com.yourcompany.yourapp.PushExtension这种),随便乱填的话,真机系统会直接忽略这个扩展。确认推送Payload里的关键字段
模拟器对Payload的校验比较宽松,但真机上必须在aps字典里加上mutable-content: 1,不然系统根本不会触发扩展来修改推送内容。正确的Payload示例应该是这样:{ "aps": { "alert": "测试推送", "mutable-content": 1 }, "image-url": "https://your-image-url.com/test.jpg" }别忘了把
image-url换成你实际要加载的图片地址,而且这个地址得是真机能访问到的(别用本地局域网地址,真机连不上)。排查真机的权限与缓存问题
- 先去真机的「设置」里找到你的APP,确认通知权限已经完全开启(包括允许通知、显示预览这些);
- 删掉真机上的APP,然后在Xcode里执行「Product -> Clean Build Folder」清理缓存,重启Xcode后重新编译安装,有时候旧的安装缓存会导致扩展没被正确部署。
检查Deployment Target版本
确保扩展的Deployment Target不高于你真机的系统版本,如果你的扩展要求iOS 17,但真机是iOS 16,那扩展肯定不会被加载,建议把扩展的Deployment Target和主APP设成一致。
一般来说,按这个顺序排查下来,大部分真机不生效的问题都能解决~
内容来源于stack exchange

