APNs 是 Apple 的推送通知服务,它使第三方开发人员能够向安装在 Apple 设备上的App发送消息通知。

此文主要介绍如何让App支持 APNs。

开启推送功能

App ID 支持推送

登录苹果开发者网站,进入 Certificates, Identifiers & Profiles 页面,点击侧边栏中的 Identifiers,然后在列表中找到项目对应的 App ID(即 Xcode 项目中的 Bundle Identifier),点击并进入配置编辑页面,然后选择 Push Notifications 旁边的复选框,最后点击右上的 Save(保存)按钮,结果如下图所示:

App 工程配置推送功能

要在App中添加推送权限,请在 Xcode 项目中启用推送通知功能。

打开 Xcode 项目,在 Project > Target > Capabilities 页面中点击红框中的加号按钮,然后选择并添加 Push Notifications,添加后的结果如图中黄框所示:


App 代码设置流程

客户端App基本流程

  1. 注册通知;
  2. 向苹果APNs服务请求deviceToken;
  3. 把拿到的deviceToken发给消息推送服务器;(三方的or自己的)
  4. 处理通知相关回调方法;

关于deviceToken

  1. 同手机不同App, deviceToken不同;
  2. 同一个App删除, 重新安装deviceToken会变化;
    (以上结论由实测验证得出)
ios客户端直接推送 ios如何打开推送权限设置

注册通知

App Code

静默推送和普通推送的区别

测试环境:
iPhone12 Pro
iOS 16.0.2 (20A380)

静默推送消息格式

其中"content-available": 1, “sound”: “default”, 是必填项key-value.(根据实测)
“alert”:“”, alert配置与否, 不影响结果.

但是, 在后台时,
如果alert配置了内容, 会有default提示音.并且顶部有消息提示.
触发的方法一致, 是didReceiveRemoteNotification.
这时点击顶部消息提示, 会触发didReceiveNotificationResponse.

静默推送会触发didReceiveRemoteNotification, (无论前后台)
但是, 在前台时,
会先触发willPresentNotification,
再触发didReceiveRemoteNotification.

App挂起时(或者未启动)(不在前台也不在后台)
会先触发didFinishLaunchingWithOptions,
再触发didReceiveRemoteNotification.

普通推送

在后台时,

根据sound配置提示声音(默认),
根据alert显示顶部消息.
点击消息, 触发didReceiveNotificationResponse.

在前台时,

直接触发willPresentNotification, 无默认提示音.

App挂起时(或者未启动)(不在前台也不在后台)
同在后台时,

代理没设置时

如果未设置代理,
[[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];
通通走方法didReceiveRemoteNotification

服务端推送方式

苹果提供了两种方式来发送通知,这两种方式各有优点和缺点,云服务对这两种方式都支持,可以根据需要选择其中一种推送方式。

基于 Token 的推送方式(推荐)。

  • 理论上它比基于证书的方式更快。
  • 支持多个云服务应用使用同一个 Key。
  • 支持用同一个 Key 给苹果开发者账号下的多个应用推送通知。
  • 支持用同一个 Key 给苹果开发者账号下的测试、正式应用推送通知。
  • 生成的 Key 不再有过期时间,无需像证书方式那样需要定期重新生成证书。

基于证书的推送方式。

  • 证书和苹果的 App ID 绑定,一个证书只能向其绑定的苹果应用推送通知。
  • APNs 有开发、生产两个环境,可能需要为不同环境下的苹果应用配置对应的证书。
  • 证书有过期时间,需要定期重新生成并配置。

总的来说,基于 Token 的推送方式在配置步骤、易用性以及功能性上,都要优于基于证书的推送方式,因此我们推荐使用基于 Token 的推送方式。

参考&感谢


阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。