● 顾名思义,就是从远程服务器推送给客户端的通知(需要联网)
● 远程推送服务,又称为APNs(Apple Push Notification Services)
● 为什么需要远程推送通知?
● 传统获取数据的局限性
• 只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的 数据内容
● 远程推送通知可以解决以上问题• 不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知
● 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
● 长连接的作用• 时间校准• 系统升级• 查找我的iPhone • .....
● 长连接的好处• 数据传输速度快• 数据保持最新状态
远程推送流程
获得DeviceToken的流程
>1. CertificateSigningRequest.certSigningRequest:存储着电脑的信息
>2. ios_development.cer :让电脑具备真机调试的功能
>4. 创建App ID(应用的唯一标识,Bundle Identifier)
>5. 电脑调试证书 + 设备的UDID + App ID == 描述文件(mobileprovision)
>6. 安装证书: ios_development.cer:电脑能真机调试
能做的事情:能在某条电脑上利用某条设备调试某个应用 >7. 让某个应用增加推送功能(用到App ID + certSigningRequest) >8.
(在哪台电脑上利用哪台设备调试哪个应用)、
aps_development.cer:推送调试证书(在哪台电脑调试哪个应用的推送服务)
aps_production.cer:推送发布证书
配置应用的Bundle Identifier
证书配置01 – 创建App ID
● 远程推送只能在真机上测试!因此先要保证真机调试的环境没有问题!
● 远程推送的第一步是要创建App ID
● 目的是说明哪个App需要使用推送服务
● 为远程推送服务创建的App ID一定要是全称,不能带有*
证书配置02 – 为App ID创建APNs SSL证书
证书配置03 – 生成描述文件
证书配置04 – 安装
● 建议:先安装cer文件,再安装mobileprovision文件
注册远程推送通知
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[application registerForRemoteNotificationTypes:type]; return YES;
}
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{ NSLog(@"%@", deviceToken); }
接收远程推送通知
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
● 可以在这个方法中做些数据下载操作,争取在用户点击通知前,就将数据下载完毕
● 下载完毕要调用completionHandler这个block,告知下载完毕
completionHandler(UIBackgroundFetchResultNewData);
点击远程推送通知
● app并没有关闭,一直隐藏在后台
• 让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
- (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(UILocalNotification *)notification;
● app已经被关闭(进程已死)• 启动app,启动完毕会调用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
● launchOptions参数通过UIApplicationLaunchOptionsRemoteNotificationKey 取出远程推送通知对象
#import "HMAppDelegate.h"@implementation HMAppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ // 注册远程通知服务(第一次注册服务的时候会弹出提醒框,让用户授权) [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert]; UILabel *label = [[UILabel alloc] init]; label.backgroundColor = [UIColor lightGrayColor]; label.frame = CGRectMake(0, 100, 320, 300); label.font = [UIFont systemFontOfSize:15]; label.numberOfLines = 0; [self.window.rootViewController.view addSubview:label]; NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; if (userInfo) { label.text = [userInfo description]; } else { label.text = @"直接点击app图标启动的程序"; } return YES;}/** * 获得了设备想DeviceToken */- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ NSLog(@"注册远程通知成功----%@", deviceToken); /** 1.将deviceToken发送给公司的服务器 c330833f 248c4fed e87068b6 c4b90ee8 a2b57119 aac2b93d 3f2eb27f e7d44c8c c330833f 248c4fed e87068b6 c4b90ee8 a2b57119 aac2b93d 3f2eb27f e7d44c8c */ /** 2. */}/** * 接收到远程推送通知时就会调用 */- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"接收到远程通知--%@", userInfo[@"userInfo"]);}@end