一、什么叫做远程推送通知(what)
顾名思义,就是从远程服务器推送给客户端的通知(需要联网) 远程推送服务,又称为APNs(Apple Push Notification Services)
二、为什么需要远程推送通知?(why)
传统获取数据的局限性:只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容 远程推送通知可以解决以上问题:不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知
三、使用远程推送(how)
3.1什么是长连接
1、长连接:只要联网了,就一直建立连接。 2、长连接的作用: 时间校准、系统升级、查找我的iPhone。 3、长连接的好处: 数据传输速度快、数据保持最新状态。
3.2推送调试工具
PushMeBaby 工具 使用方法:1.工程中导入推送证证书。 2.更改 ApplicationDelegate 中init方法中的对应值,修改deviceToken及推 送的内容。 3.运行,点击推送Push。 4.推送成功程序右上角就会相应数字的角标。
3.3收到推送通知收到的回调
(1)前台和后台的推送回调这个代理方法(退出的设置在didFinishLaunchingWithOptions方法中) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo; (2)前台、后台和退出的推送都会调用这个代理方法(iOS 7之后可用) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
3.4远程推送通知原理
远程推送通知必须要真机调试,因为真机才有UDID,才能够生成deviceToken. 应用的Bundle ID必须在苹果开发者中心创建,并且生成真机调试证书(.cer文件或.p12文件),推送通知调试证书(.cer文件或.p12文件)和profile描述文件(.mobileprovision文件). 如果是要打包测试和发布,必须生成打包测试推送通知证书和发布推送通知证书.
3.5远程推送客户端流程
1、需要配置真机调试证书, 推送测试证书 2、请求苹果获得deviceToken 想苹果请求deviceToken iOS 8.0之后必须请求授权 获取当前设备的UDID, 以及, app bundle id , 向苹果服务器发送请求, 获取deviceToken // 远程推送APNs必须使用真机调试,并且必须使用付费的开发者账号配置好对应的bundle ID和真机推送证书 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 向苹果请求DeviceToken [self requestDeviceToken]; return YES; } // ------------------------------------------------------------------------ // 向苹果请求DeviceToken - (void)requestDeviceToken { // iOS 8.0之后必须请求授权 if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { // 1.请求授权 UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:setting]; // 2.自动获取当前设备的UDID, 以及, app bundle id , 向苹果服务器发送请求, 获取deviceToken [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { // iOS 8.0之前不用请求授权 // 2.自动获取当前设备的UDID, 以及, app bundle id , 向苹果服务器发送请求, 获取deviceToken [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert]; } }
3.监听APNs苹果服务器响应的deviceToken(目的是为了配置PushMeBaby中的DeviceToken)
// ---------------------------------------------------------------------------- // 当我们调用对应的api, 发送请求, 获取deviceToken , 苹果服务器响应之后, 就会调用这个方法, 把deviceToken 传给我们 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // 获取到DeviceToken时,将deviceToken值写入到第三方APNs推送服务器PushMeBaby(使用Socket编写的调试服务器),可以在GitHub上下载 NSLog(@"%@", deviceToken); } // ---------------------------------------------------------------------------- // 当获取DeviceToken失败是会调用该方法 - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"注册失败: %@", error.localizedDescription); }
4.客户端监听远程推送通知的点击
/ ---------------------------------------------------------------------------- // 监听远程推送通知点击(优先级较低),接收到通知,用户点击进入才会调用该方法 /** 当接收到推送通知之后, 并且满足一下条件 app 在前台时 ,会调用该方法 app 从后台进入到前台 (App一开始在后台, app 锁屏),点击通知会调用该方法 app 完全退出 如果app 完全退出, 这时候,如果用户点击通知, 打开APP , 不会调用这个方法 */ - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"接收到远程推送通知"); // UISwitch *sw = [[UISwitch alloc] init]; // [self.window.rootViewController.view addSubview:sw]; } // ---------------------------------------------------------------------------- // 监听远程推送通知点击(优先级较高),一接收到通知就会立即调用该方法 /** 当接收到推送通知之后, 并且满足一下条件 当我们实现, 这个方法时, 上面一个方法不再执行 计时APP 完全退出, 也会调用这个方法 completionHandler : 统计我们处理的时间, 耗电量, 刷新预览图片 效果: 当用户收到通知之后, 即使没有点击也会调用这个方法 条件: 1 .需要勾选后台模式 remote notification,在后台 2. 必须保证发送的推送通知格式, 包括 "content-available":"随便传" 3. 执行completionHandler 回调代码块 {"aps" : { "alert" : "This is some fancy message.", "badge":1, "content-available":"随便传" } } */ - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"fetchCompletionHandler: 接收到远程推送通知"); UISwitch *sw = [[UISwitch alloc] init]; [self.window.rootViewController.view addSubview:sw]; completionHandler(UIBackgroundFetchResultNewData); } @end
3.6常见错误
二、极光推送配置设置
1. 首先进入苹果开发者中心,创建证书,包括,调试(真机测试)证书(开发和发布),这两个证书将用在xcode中,
2.再创建推送证书,需要导出钥匙串文件.cer,也是发布推送证书和开发推送证书,并且在push Notifications 勾选,表示允许推送。
3.需要创建appid,创建的时候需要设置xcode的bundle ID(bundle id 又包括完整的如,www.xxx.dddd,带*号的如,www.xxx.*,一般还是用完整的),
4.证书都创建好了以后,创建配置文件,也是包括开发和发布的。
5.导出双击下载好的证书,还是导出p12文件,创建极光推送账号,上传开发和生产环境的p12文件。
详情请看:http://www.tuicool.com/articles/jEvqQvr 史上最全的远程推送之极光推送
极光推送的集成 JPush iOS SDK 集成指南 链接: http://docs.jpush.io/guideline/ios_guide/ JPush iOS SDK 教程 链接: http://docs.jpush.io/client/ios_tutorials/ JPush SDK下载 链接: https://www.jpush.cn/common/products