您的位置:首页 > 移动开发 > IOS开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: