iOS 下APNS推送处理函数详解

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

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

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

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

  • 推送类型的注册:
[[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

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

    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程序块。

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

void application:(UIApplication*)application didReceiveRemoteNotification:NSDictionary)userInfo fetchCompletionHandler:((^)UIBackgroundFetchResult)completionHandler{
if (application.applicationState == UIApplicationStateActive) {
        NSLog(@"active");
        //程序当前正处于前台
    }
    else if(application.applicationState == UIApplicationStateInactive)
    {
        NSLog(@"inactive");
        //程序处于后台

    }
}

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

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
    "acme1" : "bar",
    "acme2" : 42
}

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

时间: 2024-10-23 22:16:42

iOS 下APNS推送处理函数详解的相关文章

iOS 下APNS推送处理函数具体解释

相比起Android,iOS在推送方面无疑惯例得更好.APNS(Apple Push Notification Service)是苹果公司提供的消息推送服务.其原理就是.第三方应用将要推送给用户的信息推送到苹果server.苹果server再通过统一的系统接口将这些信息推送到用户的手机上.假设对此不舍了解的朋友能够參见这篇文章:一步一步教你做ios 推送 本文着重叫在App端怎样处理推送信息. 主要涉及一下几个比較重要的函数,而这些函数都是AppDelegate类中: - (BOOL)appli

IOS使用APNS推送Payload字节数限制导致推送不成功

这2天需要在推送上加上脚本,找到了badge方法可以加脚本.加上后但是怎么推送也不成功.郁闷了好久,在网上查找相关资料. 终于被我找到原因: "Payload--最多256bytes." 原来是发送的payload字节超过规定字符. 使用payload.getBytes().length得到字节数.查看了下字符个数240个字节,没有超过256,反复测试,得知,256bytes也不够准确.就把原payload中的某些值去掉了(loginUri登录,uri用于跳转),再次测试,推送成功.

iOS:APNS推送主要代码

首先,在AppDelegate.m 中: 1,注册通知 //[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch.

关于windows下的c++的rand函数详解

rand不是真正的随机函数,是伪随机函数 srand设置随机函数种子 srand设置一个参数后,每调用一次rand产生一个随机数 srand(1000001) rand  –  21589 rand  –  29335 rand  –  14469 srand参数相同,多次调用rand依次返回的值相同, srand (1000001) rand  - 21589 srand (1000001) rand  - 21589 srand (1000001) rand  - 21589 srand入参

银钻娱乐客服15687949443开户关于bind()函数详解

相信很多接触过jQuery的小伙伴对bind()函数一点都不陌生吧,但是很多小伙伴还不是很清bind()的含义与使用,bind()函数用于为每个匹配元素的一个或多个事件绑定事件处理函数.今天我们就带大家详细介绍下jQuery中关于bind()函数详解! 此外,你还可以额外传递给事件处理函数一些所需的数据. 执行bind()时,事件处理函数会绑定到每个匹配元素上.因此你使用bind()所有button元素绑定了click事件,是为当时文档中存在的每个button元素绑定click事件.如果之后你向

iOS开发之功能模块--Apns推送中的的json格式介绍

在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 aps 字典.它使用字符串而不是字典作为 alert 的值,该负载同样包含了一个自定义的属性数组. { "aps" : { "alert" : "message" },//alert表示推送的消息文本 "parm" : [ &quo

亲手教会你如何用苹果ios应用的推送

1. 什么是推送通知 消息通知分本地通知和远程推送通知,是没有运行在前台的应用程序可以让它们的用户获得相关消息通知的方式.消息通知可能是一条消息,即将发生的日历事件,或远程服务器的新数据.当被操作系统显示时,本地通知和推送通知看起来一样.它们可以显示一个警告信息或在应用程序的图标上面显示一个徽标.它们也可以在警告窗或徽标显示时播放一段声音.推送通知是在 iOS 3.0 和 Mac OS X v7.0 之后引入的.本地通知是在 iOS 4.0 之后引入的.它们都不支持 Mac OS X,当用户被通

手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客

http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. 推送流程 3.1 获取设备device_token阶段 3.2 消息推送过程 3.3 完整流程介绍 4. Push机制类型 5. 正式开工 5.1 准备工作 5.2 证书生成 6. 客户端制作 7. php服务器端配置 8. 测试 8. 附录: 8.1 JSON示例 8.2 检验证书是否正确的方法:

iOS开发 iOS10推送必看

iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这里讲啦,我在这里说的,是指原有工程的适配. 1.首先我们需要打开下面的开关.所有的推送平台,不管是极光还是什么的,要想收到推送,这个是必须打开的哟~ QQ20160914-4.png 之后,系统会生成一个我们以前没见过的文件,如图: QQ20160918-0.png-5.8kB QQ20160918