iOS模拟器使用xcrun simctl push推送通知时,NotificationService Extension的didReceive方法未被调用
iOS模拟器使用xcrun simctl push推送通知时,NotificationService Extension的didReceive方法未被调用
嘿,我之前也踩过这个坑,折腾了好一阵才理顺,给你分享几个实用的排查和解决思路,你可以挨个试下:
检查推送命令的Bundle ID是否正确:用
xcrun simctl push的时候,一定要指定主APP的Bundle ID,而不是Notification Service Extension的ID!很多人这里容易搞混。正确的命令格式应该是:xcrun simctl push booted com.yourcompany.YourMainApp payload.json其中
booted表示当前启动的模拟器,最后是你的payload文件路径。确认Payload格式完全正确:你已经加了
"mutable-content": 1,但要注意几个细节:- 这个字段必须放在
aps字典内部,不能在外面 - 值是数字
1,不是字符串"1"
给你一个标准的可修改通知Payload示例:
{ "aps": { "alert": { "title": "测试可变通知", "body": "这是一条可以被Extension修改的通知" }, "mutable-content": 1, "sound": "default" }, "customData": "你需要传递的自定义数据" }- 这个字段必须放在
检查Extension的配置细节:
- 确保Extension的Deployment Target和主APP完全一致,不能比主APP的版本高,否则模拟器可能无法加载扩展
- 打开Extension的
Info.plist,如果里面设置了UNNotificationExtensionCategory(特定通知分类),那你的Payload里必须对应加上"category": "你的分类名称",否则扩展不会触发;如果不需要分类,直接把这个字段删掉更省心 - 尽量让Extension的Bundle ID是主APP ID的后缀形式,比如主APP是
com.xxx.MyApp,Extension设为com.xxx.MyApp.NotificationExtension,这种格式能避免不少权限相关的奇怪问题
清理缓存并重启:
- 先彻底清理Xcode项目:按
Command+Shift+Option+K清理构建缓存,再按Command+Shift+K清理构建产物,然后重新编译主APP和Extension到模拟器 - 重启模拟器:可以用命令
xcrun simctl shutdown booted && xcrun simctl boot booted,或者直接在模拟器菜单里选「重启」,模拟器的缓存有时候会导致扩展无法正常加载 - 确认模拟器上的APP是最新编译的版本,不是之前没有集成Extension的旧版本
- 先彻底清理Xcode项目:按
调试Extension验证问题:如果上面都没问题,你可以直接调试Extension:选中Extension的Target,选择对应的模拟器点击运行,Xcode会提示你选择要附加的APP,选你的主APP,然后再用
xcrun simctl push推送通知。如果断点能触发,说明扩展本身没问题,问题出在推送环节;如果断点还是没反应,那就要检查Extension的代码了——比如有没有提前调用contentHandler导致逻辑没执行,或者代码里有没有抛出异常?
备注:内容来源于stack exchange,提问作者Vishal Kale
相关产品推荐
相关产品推荐

