APNS全称为Apple Push Notification Service,可以实现在app不启动时也能通过服务器推送到iOS端特定设备的功能。

APNS的实现原理为先发送设备的UDID和应用的Bundle Identifier到APNS服务器,APNS加密后生成一个deviceToken,这个deviceToken是给特定UDID的设备(必须安装了相应的应用)发送推送消息的依据。要发送通知,只需要按照特定格式向APNS发送deviceToken和通知内容。

要实现远程通知,必须成为开发者,然后配置远程调试证书,最后获取deviceToken,进行调试。

下面从配置证书开始,一步一步介绍APNS的使用步骤。

【远程调试证书的配置】

登陆Member Center,选择Certificates,Identifiers & Profiles这一项,再点击Certificates文件夹进入证书配置。

①首先要配置App IDs,APNS禁止使用模糊的App ID,因此必须为应用指定一个明确的ID用于通知。

点击App IDs,然后点击右侧的+进入证书创建,填写Name、Bundle ID(不要使用通配符,要明确),注意最后选择Push Notifications。

然后Continue一步步完成创建。

②配置远程调试证书,点击左侧Certificates中的All,然后点击右侧的+,开始创建,注意有两个选项:

现在选中的这一项是调试证书,下面的那个是发布证书,调试时只配置第一个即可,发布时只需要再重新配置一个发布证书即可完成。

配置证书需要选择一个SCR文件,这个文件来自电脑,创建方法如下。

打开Application,选择Keychain Access,然后在顶部菜单栏按下图选择:

在弹出的对话框中随意填写即可,注意保存方式选择Saved To Disk即可保存到电脑中。

然后选择这个SCR,即可创建出远程调试证书,下载安装即可。

注意:在有配置更改时,需要重新生成一下Profiles,点击Provisioning Profiles下面的All,点击右侧的+,一步步的选择App ID、开发者、设备等之后,就可以生成,下载后双击会跳转到Xcode,这就代表安装成功。

经过这些步骤就完成了证书的配置。

【deviceToken的获取】

因为只有真机才有UDID,因此无法用模拟器得到deviceToken,苹果在iOS8以后更改了获取方法,还需要主动请求授权,代码如下。

if ([[UIDevice currentDevice].systemVersion doubleValue] < 8.0) {
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge];
}else{
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]]; // categories用户在通知中心回复消息等。
// 主动要求授权
[application registerForRemoteNotifications];
}

接收deviceToken有两个方法,一个用于接收token,一个用于接收error。

// 获取到用户当前的deviceToken时调用
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ NSLog(@"%@",deviceToken); }
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"%@",error); }

如果配置没问题,则在设备上允许之后就能打印出deviceToken,一般用法是把token保存到服务器的数据库中以便发送通知。

【发送通知】

要发送通知,比较复杂,为了调试可以下载pushMeBaby,可以模拟推送服务器发送消息。

因为工程较老,因此编译会报错,只需要把报错的那句注视掉就可以使用了。

发送通知需要deviceToken和cer文件,cer就是刚才配的调试证书,把它添加到工程中,注意勾选Add Target,注意文件名应该和init方法中的相同,改为apns.cer。

self.certificate = [[NSBundle mainBundle] pathForResource:@"apns" ofType:@"cer"];

修改init中的deviceToken为刚才打印的,注意是<>内的部分,不要包含<和>。

启动软件,界面如下:

点击Push即可发送。

【接收通知】

在iOS8之前,是不支持真后台的,所谓真后台是指的应用程序在后台也能处理UI操作。

下面先介绍iOS8之前的通知。

①App启动,在后台,如果点击了Push,会显示一条通知,如果点击这条通知,会打开App,并且调用下面的方法:

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

    // userInfo就是发送的JSON数据体。

}

②App启动,在前台,不会现实通知,但是仍然会调用上面的方法。

③App关闭,如果点击了Push,会显示一条通知,点击通知会启动App,不会调用上面的方法,但是可以从didFinishLaunchingWithOptions:方法的launchOptions的UIApplicationLaunchOptionsRemoteNotificationKey键的值是个字典,里面存着的也是JSON数据体。

【后台任务】

从iOS8开始,可以在后台更新UI,要使用这个功能,要打开开关,并且Push的内容也有改变。

①首先按照下图打开Background Modes开关,勾选remote notifications。

②接收到远程通知时,如果App在运行,会调用下面的方法:

// 接收到远程通知就会调用, iOS8使用这个来处理后台消息(非通知)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ completionHandler(UIBackgroundFetchResultNewData); // 必须要回调,告诉系统是否成功,以便系统在成功时才处理UI。 }

注意回调通知系统是否处理成功,以便系统更新UI,无论是前台还是后台,均可以在这里更新UI。

(九十六)借助APNS实现远程通知、后台任务的更多相关文章

  1. iOS Notification – 远程通知

    本文讲解iOS的远程通知的基本使用,主要包括远程通知的类型,处理远程通知的场景,以及远程通知相关证书的配置等等. 一.APNs简介 APNs是苹果公司提供的远程通知的服务器,当App处于后台或者没有运 ...

  2. 使用JPush(极光推送)实现远程通知

    使用JPush(极光推送)实现远程通知 远程推送是APP 必备的功能, 现在第三方的 SDK 已经做的非常完备了, 在 iOS10.0出来之后, 极光推送也及时更新了他的 SDK, 今天小试了一下效果 ...

  3. iOS10以前的本地通知和远程通知

    一.简介 分为本地推送和远程推送2种.可以在应用没有打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用:如果用户不同意则下次打开程 ...

  4. iOS 远程通知(Remote Notification)和本地通知(Local Notification)

    ios通知分为远程通知和本地通知,远程通知需要连接网络,本地通知是不需要的,不管用户是打开应用还是关闭应用,我们的通知都会发出,并被客户端收到 我们使用远程通知主要是随时更新最新的数据给用户,使用本地 ...

  5. 收到远程通知,怎么区分是点击通知栏提醒进去的还是在foreground收到的通知?

    我现在是要区分点击通知栏的通知进入应用还是点击应用图标进入的,1,开始程序都是在后台.2,接受通知都是在foreground状态.applicationdidFinishLaunchWithOptio ...

  6. APNS推送通知消息负载内容和本地格式字符串

    来源:http://hi.baidu.com/tangly888/blog/item/62948520121870559358074f.html 翻译苹果文档 地址:  翻译:tangly http: ...

  7. ios开发——实用技术OC-Swift篇&本地通知与远程通知详解

    本地通知与远程通知详解 一:本地通知   Local Notification的作用 Local Notification(本地通知) :是根据本机状态做出的通知行为,因此,凡是仅需依赖本机状态即可判 ...

  8. iOS9中如何注册远程通知

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在以往的版本中,我们可以通过: [[UIApplication ...

  9. iOS10 远程通知需要有entitlements的支持

    今天测试远程通知,发现ios9上可以收到,但是ios10上无法收到,原来是忘记开下面这个选项了: 这样看来iOS9 对这个entitlement没有什么依赖,但是10却是必须打开的!

随机推荐

  1. bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5524  Solved: 2074[Submit] ...

  2. 新版Eclipse打开jsp、js等为文本编辑,没有JSP Editor插件问题

    刚从官网下载安装的Eclipse Java Oxygen.2但是打开的jsp文件尽然默认文本编辑器打开,就js文件也是一样,纳闷! 网上搜索一番,原来缺少web开发相关工具, 下面给插件安装方法: 1 ...

  3. Hash算法入门指南(聊点不一样的算法人生)

    前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...

  4. What's New In MySQL 8.0

        由于8.0内有很多C++11特性.需要gcc4.8版本以上.Rhel6系列默认gcc是4.7.在安装gcc6.1之后仍然检查不过. 原因可能是6.1版本不一定高于4.7,暂不讨论.鉴于升级gc ...

  5. C语言成语设计第一次作业

    一 1.求圆面积和周长 输入圆的半径,计算圆的周长和面积. 2.流程图 3.测试数据及运行结果 测试数据:r=7 运行结果 4.实验分析 问题:第一次输入提示时未加双引号 解决办法:发现问题后加了双引 ...

  6. .eslintrc 文件

    安装 建议采用全局安装方式 npm install -g eslint 初始化 如果你的项目还没有配置文件(.eslintrc)的话,可以通过指定–init参数来生成一个新的配置文件: `eslint ...

  7. [ 学习笔记 ] Hibernate框架学习之一

    一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...

  8. c#默认类的修饰符。

    类的默认修饰符是internal  当其修饰符为internal时,其他模块不能访问该类, 所以class类的修饰符一般为public

  9. Lock锁子类了解一下

    前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 Java锁机制了解一下 AQS简简单单过一遍 只有光头才能变强! 上一篇已经将Loc ...

  10. CentOS Linux上安装Oracle11g笔记

    CentOS Linux上安装Oracle11g 到 otn.oracle.com 网站上下载 Linux版的oracle 11g 编辑 /etc/sysctl.conf : kernel.shmal ...