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

Xamarin.Forms iOS应用关闭(强制关闭)时接收推送通知的实现方案

iOS下Xamarin.Forms强制关闭状态接收推送的解决方案

嘿,这个问题问到点子上了!我来给你详细拆解清楚,帮你搞明白iOS下推送的逻辑,以及WhatsApp这类应用是怎么实现的:

一、普通消息推送:强制关闭时仍能显示通知

如果你的需求只是让用户在app被强制关闭时看到推送通知(就像WhatsApp的普通文本消息那样),那完全可以实现,大概率是你的配置或者推送payload出了问题:

  • 先把权限配置拉满
    在Xamarin.iOS项目里,首先得确保Entitlements.plist里勾选了「Push Notifications」,而且Apple开发者后台的推送证书(开发/生产环境)是有效的,已经正确绑定到项目。另外,代码里必须主动请求用户的通知权限:

    var notificationCenter = UNUserNotificationCenter.Current;
    notificationCenter.RequestAuthorization(UNAuthorizationOptions.Alert | UNAuthorizationOptions.Sound | UNAuthorizationOptions.Badge, (granted, error) => {
        // 这里可以处理权限申请结果,比如提示用户开启通知
    });
    UIApplication.SharedApplication.RegisterForRemoteNotifications();
    
  • 推送Payload必须带显示字段
    你的推送内容里必须包含alert(或者拆分的title/body)、sound这些字段,iOS系统才会在通知中心显示它——哪怕app已经被强制关闭。举个正确的payload例子:

    {
      "aps": {
        "alert": {
          "title": "新消息提醒",
          "body": "你有一条未读消息哦"
        },
        "sound": "default",
        "badge": 1
      }
    }
    

    如果你的payload只有content-available:1(静默推送),那强制关闭时既不会显示通知,也不会唤醒app。

二、像WhatsApp通话那样:强制关闭时唤醒app处理推送

如果你的需求是让app在被强制关闭时,还能唤醒并处理推送逻辑(比如弹出通话请求),那普通推送就不够用了,得用PushKit框架的VoIP推送

  • VoIP推送的特殊权限
    Apple专门给语音/视频通话类应用开放了VoIP推送权限,这类推送即使app被用户手动关闭,iOS也会唤醒app,让它在后台处理推送内容,这就是WhatsApp能在关闭状态下弹出通话请求的核心原因。

  • Xamarin.Forms里的配置步骤

    1. 先在Apple开发者后台给你的app开启VoIP服务,生成对应的VoIP推送证书。
    2. 在Xamarin.iOS项目中安装PushKit的NuGet包,然后在Entitlements.plist里勾选「Voice over IP」权限。
    3. 实现PKPushRegistryDelegate,注册VoIP推送:
    var voipRegistry = new PKPushRegistry(NSOperationQueue.MainQueue);
    voipRegistry.Delegate = this;
    voipRegistry.DesiredPushTypes = new NSSet(new NSString[] { PKPushType.VoIP });
    
    1. DidReceiveIncomingPush方法里处理推送逻辑,比如弹出通话提醒的本地通知:
    public override void DidReceiveIncomingPush(PKPushRegistry registry, PKPushPayload payload, string type, NSObject completion)
    {
        // 构造通话提醒的通知内容
        var notificationContent = new UNMutableNotificationContent();
        notificationContent.Title = "来电提醒";
        notificationContent.Body = "张三正在呼叫你";
        notificationContent.Sound = UNNotificationSound.Default;
        
        // 发起本地通知
        var notificationRequest = UNNotificationRequest.FromIdentifier("VoIPCallRequest", notificationContent, UNTimeIntervalNotificationTrigger.CreateTrigger(0, false));
        UNUserNotificationCenter.Current.AddNotificationRequest(notificationRequest, (error) => {
            // 处理通知添加结果
        });
        
        // 必须调用completion方法,否则会被系统判定为异常
        completion.PerformSelector(new ObjCRuntime.Selector("invoke"), null, 0f);
    }
    

三、WhatsApp的实现逻辑

WhatsApp其实是混合用了两种推送机制:

  • 普通文本消息:用APNs普通远程推送,确保用户在app关闭时能看到消息通知。
  • 语音/视频通话:用PushKit的VoIP推送,借助Apple开放的特殊权限,实现关闭状态下的即时通话提醒。

⚠️ 注意:Apple对VoIP推送的审核非常严格,你的app必须确实提供语音/视频通话服务,否则会被拒审,别想着用VoIP推送做其他功能哦。

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

火山引擎 最新活动