iOS 下APNS推送处理函数详解

简介:

相比起AndroidiOS在推送方面无疑惯例得更好。APNSApple Push Notification Service是苹果公司提供的消息推送服务。其原理就是第三方应用将要推送给用户的信息推送到苹果服务器苹果服务器再通过统一的系统接口将这些信息推送到用户的手机上。如果对此不舍了解的朋友可以参见这篇文章一步一步教你做ios 推送

本文着重叫在App端如何处理推送信息。主要涉及一下几个比较重要的函数而这些函数都是AppDelegate类中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

做过iOS 开发的人对这个函数都会很熟悉这是在程序结束启动并即将运行时调用的通常一些初始化的工作可以在这个函数中处理。同样的推送的相关初始化操作也需要在这个部分完成。这一部分的工作主要分为两部分 推送类型的注册 

?

1
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationAlert];

这行代码告诉了系统该程序注册的推送消息类型通常包括badge、声音以及alert通知。 处理程序没有启动时的推送消息 如果是程序正在运行或者说程序正在后台那么这个时候处理推送消息的工作都是在

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 或者


-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

中完成。但是如果用户点击推送通知的时候程序还没有被启动这个时候以上两个函数都是接收不到用户的推送通知的这个时候需要在applicationUIApplication *application didFinishLaunchingWithOptionsNSDictionary*) launchOptions 函数里面进行处理。而推送消息的相关信息就存储在launchOptions这个字典里。具体参照如下代码


?

1
2
3
4
5
6
7
8
9
10
NSDictionary* pushInfo = [launchOptions objectForKey:@ "UIApplicationLaunchOptionsRemoteNotificationKey" ];
if (pushInfo)
{
     NSDictionary *apsInfo = [pushInfo objectForKey:@ "aps" ];
     if (apsInfo)
     {
         //your code here
     }
     
}




- (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken & - (void)application:(UIApplication *)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *)error

为了让device端可以接收到推送消息需要将设备的token传送到苹果的服务器这个token就相当于设备的识别码每一台苹果设备都有唯一的token苹果的服务器就是通过这个token找到对应的设备并传送相应地消息。这两个函数就是在传送token成功或者失败后调用的用户在对应的函数里面做一些相应地处理。 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo和


-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

都是程序在运行过程中无论当前程序处于前台还是后台接收到推送消息的处理函数。根据苹果的官方文档建议大家使用


-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

因为前者在程序处于后台的时候是无法接收到推送信息的经实测-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo其实可以接收到不知道是怎么回事希望大虾解疑。另外就是-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 还有一个作用。根据苹果给出的文档系统给出30s的时间对推送的消息进行处理此后就会运行CompletionHandler程序块。

在处理这类推送消息即程序被启动后接收到推送消息的时候通常会遇到这样的问题就是当前的推送消息是当前程序正在前台运行时接收到的还是说是程序在后台运行用户点击系统消息通知栏对应项进入程序时而接收到的这个其实很简单用下面的代码就可以解决


?

1
2
3
4
5
6
7
8
9
10
11
12
void application:(UIApplication*)application didReceiveRemoteNotification:NSDictionaryuserInfo fetchCompletionHandler:((^)UIBackgroundFetchResult)completionHandler{
if (application.applicationState == UIApplicationStateActive) {
         NSLog(@ "active" );
         //程序当前正处于前台
     }
     else if (application.applicationState == UIApplicationStateInactive)
     {
         NSLog(@ "inactive" );
         //程序处于后台
         
     }
}



关于userInfo的结构参照苹果的官方结构



?

1
{

?

1
"aps" : {

?

1
"alert" : "You got your emails." ,

?

1
"badge" : 9 ,

?

1
"sound" : "bingbong.aiff"

?

1

?

1
"acme1" : "bar" ,

?

1
"acme2" : 42

?

1
}

?

1

即key aps对应了有一个字典里面是该次推送消息的具体信息。具体跟我们注册的推送类型有关。另外剩下的一些key就是用户自定义的了。









本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1744280  ,如需转载请自行联系原作者








相关文章
|
iOS开发
IOS - iOS 12 的“隐式推送”功能怎么用?
IOS - iOS 12 的“隐式推送”功能怎么用?
326 0
IOS - iOS 12 的“隐式推送”功能怎么用?
|
JSON 数据格式 iOS开发
APNS IOS 消息推送JSON格式介绍
在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送。下面积累了我在进行apns推送时候总结的 apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 aps 字典。
3290 0
|
传感器 iOS开发
iOS 14.2正式版推送,多项改进,建议更新
近日苹果推送了iOS/iPadOS 14.2的正式版,虽然更新包只有700多兆,但内容还是非常丰富的。
114 0
iOS 14.2正式版推送,多项改进,建议更新
|
开发工具 iOS开发 开发者
iOS13即将到来,iOS推送Device Token适配详解
关于提前适配iOS13 苹果推送DeviceToken的通知 随着苹果iOS13系统即将发布,个推提前推出DeviceToken适配方案,以确保新版本的兼容与APP推送服务的正常使用。iOS13的一个重要变化是"[deviceTokendescription]" 会受不同运行环境及系统的影响而发生变化,如果未及时做好适配工作,会导致SDK绑定到错误的DeviceToken,从而影响APN推送。
3515 0
|
开发工具 Android开发 iOS开发
搞定iOS推送SDK集成,看这篇文章就够了!
一次偶然的机会,公司的项目要用到推送,我自己本来就很懒,不愿意去弄整套APNS的流程,刚好之前跟朋友聊起过他们的产品中集成了个推的Android推送,说是体验还可以,那这次我就试一下他们的iOS推送。
3011 0
|
Android开发 数据安全/隐私保护 iOS开发
APNS IOS 消息推送
一.Apns简介: Apns是苹果推送通知服务。 二.原理: APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备);然后,将服务器的信息接收并且保存在APNs当中,APNs从其中注册的列表中查找该IOS设备(设备可以为iPhone、iPad、iPod Touch,版本是iOS3.
1650 0
|
测试技术 iOS开发
APNS IOS 消息推送沙盒模式和发布模式
在做.NET向IOS设备的App进行消息推送时候,采用的是PushSharp开源类库进行消息的推送,而在开发过程中,采用的是测试版本的app,使用的是测试的p12证书采用的是ApnsConfiguration.ApnsServerEnvironment.Sandbox模式,而在项目发布之后,现在使用的是发布版的证书进行推送,发现不能推送成功,最后才发现在使用PushSharp进行发布后的项目的推送需要使用ApnsConfiguration.ApnsServerEnvironment.Production模式。
1346 0
|
iOS开发
APNS IOS 消息推送处理失效的Token
在开发苹果推送服务时候,要合理的控制ios设备的Token,而这个Token是由苹果服务器Apns产生的,就是每次app问Apns要Token,由苹果服务器产生的Token会记录到Apns里面,我们需要根据该Token进行制定设备的消息推送,所有Token需要我们自己去记录和管理,每个设备对应唯一的Token,而app的用户登录会有自己约束的别名,与该tokne进行关系绑定,这样按该别名进行推送,就可以找到对应的Token,进而推送到该iso设备上,对应失效的Token我们需要访问苹果的feedbackServer,拿取失效的Token,然后把本地记录的失效token进行移除。
1958 0
|
网络协议 安全 Java
基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)
本文原作者:liuyan731,原文地址:liuyan731.github.io/2017/12/05/How-To-Use-APNs-Pushy,内容有改动。
3465 0