本文讲解iOS的远程通知的基本使用,主要包括远程通知的类型,处理远程通知的场景,以及远程通知相关证书的配置等等。

一、APNs简介

APNs是苹果公司提供的远程通知的服务器,当App处于后台或者没有运行时,如果后台需要发送通知,那么就需要借助APNs服务器。在App接收通知的过程中,通知的发送路径是:

Provider -> APNs服务器 -> iPhone -> App

其中,ProviderAPNs之间有一个TLS连接,Provider通过该连接将远程通知发送到APNs服务器;iPhoneAPNs之间也有一个TLS连接,APNs将远程通知通过该连接发送给iPhone,进而通知用户某App有新通知。

iPhoneAPNs连接图如下:

注意:

  • 此连接由系统建立并维持,无需开发人员管理;
  • 上图中的证书是苹果设备本身的证书,与开发者账号中申请的证书无关;
  • 每个设备与 APNs 服务器只需维持一条连接。

ProviderAPNs连接图如下:

注意:

  • 此连接由 Appbundle ID 唯一确定
  • 上图中 Provider certificate 需要通过开发者账号申请生成,其中包含 Appbundle ID

APNs工作流程

注意:

  • 首先客户端需要向 APNs 服务器注册当前 AppAPNs 会返回一个 Token(注意这个过程要求App有合法的证书,需要包含推送功能的证书);注意不同应用在同一设备上获取的 Token 不同,同一应用在不同设备上获取的 Token也不同,所以 Token 是跟设备与 App 唯一绑定的
  • App 拿到 Token 后需要将其发送给 Provider
  • Provider 发送推送通知时,指定 Token 和通知内容,并发送给 APNs 服务器
  • APNs 服务器会将通知发送给 Token 对应的设备上
  • 设备收到通知后,根据 APNs 发过来的通知中带有的 bundle ID 信息区分是哪个App的远程通知(这里应该是根据 Token 来获取 bundle ID)

APNs的Feedback 机制

FeedbackAPNs 服务器提供的用于减少服务器压力以及优化网络的服务,工作流程图如下:

注意:

  • Provider 发送一个远程通知给 APNs 服务器,APNs 服务器会检测目的设备是否在线,如果不在线,那么 APNs 服务器会暂存该消息
  • 当目的设备上线后,APNs 会发送暂存的消息给目的设备(按照苹果官方说法暂存消息只会暂存最后一条消息,之前的消息会被丢弃);
  • 如果目的设备很久都没有上线,那么 APNs 消息会把该设备加入 feedback 名单。Provider 可以定期去 APNs 拉新 feedback 名单;
  • Provider 再次给之前的设备发送远程通知时,需要检查一下 feedback 名单,如果设备在这个名单,则不再发送给 APNs 了;
  • 当设备重新上线后,Provider 可以再将此设备移除 feedback 名单,当 Provider 更新 feedback list 后,就可以重新给该设备发送远程通知了。当然,feedback list 的更新可能会有周期,如果需要及时有效的更新 feedback list,那么需要 App 打开后,及时通知 Provider
  • 这种机制的好处就是防止发送多余无用的远程通知消息,一方面可以减缓 APNs 服务器的压力,另一方面也可以减少网络流量

二、证书配置

假定已经有开发证书的情况,下面只介绍配置推送证书的步骤

  1. 创建新的App ID
  2. 创建推送证书和发布证书
  3. 创建新的Provisioning Profiles

三、通知类型

远程通知具体可分为普通远程通知静默远程通知

普通远程通知

收到通知后,有文字和声音,点击通知会进入App,然后执行如下方法

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

静默远程通知

收到通知后,没有文字和声音,不用点开通知,也不用打开App,就能执行如下方法

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

静默通知注意点:

  • aps数据中一定要加"content-available" : 1
  • 一定不能加alert,如果加入了alert就不是静默推送了
  • soundbadge也不能加

四、通知处理场景

1.申请通知权限

	if (DEF_IOS10) {
// iOS 10
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
NSLog(@"greet");
} else {
NSLog(@"reject");
}
}];
} else if (DEF_IOS8) {
// iOS 8 和 iOS 9
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
// iOS 7
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound];
}

iOS9以后,每次重新安装应用后得到的 Token 是不一样的,而且每次重装系统也会改变,所以 每次应用启动时都需要按上面的步骤注册一次

2.发送DeviceToken

application:didRegisterForRemoteNotificationsWithDeviceToken:

在这个方法里把deviceToken发送给服务器Provider

3.接收通知

应用在前台

  • iOS6
-(void) application: didReceiveRemoteNotification:
  • iOS7 ~ iOS9
-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:
  • iOS10
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler

应用在后台,但是还活着

iOS6 ~ iOS9 调用方法和应用在前台相同

iOS10

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler

应用被杀死状态

这种情况和应用重新启动类似,应用会调用下面的方法重新启动

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

其中,通知的信息在launchOptions里,

id userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]

参考资料

http://www.jianshu.com/p/ad43bc1a970a

http://www.tuicool.com/articles/AFRvemV

http://blog.csdn.net/hherima/article/details/47133171

图片来自互联网,如有侵权,请联系作者,我怕赔不起......

iOS Notification – 远程通知的更多相关文章

  1. iOS接收远程通知响应方法

    点击 iOS 接收远程推送主要牵扯到的方法有以下五种 (1) - (BOOL)application:(UIApplication *)application didFinishLaunchingWi ...

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

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

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

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

  4. iOS(本地通知与远程通知)

    iOS 推送通知有两种:本地推送.远程推送. 本地推送 :  在不需要联网的情况下,由APP发出推送,常用于某一时刻的通知,如闹钟.本地通送有局限性在于当APP处于后台或者退出时就无法发出通知. 远程 ...

  5. iOS - Notification 通知

    1.Notification 通知中心实际上是在程序内部提供了消息广播的一种机制,它允许我们在低程度耦合的情况下,满足控制器与一个任意的对象进行通信的目的.每一个 iOS 程序(即每一个进程)都有一个 ...

  6. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  7. iOS推送通知

    推送通知 此通知非彼通知. NSNotification是抽象的,看不见的,但是可以监听,属于观察者模式的一种设计模式. 推送通知是可见的,能用肉眼看见的,是真正的和用户打交道的通知. 推送通知分为两 ...

  8. iOS推送通知的实现步骤

    一.关于推送通知 来源:http://blog.csdn.net/enuola/article/details/8627283 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序 ...

  9. (九十六)借助APNS实现远程通知、后台任务

    APNS全称为Apple Push Notification Service,可以实现在app不启动时也能通过服务器推送到iOS端特定设备的功能. APNS的实现原理为先发送设备的UDID和应用的Bu ...

随机推荐

  1. usaco training 4.1.2 Fence Rails 题解

    Fence Rails题解 Burch, Kolstad, and Schrijvers Farmer John is trying to erect a fence around part of h ...

  2. mysql数据库左联的使用(一张数据库表关联到另外一张数据库表)

    左联的数据库表,然后显示的在页面显示的jsp里面改一下代理种类ID的name,这样在页面上显示的不是id了,而是变成你修改了以后相对于的name了

  3. 浅谈viewport

    我们通常在写移动端页面时,往往都会在html页面中加入这样一段话 <meta name="viewport" content="width=device-width ...

  4. zip & tar 压缩文件时排除某个文件夹

    确实是用参数 -x aaa bbb 两个文件夹要写全路径. 如 zip -r test.zip test -x /test/aaa/* -x /test/bbb/* 既包含了文件夹,也可以 zip - ...

  5. C++第二篇--访问控制

    C++第二篇--访问控制 1. 引入 上一篇博文中从结构体引到了类,类当中不仅有数据成员还有一些函数,这些函数被称为成员函数.今天介绍新的内容,类当中的访问控制. 2. 访问控制 当你不添加任何声明, ...

  6. Phpcms整理

    一.先去官网下载一个pc(http://www.phpcms.cn/)进行安装 把下载的pc包放在服务器www目录下: 在地址栏访问localhost/project/install/install. ...

  7. nyoj_253:LK的旅行(旋转卡壳入门)

    题目链接 求平面最大点对. 找凸包 -> 根据凸包运用旋转卡壳算法求最大点对(套用kuang巨模板) 关于旋转卡壳算法 #include<bits/stdc++.h> using n ...

  8. Java 9 揭秘(15. 增强的弃用注解)

    Tips 做一个终身学习的人. 主要介绍以下内容: 如何弃用API @deprecate Javadoc标签和@Deprecation注解在弃用的API中的角色 用于生成弃用警告的详细规则 在JDK ...

  9. LCS 51Nod 1134 最长递增子序列

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10.   Input 第1行:1个 ...

  10. 【css】盒子模型 之 概述

    摘要 一些基本的概念以及常见使用问题 概述 BFC 是css 中布局的核心 - 盒模型,根据块级元素及行级元素可分为块级容器, 行级容器,但容器内部都遵循 BFC BFC 空间布局 备注: IE 的盒 ...