1.为什么要使用推送?
- 增加用户活跃度
- 唤醒沉睡的用户
- 增加用户粘度
- 化被动为主动
推送切记不能过于频繁,否则会起到相反的作用
2. 推送从服务器到达目标设备过程
- 阶段一:服务端把要发送的消息和目标iOS设备的DeviceToken打包,发送给APNS;
备注:DeviceToken不是一成不变的
- 阶段二:APNS在自身的已注册Push服务的IOS设备列表中,根据DeviceToken查找对应iOS设备,并将消息发送到IOS设备;
- 阶段三:IOS设备把发送的消息传递给对应的应用程序。
3. 实现推送以及程序不同运行状态时收到推送的相应处理
主要介绍程序分别在前台、后台和关闭时收到推送的处理和用户从桌 面进入和从通知栏进入的区别。对于证书的配置就不再赘述,网上有很多教程。本文是基于你的证书都已配置好,并且可以收到推送的情况。程序无论在前台、后台还是关闭的时候时都可以收到推送的,那收到推送的情况就可以分为三种:
-
1.程序在前台时收到推送:
在前台收到通知时,会调用下面这个方法,可以在这个方法里面实现收到通知时刷新或跳转界面的功能;程序在前台收到推送时通知栏不会弹出推送信息
-(void)application:(UIApplication)application didReceiveRemoteNotification:(NSDictionary)userInfo{} -
2.程序在后台时收到推送:
当程序在后台收到推送时,如果info.plist中配置了UIBackgroundModes会调用
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ }
如果用户点击通知栏信息进入程序会调用情况1中的方法,所以在情况1的方法里面需要根据程序在前台还是后台application.applicationState
来执行不同操作 -
3.当程序关闭时收到推送:
程序关闭时收到推送时,用户点击通知栏信息进入应用的时会调用
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {}
并且此时的launchOptions是有值的,即推送过来的信息。可以通过判断launchOptions是否为空,来执行你想要的操作。
- 4.关于未读消息数量角标
设置角标[UIApplication sharedApplication].applicationIconBadgeNumber=badgeNum;
这个方法的确可以设置应用程序的角标的数值。但是当程序关闭时,收到推送后我们要怎么改变桌面程序角标的数值呢?这个设置角标的方法写在哪里呢?所以我觉得最好的办法就是让服务推送过来的信息里加上'badge' = 88
这个键值对。无论是你程序在后台还是关闭,只要推送过来的消息里面有这个键值对,设备就会自动的为你设置好角标的数值。我们要做的就是在我们阅读完一条消息的时告诉服务器,并且将[UIApplication sharedApplication].applicationIconBadgeNumber
减一即可。
最后:关于证书,如果你的后台是以为PHP程序员,请给他最后合成的pem证书,如果是JAVA请给他p12证书。我们在调试的时候可以自己写一份或者网上找一份后台推送的代码,自己推送自己调试,这样利国利民,不用大叫:”谁谁谁,给我推个消息!“了。
发现居然还有人在点赞这篇文章,很遗憾没有更新到iOS 10的推送
发现这篇关于iOS10推送写的还不错 http://www.jianshu.com/p/25ca24215f75
网友评论
iOS 设备收到一条推送(APNs),用户点击推送通知打开应用时,应用程序根据状态不同进行处理需在 AppDelegate 中的以下两个方法中添加代码以获取apn内容
如果 App 状态为未运行,此函数将被调用,如果launchOptions包含UIApplicationLaunchOptionsRemoteNotificationKey表示用户点击apn 通知导致app被启动运行;如果不含有对应键值则表示 App 不是因点击apn而被启动,可能为直接点击icon被启动或其他。
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; // apn 内容获取:NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]
基于iOS 6 及以下的系统版本,如果 App状态为正在前台或者点击通知栏的通知消息,那么此函数将被调用,并且可通过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种情况在此函数中处理:
(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo; // apn内容为userInfo
基于iOS 7 及以上的系统版本,如果是使用 iOS 7 的 Remote Notification 特性那么处理函数需要使用
(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler; // apn内容为userInfo
楼主,接收到通知消息和点击通知栏都只走这个代理是怎么回事