关于推送,要说好像也没太多东西,但要细说,又是有很多可以说。如何配置,今天就不说了,各个平台不一样,每个平台都会有自己的配置文档,像友盟的,看它的官方文档就行。今天主要说一下接收跟一些业务逻辑。留个记录,方便自己以后查阅。苹果官方文档通知部分
1.数据格式
可能有很多人都没注意到这一点,苹果推送通知的格式是固定的,甚至还规定了特定字段的数据格式,如下是一般APP接收到的推送的数据格式,其中alert字段下的数据,是直接显示在设备通知栏的,iOS开发者并不能像安卓那样,先读取到数据,再处理选择性展示,所以title,body等字段的数据格式,都是规定死。开发者如果需要更多的数据,一般都是放payload字段下,或者自定义的key,如gameID等。如有敏感数据,最好加密传输。
{
“aps” : {
“alert” : {//APP直接展示的内容
“title” : “Game Request”,
“subtitle” : “Five Card Draw”
“body” : “Bob wants to play poker”,
“title-loc-key” : “国际化多语言用到的字段”,
“title-loc-args” : “国际化,用以替换本地string文件的内容”,
“mutable-content” : “判断是否富文本推送的标志”,
},
“category” : “GAME_INVITATION”//标志通知样式
},
“gameID” : “12345678”
“payload” :“服务器给APP的数据”
}
具体各个字段的数据格式,可以看官方文档,这里贴出一部分
以上便是一般推送通知所需注意的,本来想写的挺多的,后来看了一天官方文档,不知道要写些什么了,先放一个前人的连接,总结的较为详细关于推送的文章。
2.富文本推送通知
这个,上面那篇文章也有说到,我这里记一下自己的总结。富文本,就是大家平时看到的在通知栏显示图片,播放视频,甚至可以玩小游戏 widget game。富文本推送通知,主要是用到两个扩展类,NotificationContentExtension, NotificationServiceExtension。
关于这两个扩展类,网上也有很多资料,这里就不再赘述,可自行搜索一下,我主要记一下我觉得比较关键的点。
富文本,主要用的在推送消息里的两个key,category ,mutable-content,
- category,用来标志通知类型,你可以添加多个扩展类以展示不同类型的通知,从而配置不同UI,代码中,就是用category去区分选择用哪一个扩展类去展示;
- mutable-content,只有当mutable-content为1时,NotificationServiceExtension才能成功拦截消息;
补一句,多看官方文档。
3.点击推送消息后的页面跳转
这里要分3种情况
- APP在前台或APP在后台但已启动
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
此时消息处理,页面跳转等逻辑就可以在这里处理
- APP在后台且未启动
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
此时通知的内容为,UIApplicationLaunchOptionsRemoteNotificationKey
NSDictionary *pushNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
注意当用户之间点击APP图标进入APP时,pushNotification为nil,也就获取不到推送消息的内容了,只有用户点击推送消息进入APP,才能获取推送内容。且,此时程序还是会跑"didReceiveRemoteNotification"方法的。按道理这时候(他人的结论)
这个时候会走didReceiveRemoteNotification这些的方法(有很多人认为不会走,经过测试这个是会走的),但是这这里面写跳转什么的 ,就有点比较难处理了,因为didFinishLaunchingWithOptions这个方法没有走,先走的didReceiveRemoteNotification再走的 didFinishLaunchingWithOptions 。这时候很多app的基本设置,比如做的跟视图,自动登陆,等等很多的注册什么的都还没执行,就直接跳转这个是很麻烦的处理起来,所以一般是在“ didFinishLaunchingWithOptions”方法下去处理页面跳转逻辑
但是我也试过不在“ didFinishLaunchingWithOptions”做任何处理,直接都是在“didFinishLaunchingWithOptions”处理,APP也是能完美运行。如果有遇到不能直接在“didFinishLaunchingWithOptions”处理的,可以留个评论,有知道的大神也麻烦告知一下,谢谢了。
以上,简单的总结。不全面,有错误烦请指正。
参考文章
- 苹果官方文档通知部分
- iOS推送之远程推送
- iOS 点击推送消息跳转页面
- iOS 点击推送消息跳转指定界面