▲点击上方“CocoaChina”关注即可免费学习iOS开发
原文链接:http://www.jianshu.com/p/e9c313df746f
本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解。
推送服务可以说是所有 App 的标配,不论是哪种类型的 App,推送都从很大程度上决定了 App 的 打开率、使用率、存活率 。因此,熟知并掌握推送原理及方法,对每一个开发者来说都是必备技能,对每一个依赖 App 的公司来说都至关重要。
从 iOS 10 新增的 UserNotifications Framework
可以发现,Apple 整合了原有散乱的 API,并且增加了许多强大的功能。以 Apple 官方的角度来看,也必然是相当重视推送服务对 App 的影响、以及对 Apple iOS 生态圈长远发展的影响。
准备篇
Tip 1:推送通知(Push Notification)必须购买 Apple 开发者账号,并使用特定的推送证书
原理篇
Tip 2:推送通知本身是 iOS 系统的行为,所以在 App 没有运行(没有在前台也没有在后台)的时候:
Tip 3:手机向 APNs 注册推送服务
1. 在代码中注册推送服务:
#ifdef __IPHONE_8_0
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge| UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
}
#else
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif
2. 在第一次触发这段代码的时候,会有一个系统弹窗,询问你是否允许该 App 要给你推送信息。当你选择允许时,系统会打包 App+手机唯一标识+证书 信息发送至 APNs 服务器注册推送服务,APNs 系统会对该手机安装的该 App 是否有推送权限进行验证,所以必须要加入了 Apple Deveice 的手机,使用对应 App 的推送证书才能够成功的注册。
3. 如果注册成功,则可以在 AppDelegate.m
的如下方法中获取到 deviceToken
,它是对 该手机+该App 组合的一个唯一标识,当使用远程推送时,只需将推送消息发给指定的 deviceToken
即可使推送信息传达给指定手机的指定 App 上。因此如果你使用第三方,就需要在这个方法里将 deviceToken
传给第三方。(在 iOS 9 为了更好的保护用户隐私,会出现多次重复删除/安装 App 导致 deviceToken
不断变化的情况。有时会出现一条推送手机会收到 2 次的问题,属于 iOS 9 系统问题)。
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[JPUSHService registerDeviceToken:deviceToken];//将 deviceToken 传给极光推送
}
4. 如果以上步骤均成功,此时你能够取到第三方提供的设备注册 id。能否取到该 id 值,可以作为判断设备是否能够成功推送的标准(见 Tip 6 - Registration ID)。因为当你取到该值时必然:
Tip 4:推送通知从 服务端 --> App 代码 的过程
使用你们公司或第三方的服务端向 APNs 发送推送请求(请参考苹果 APNs 相关资料,或者第三方推送提供了更简单的 REST API)。
APNs 接收并验证推送请求。
APNs 找到设备下发推送。
手机收到推送通知,系统根据 App 状态进行处理:
推送通知内容篇
Tip 5:推送通知分为 本地/远程 2 种类型:
推送目标篇
别名、标签、Registration ID 均是第三方提供的用于更方便地指定推送目标的功能。
Tip 6:推送根据目标的不同可分为:
广播
别名 alias 推送
标签 tag 推送
第三方提供的功能。
可设置多个、可增加、清空。
用于指定多样的属性,如 『1000』+『daily』+『discount』 可用于表示月消费超过 1k、喜欢购买日用品、偏好折扣商品的用户。
如果要删除,需要在上次设置时,将设置的 tags 保存至 NSUserDefaults
,本次剔除不需要的 tag 后,再重新设置。
推送时可指定多个 tag 来下发同一内容。
手机如果设置了推送指定的多个 tag 中任一个tag,都能够收到推送消息。如指定 『1000』+『globe』+『original』 (千元级消费者、全球购、原价),那么设置了 『100』+『globe』+『discount』(百元级消费者、全球购、折扣价)的用户可以收到该推送消息。
Registration ID 推送
应用内消息篇
Tip 7:应用内消息(以下简称消息 )和推送通知的区别,消息:
组合大招篇
Tip 8:tags 的组合技巧
Tip 9:通知+消息的组合技巧
| 通知 | 消息 |
---|
送达时间 | 可能存在几秒延迟 | 几乎无延迟 |
获取时机 | 处于前台或后台能获取内容 | 仅处于前台能获取内容 |
离线内容 | 保留『一段时间』,过期会抛弃,无法查询历史内容 | 始终保留,可查询全部历史内容 |
系统展示 | 会展示(静默推送或App处于前台不展示) | 不展示 |
由于各自的特性都存在差异,因此二者结合使用是使得 App 推送性能最大化的必然选择:
QQ/微信 聊天。会同时下发一组通知+消息 ,如果用户没有启动 QQ,虽有延迟但必然能够先收到通知,在收到通知的提醒之后,用户打开 App,此时收到了离线消息,即时更新 UI,与好友即时地发送/接收消息。(在收到通知后,断网,然后启动 App,你会发现此时手机里并不会显示刚刚通知的内容,因为它是依靠拉取消息来刷新页面的,而不是不够稳定的通知)。
微信号:CocoaChinabbs
▲长按二维码“识别”关注即可免费学习 iOS 开发
月薪十万、出任CEO、赢娶白富美、走上人生巅峰不是梦
--------------------------------------
商务合作QQ:2408167315
投稿邮箱:[email protected]