You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Xamarin iOS后台未调用DidReceiveRemoteNotification问题求助

嘿,我前阵子刚踩过这个Xamarin iOS推送的坑!你说的原生两个DidReceiveRemoteNotification函数,正是问题的核心——Xamarin里对应着两个重载方法,后台触发的关键就用错了那个!

先搞懂两个方法的本质区别

Xamarin iOS的AppDelegate里有两个同名方法,完全对应原生的API,但触发场景天差地别:

  • 不带completionHandler的旧重载

    public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo)
    

    这个只有当App在前台运行时才会被调用,后台/挂起状态下根本不会触发,这就是你之前后台没反应的原因!

  • completionHandler的新重载

    public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
    

    这才是支持后台、挂起状态下处理推送的正确方法,苹果文档里说的后台推送支持,指的就是这个重载。

必须配置的3项关键设置

光换方法还不够,得确保项目和推送payload都符合要求:

  1. 开启后台推送权限
    在项目的Info.plist里添加UIBackgroundModes并包含remote-notification,或者直接在Xamarin项目属性的「iOS Bundle Signing」里勾选「Remote notifications」。手动编辑plist的话是这样:

    <key>UIBackgroundModes</key>
    <array>
      <string>remote-notification</string>
    </array>
    
  2. 推送Payload必须带content-available: 1
    不管你要不要显示通知弹窗,只要想触发后台处理,payload里的aps字段必须包含这个标记,告诉系统这是一个可后台处理的推送:

    {
      "aps": {
        "content-available": 1,
        "alert": "可选:显示给用户的通知内容"
      },
      "syncData": "你的离线同步所需的自定义数据"
    }
    
  3. 确保Apple开发者后台配置正确
    给你的App ID开启「Push Notifications」权限,下载并配置好对应的推送证书(开发/生产环境要对应),设备也必须成功注册推送令牌。

正确的代码实现示例

AppDelegate.cs里删掉旧的重载,只保留带completionHandler的版本,必须调用completionHandler——系统会监控这个调用,超时不调用会限制你的App后台权限:

public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
    // 这里写你的离线同步逻辑,注意后台处理时间有限(约30秒),要轻量化
    Console.WriteLine("后台收到推送,开始同步离线数据...");
    
    // 模拟同步操作(实际换成你的业务逻辑)
    bool syncSuccess = await PerformOfflineSync(userInfo);
    
    // 一定要告诉系统处理结果
    completionHandler(syncSuccess ? UIBackgroundFetchResult.NewData : UIBackgroundFetchResult.Failed);
}
几个容易踩的坑
  • 测试后台推送时,别用Xamarin调试器挂着——调试状态下后台行为会和正式运行不一致,建议用Ad Hoc包或者直接通过APNs发送推送测试。
  • 如果用户在系统设置里关闭了App的「后台App刷新」,后台推送也不会触发,必要时可以引导用户开启。
  • 后台处理逻辑不能太耗时,超过系统限制会被强制终止,复杂同步建议拆分成小步骤处理。

内容的提问来源于stack exchange,提问作者Matthew Stark

火山引擎 最新活动