iOS远程推送
2015-09-10 20:45
351 查看
远程推送通知
什么是远程推送通知顾名思义,就是从远程服务器推送给客户端的通知(需要联网)
远程推送服务,又称为APNs(Apple Push Notification Services)
为什么需要远程推送通知?
传统获取数据的局限性:
只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容
远程推送通知可以解决以上问题
不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知
远程推送通知使用须知
所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接1、什么是长连接:只要联网了,就一直建立连接。
2、长连接的作用:时间校准;系统升级;查找我的iPhone。
3、长连接的好处:数据传输速度快;数据保持最新状态。
DeviceToken处理流程:苹果手机通过建立的长连接发送消息APNs服务器,APNs服务器返回给苹果手机一个DeviceToken,应用程序(即客户端)通过返回的DeviceToken,发送消息和DeviceToken到公司服务器,公司服务器中保留所有用户的DeviceToken。
远程推送流程:公司服务器接收到客户端发送的消息时根据对用的DeviceToken,发送到APNs服务器,APNs服务器再将消息推送给目标客户端
获得DeviceToken的流程(一下获得证书和描述文件操作均在苹果开发者网站进行–https://developer.apple.com):
准备证书(在哪台电脑上用哪台设备调试哪个应用)
远程推送的第一步是要创建App ID目的是说明哪个App需要使用推送服务
为远程推送服务创建的App ID一定要是全称,不能带有*
— CertificateSigningRequest.certSigningRequest:存储着电脑的信息
—ios_development.cer :让电脑具备真机调试的功能
—利用设备UDID标识在Devices一栏中注册设备
—创建App ID(应用的唯一标识,Bundle Identifier)
—电脑调试证书 + 设备的UDID + App ID == 描述文件(mobileprovision)
最终得到2个APNs SSL证书
APNs Development iOS:真机调试用的证书APNs Production iOS:发布程序用的证书
生成描述文件
安装证书、证书配置
配置应用的Bundle Identifier注意!
远程推送只能在真机上测试!因此先要保证真机调试的环境没有问题!准备工作完成后,在工程中书写代码
客户端如果想接收APNs的远程推送通知,必须先注册(得到用户的授权)一般在App启动完毕后就马上注册
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 注册远程推送(第一次注册服务时会弹出提示框,让用户授权) // 先判断操作系统版本(iOS8.0前后版本设置不同) if ([[UIDevice currentDevice].systemVersion floatValue] > 8.0){ // 推送设置--通知页面配置选项 // UIUserNotificationTypeAlert 推送弹框 // UIUserNotificationTypeSound 推送的声音 // UIUserNotificationTypeBadge 推送的角标 UIUserNotificationSettings *userSetting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]; // 注册--推送设置 [application registerUserNotificationSettings:userSetting]; // 注册远程推送 [application registerForRemoteNotifications]; }else{// 8.0之前的推送方法 UIUserNotificationSettings *userSetting = [UIUserNotificationSettings settingsForTypes:UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound categories:nil]; } // 接收到远程推送 NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; if (userInfo) { // 点击远程推送消息进入应用 // 可以跳到指定页面显示推送的消息 } else { // 点击程序图标进入应用 } return YES; }
注册成功后会调用AppDelegate的下面方法,得到设备的deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ // 此方法里应该将返回的 deviceToken 发送到公司服务器 }
当设备接收到远程推送通知时
如果程序是处于关闭状态,系统会在给用户展示远程推送通知的同时,将程序启动到后台,并调用AppDelegate的下面方法
可以在这个方法中做些数据下载操作,争取在用户点击通知前,就将数据下载完毕
下载完毕要调用completionHandler这个block,告知下载完毕
completionHandler(UIBackgroundFetchResultNewData
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInf{ // 可以跳到指定页面显示推送的消息 //角标清零 application.applicationIconBadgeNumber = 0; }
当用户点击远程推送通知,会自动打开app,这里有2种情况
app并没有关闭,一直隐藏在后台让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
- (void)application:(UIApplication )application didReceiveRemoteNotification:(UILocalNotification )notification;
app已经被关闭(进程已死)
启动app,启动完毕会调用AppDelegate的下面方法- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions;
launchOptions参数通过UIApplicationLaunchOptionsRemoteNotificationKey取出远程推送通知对象
远程推送的内容格式(服务器推送给客户端的内容格式—JSON)
有关推送通知的更多知识,可以参考苹果官方文档
PushMeBaby
PushMeBaby是一款用来测试ANPs的开源Mac项目它充当了服务器的作用,用法非常简单
它负责将内容提交给苹果的APNs服务器,苹果的APNs服务器再将内容推送给用户的设备
PushMeBaby的主页:https://github.com/stefanhafeneger/PushMeBaby
JPush
什么是JPush?一套远程推送解决方案,支持android和iOS两个平台
它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量、开发复杂度
更多的信息,可以参考JPush官方网站:https://www.jpush.cn
集成iOS SDK的步骤可以参考
http://docs.jpush.cn/pages/viewpage.action?pageId=2621727
相关文章推荐
- Cordova for iOS
- IOS开发-琐碎的知识点总结1
- iOS 导入相册视频文件
- IOS开发 IBOutlet与IBAction
- iOS开发系列—内存管理
- iOS开发 Debug-发布时取消打印(NSLog)
- iOS中正确的截屏姿势
- iOS 数据持久化-----plist
- iOS中计算文本的宽高
- iOS 相册 相机
- iOS:视图切换的第一种方式:模态窗口
- bullet, iOS真机编译错误error: identifier or immediate expression expected解决方法
- ios开发细节及相关框架
- iOS 笔记总结一
- iOS开发-Xcode Debug、Release、Archive、Profile、Analyze概念解释
- IOS - svn软件Cornerstone使用
- 获取iOS设备的相关信息
- iOS知识小集 第四期(2015.08.15)
- IOS-命令行打包ipa
- iOS xib传值--定义方法传值