添加content-available字段后,APNS消息无法被前台Xamarin应用接收?
解决Xamarin iOS前台无法接收带
content-available的APNS推送问题 我之前在Xamarin iOS开发里碰到过几乎一模一样的坑!当给APNS推送加上content-available: 1之后,前台的DidReceiveRemoteNotification就突然不触发了,折腾了好一阵才捋清楚关键问题,分享给你:
1. 先确认推送Payload格式是否合规
带content-available的推送属于后台更新推送,APNS对它的格式要求比普通推送更严格:
- 必须保证
content-available是整数1,不能是字符串"1" - 如果同时包含alert内容,要确保整个
aps字典结构正确
举个正确的Payload示例:
{ "aps": { "alert": { "title": "测试通知", "body": "带后台更新能力的推送" }, "content-available": 1, "sound": "default" }, "custom_data": "你的自定义字段" }
你用Easy APNs Provider发送时,要确认是通过勾选「Content Available」选项生成的Payload,而不是手动输入可能写错类型。
2. 更换正确的AppDelegate回调方法
普通推送的DidReceiveRemoteNotification(不带回调参数的版本),在遇到带content-available的推送时,前台是不会触发的!你需要重载带Action<UIBackgroundFetchResult>回调的版本:
public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler) { // 在这里处理带content-available的推送内容 Console.WriteLine("前台收到后台更新推送:" + userInfo); // 必须调用completionHandler,否则系统会判定你的处理超时 completionHandler(UIBackgroundFetchResult.NewData); }
这个方法是专门用来处理包含后台更新能力的推送的,不管应用在前台还是后台都会触发。
3. 检查后台权限配置是否完整
即使你申请了推送权限,还要确保开启了后台刷新相关配置:
- 在
Info.plist里添加UIBackgroundModes数组,包含remote-notification项:
<key>UIBackgroundModes</key> <array> <string>remote-notification</string> </array>
- 代码申请推送权限时,要包含
UIUserNotificationType.Background:
UIApplication.SharedApplication.RegisterForRemoteNotifications(); var settings = UIUserNotificationSettings.GetSettingsForTypes( UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Background, null); UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
4. TestFlight环境的特殊注意事项
TestFlight属于Production环境,要确保:
- 推送证书用的是Production环境的证书,不是Development证书
- 应用在前台时,不要被系统的后台限制影响(比如不要长时间挂在后台再切回来,尽量重启应用后测试)
内容的提问来源于stack exchange,提问作者GGizmos
相关产品推荐
相关产品推荐

