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

iOS端PWA基于FCM实现推送通知方案及后台接收可行性问询

嘿,这个问题问得很到位!刚好我之前做过类似的PWA推送适配,给你详细说说iOS上的实现方案和后台推送的情况:

iOS上基于FCM实现PWA推送通知的方案

其实iOS的PWA推送是依赖苹果的APNs(Apple Push Notification service)实现的,而FCM可以作为中间层帮你对接APNs,不用自己直接写APNs的调用逻辑,步骤大概是这样:

  • 第一步:配置Apple开发者后台
    你需要先在Apple开发者后台创建一个App ID,开启「Push Notifications」权限,然后生成对应的APNs推送证书(分开发和生产环境)。这个证书是用来让FCM和APNs做身份验证的。
  • 第二步:在Firebase控制台关联APNs证书
    登录Firebase控制台,进入你的项目,找到「Cloud Messaging」标签页,在iOS应用配置区域上传你刚才生成的APNs证书。这样FCM就可以帮你把消息转发到APNs了。
  • 第三步:确保你的PWA满足iOS的推送前置要求
    • 必须把PWA添加到主屏幕——iOS上只有主屏幕的PWA才有资格接收推送通知;
    • manifest.json里要包含必填字段:nameshort_namestart_url(不能带参数)、display设为standalonefullscreen,还要有符合尺寸要求的图标(至少192x192和512x512);
    • 前端要注册Service Worker,并且实现pushnotificationclick事件的处理逻辑,这部分和Android/桌面端的逻辑基本一致,但要注意iOS的Service Worker生命周期有差异。
  • 第四步:前端请求推送权限
    代码逻辑和其他平台类似,调用Notification.requestPermission()获取用户授权,授权成功后FCM会自动获取到iOS设备的APNs令牌,之后就可以通过FCM给这个设备发送推送了。
iOS设备后台接收推送的可行性与限制

答案是:可以,但有不少限制,具体情况如下:

  • 后台/关闭状态下的推送接收
    • 如果PWA处于后台(用户切换到其他App,但没关闭PWA),推送通知会正常显示在iOS通知中心,用户点击通知会唤醒PWA并触发对应的Service Worker事件;
    • 对于iOS 16.4及以上版本,即使用户把PWA从多任务界面彻底划掉,添加到主屏幕的PWA依然能接收推送通知;但iOS 16.3及以下版本,彻底关闭后就无法接收了,需要用户重新打开一次PWA。
  • 静默推送的限制
    如果你需要发送不带通知内容的静默推送(用来更新PWA数据),需要在FCM的消息payload里添加apns.payload.aps.content-available: 1,但iOS对静默推送的频率有严格限制,频繁发送会被系统限流,而且静默推送不会触发通知提示,只会唤醒Service Worker执行后台逻辑。
  • 推送格式要求
    常规推送必须包含titlebody字段,否则iOS不会显示通知;如果要自定义通知声音,需要确保声音文件在PWA的资源里,并且在aps里指定sound字段。
额外注意事项
  • iOS版本要求:iOS 16.4及以上版本才完整支持PWA推送功能,之前的版本(比如iOS 15-16.3)有部分支持,但可能存在后台推送不稳定、权限弹窗不显示等问题;
  • HTTPS要求:PWA必须部署在HTTPS环境下(localhost开发环境例外),否则iOS不允许添加到主屏幕和使用推送功能;
  • FCM消息格式示例:给iOS设备发送消息时,要确保apns字段符合APNs格式,比如:
    {
      "message": {
        "token": "你的iOS设备令牌",
        "notification": {
          "title": "新消息提醒",
          "body": "这是一条来自PWA的推送通知"
        },
        "apns": {
          "payload": {
            "aps": {
              "sound": "default",
              "content-available": 1
            }
          }
        }
      }
    }
    

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

火山引擎 最新活动