iOS开发消息推送原理
转载自:http://www.cnblogs.com/cdts_change/p/3240893.html
一、消息推送原理:
在实现消息推送之前先提及几个于推送相关概念,如下图1-1:
1、Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]);
2、APNS:Apple Push Notification Service[苹果消息推送服务器];
3、iPhone:用来接收APNS下发下来的消息;
4、Client App:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制定的一个客户端 app[消息的最终响应者];
上图可以分为三个阶段:
阶段一:Provider[服务端]把要发送的消息,目的IOS设备标识打包,发送给APNS;
阶段二:APNS在自身的已注册Push服务的IOS设备列表中,查找有相应标识的IOS设备,并将消息发送到IOS设备;
阶段三:IOS设备把发送的消息传递给对应的应用程序,并且按照设定弹出Push通知。
具体过程,如下图1-2:
1、[Client App]注册消息推送;
2、[Client App]跟[APNS Service]要deviceToken, Client App接收deviceToken;
3、[Client App]将deviceToken发送给[Provider]Push服务端程序;
4、当Push服务端程序满足发送消息条件了,[Provider]向[APNS Service]发送消息;
5、[APNS Service]将消息发送给[Client App].
二、消息推送实现:
1、生成*.certSigningRequest文件,步骤如下:
[MacBook-应用程序-实用工具-钥匙串访问-证书助手-从证书机构求证书-证书信息(用户电子邮箱地址{填写您的邮箱,如:your@email.com},常用名称{任意,如:PushDemo},请求是:{单选,选择‘存储到磁盘’})-继续-保存],这时会在您指定的地方生成你指定的文件,默认为CertificateSigningRequest.certSigningRequest文件,这里命名为:PushDemo.certSigningRequest.在此*.certSigningRequest已经生成,具体操作步骤如图所示。
如果生成成功,则会在[钥匙串访问|登录|密钥]栏目中列出与*.certSigningRequest关联的密钥,这里是PushDemo,如图所示:
2、新建一个App ID(在苹果开发者账号中配置)
(1) 登录iOS Dev Center,登录成功后,点击(iOS Provisioning Portal对应链接),如图所示:
(2) 创建New App ID[App IDsàManageàNew App ID]( Description{填写您对此App ID 的描述,如:iShop},Bundle Seed ID(App ID Prefix){选择绑定App ID前缀,如:默认选择Generate New},Bundle Identifier(App ID Suffix){填写绑定App ID后缀,如:com.yourcorp.iShop}),如下图所示:
这样就会生成下面这条记录,如图所示:
(3) 配置上一步中生成的App ID,让其支持消息推送[点击2-6中的Configureà选中Enable for Apple Push Notification serviceà点击Configure],如图所示:
(4) Generate a Certificate Signing Request(生成部署请求认证)[点击2-7中的2ConfigureàContinueà步骤1生成的*certSigningRequest文件(这里是iShop. certSigningRequest)-Generate-生成完成后将其下载下来,命名为:aps_developer.cer],双击aps_developer.cer证书{将证书与密钥关联,并将证书导入到MacBook中},如下图所示:
(5) 创建Development Provisioning Profiles[开发许可配置文件](Provisioning| Development|New Profile),具体操作流程如下图所示:
点击图中Submit,生成Development Provisioning Profiles[开发许可配置文件],这里是:iShopDevprofile.mobileprovision如下图所示:
下载此开发许可证书(用于联机调试)。
总结,到现在为止,我们已经生成:A:*.certSigningRequest文件(在步骤(4)中使用,用于生成证书B)、B:aps_developer_identity.cer证书(在Provider[Push服务器]服务端应用使用)、C:*..mobileprovision开发许可配置文件(在Client App客户端应用联机调试使用)。
3、新建一个项目
1. 创建一个"single view application" project,为省事,你设置的"Company Identifier" + "Production“必须和step 5创建的App ID的"bundle identifier"一致。
2. 在AppDelegate.m file的"didFinishLaunchingWithOptions" method里,添加下列代码 (用于为app register push notification feature):
// Let the device know we want to receive push notifications
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
3. 在AppDelegate.m file里添加下列2个methods (用来handle register remote notification with device token和register error的events)
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSLog(@"My token is: %@", deviceToken);
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@"Failed to get token, error: %@", error);
}
4. 运行该app in real device (simulator doesn't support push notification)。这时你会在device上看到一个popup window (该窗口只会出现一次,重装app不会再出现),提示你该app会send push notification给你,如果同意则clickOK,不同意则click "Now allow”。如果选择了OK,那么在"Setting > Notifications“里会有你的app在list里。而且这时你的Xcode output console会显示你的device token。
5: export "PushDemo" private key to a ".p12" file(该文件会在后面生成apns provider的.p12 or .pem file时用到)
1). right click "PushDemo“ private key and select "Export ..."PushDemo
2). Save the private key as “PushDemoKey.p12” file, click Save button
3). 这时会让你输入2次用于加密该.p12 file的密码,例如用"123321",接着会要求你输入一次your mac account password
6: 在5中生成的“PushDemoKey.p12” file和step 6生成的"aps_development.cer"
file是用于APNS provider side的源文件,APNS Provider side进行push
message时要用到的"cert + key" file就是通过这2个file来生成。该Step就是用来生成for APNS provider
side (php version)要用到这个"cert + key" pem file.
1) open Terminal, go to Desktop (假设这2个file都在desktop里)
2) 执行下列命令来生成和apns cer file对应的pem file "PushDemoCert.pem"
openssl x509 -in aps_development.cer -inform der -out PushDemoCert.pem
3) 执行下列命令来生成和private key .p12 file对应的pem file "PushDemoKey.pem" (注意:执行过程会要求你输入"PushDemoKey.p12"创建时设置的密码,以及设置"PushDemoKey.pem”的密码)
openssl pkcs12 -nocerts -out PushDemoKey.pem -in PushDemoKey.p12
4) 执行下列命令把step 11.2生成的cert pem file和step 11.3生成的key pem file合成为一个pem file "PushDemoCK.pem"
cat PushDemoCert.pem PushDemoKey.pem > PushDemoCK.pem
7: 在5生成的“PushDemoKey.p12” file和step 6生成的"aps_development.cer" file是用于APNS provider side的源文件,该step是简单测试这2个file是否有效
1) open Terminal, go to Desktop (假设这2个file都在desktop里)
2) 执行下列命令来测试是否能够connect apple提供的不经加密(即不需使用任何证书!)的APNS server
telnet gateway.sandbox.push.apple.com 2195
如果你看到下列输出,则表示你的电脑可以connect APNS. 如果出现error,那么check你的firewall是否允许outgoing connections on port 2195。
Trying 17.172.233.65...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.
Press Ctrl+C to close the connection.
3) 执行下列命令来测试是否能够connect apple提供的经加密(需使用2) and 3)生成的2个pem file!)的APNS "sandbox“ server for development.
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushDemoCert.pem -key PushDemoKey.pem
执行过程中会要你输入PushDemoKey.pem生成时设置的密码。如果connect server成功,就会等待你输入字串,你可以输入任意字串,然后回车,就会disconnect server。如果连接不成功,则openssl会显示错误信息。
注意:实际上有2个APNS servers: the
“sandbox” server (用于testing) the live server(用于production
mode)。我们这里测试的是sandbox server。live apns server的操作类似。
8: 创建provider server side (php version)
1). Download SimplePush PHP code to your mac machine and then unzip it.
2). 去掉SimplePush folder里的pk.pem (它没用),把step 11.4生成的"PushDemoCK.pem" copy toSimplePush folder
3). 修改simplepush.php file下面几行:
// Put your device token here (without spaces):
//device token来自Step 10的第4点,在output console获取,注意:要去掉前后的尖括号,和中间的所有空格
$deviceToken = '43fcc3cff12965bc45bf842bf9166fa60e8240c575d0aeb0bf395fb7ff86b465';
// Put your private key's passphrase here:
//该值是 3)生成PushDemoKey.pem时设置的密码
$passphrase = '123456';
// Put your alert message here:
$message = 'My first push notification!';
//.....stream_context_set_option($ctx, 'ssl', 'local_cert', 'PushDemoCK.pem');
4). 在terminal window里,go to the simplepush folder,然后执行下列命令,你的iPhone应该会收到一条push message。
php simplepush.php
注意:如果你的app在iphone里是正在运行,而且app是在front end时,当它收到push message时是不会出现在iPhone顶部的notification area的!
iOS开发消息推送原理的更多相关文章
- iOS远程消息推送原理
1. 什么是远程消息推送? APNs:Apple Push Notification server 苹果推送通知服务苹果的APNs允许设备和苹果的推送通知服务器保持连接,支持开发者推送消息给用户设备对 ...
- iOS开发——消息推送跳转
项目开发用集成是极光推送JPush 这里主要是消息推送过来处理对应界面跳转 同时看到两篇写的不错的相关博客分享一下: http://www.jianshu.com/ ...
- 玩转iOS开发 - 消息推送
消息推送
- IOS - 消息推送原理和实现
一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1.Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Pr ...
- iOS 消息推送原理及实现Demo
一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1.Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Pr ...
- iOS 消息推送原理
一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图: 1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Prov ...
- iOS消息推送原理和实现总结
一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图:1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provi ...
- iOS 10 消息推送(UserNotifications)秘籍总结(二)
背景 上一篇博客iOS 10 消息推送(UserNotifications)秘籍总结(一)发布后被 简书编辑推荐至首页,这着实让我受宠若惊啊.可是好事不长,后面发生了让我伤心欲绝的事,我的女朋友不要我 ...
- iOS开发 iOS10推送必看
iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...
随机推荐
- C# RSA加解密和MD5加密
1.RSA加密 /// <summary> /// 加密处理 /// </summary> /// <param name="content"> ...
- win32 音视频相关 api
waveInGetNumDevs waveInGetDevCaps waveInOpen waveInGetDevCaps waveInPrepareHeader waveInAddBuffer wa ...
- Swift 里字符串(九)UTF16View
即以 UTF16 编码的格式来查看字符串. UTF16View 是一个结构体 @_fixed_layout public struct UTF16View { @usableFromInline in ...
- 【BZOJ4916】神犇和蒟蒻 杜教筛
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4916 第一个询问即求出$\sum_{i=1}^{n} { \mu (i^2)} $,考虑 ...
- nodeJS搭建一个简单的(代理)web服务器
前端获取数据时经常遇见跨域问题,以前一直用nginx做反向代理.最近在用vuejs,发现webpack-dev-server的代理简单好用.于是仿照写了一个简单的web服务器,用于非webpack的项 ...
- 从Windows下引导安装ubuntu
Ubuntu引导安装 首先是安装前的准备工作 1.需要安装的 ubuntu系统的ISO镜像. 2.easyBCD引导软件 3.所在的Windows系统(本人win7下安装) 4.DiskGenius( ...
- GDAL VS2010 win7(64位)安装、使用说明(图文解析)
一.电脑配置及安装版本 Win 7(64位机) Visual Studio 2010 GDAL 1.9.2(我也尝试了最新版GDAL1.11.0,应该同样可以用的,只是在重新配置时又选用了老一点的版本 ...
- (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)
当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异常重要了. 原文:http://www.jianshu.com/p/163c96983 ...
- Linq基础知识小记二
书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法. 1.方法语法 方法语法就是通过扩展方法和Lambda表达式来创建查询 (1).链式查询 这种查询方式很多语 ...
- 编译Qt-mingw使用的opencv
set path=D:\dev\IDE\Qt5.7.0\Tools\mingw530_32\bin;%path% cd build_mingw530_32 cmake -G "MinGW M ...