iOS 消息推送原理及实现Demo

转自:http://www.cnblogs.com/cdts_change/p/3240893.html


一、消息推送原理:

在实现消息推送之前先提及几个于推送相关概念,如下图1-1

1、Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]);

2、APNSApple Push Notification Service[苹果消息推送服务器]

3、iPhone:用来接收APNS下发下来的消息;

4、Client AppIOS设备上的应用程序,用来接收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  

75生成的“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的!

 

参考文章:http://mmz06.blog.163.com/blog/static/121416962011111710934946/

     http://user.qzone.qq.com/75869071/infocenter%23!app=2&via=QZ.HashRefresh&pos=1351564081#!app=2&via=QZ.HashRefresh&pos=1351564081


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iOS消息推送 APNs 是指苹果公司提供的一种用于向移动设备发送远程通知的服务。而使用 Java 实现 HTTP/2 协议发送推送消息可以通过以下步骤完成。 首先,我们需要使用 Java 开发一个 HTTP/2 客户端,以实现APNs 服务器的通信。我们可以使用 okhttp、netty 或者 java-http-client 等库来实现这个客户端。 其次,我们需要获取 APNs 服务器的推送地址和凭证认证信息。推送地址常见的有两个,分别是开发环境和生产环境。在获取推送地址之后,我们还需要生成一个包含认证信息的 JWT(JSON Web Tokens),以进行身份验证。 然后,我们可以使用 Java 客户端向 APNs 服务器发送 HTTP/2 请求。请求的内容应包括推送通知的 payload 和设备的设备标识符(Device Token)等信息。设备标识符是由 APNs 服务器为每个设备生成的唯一标识符,用于指定接收消息的设备。 最后,我们可以根据 APNs 服务器的响应来判断推送是否成功。APNs 服务器会返回一个包含推送结果的响应,其中包括推送是否成功以及失败的原因。 总之,使用 Java 实现 HTTP/2 协议发送 iOS 消息推送 APNs,需要开发一个符合 HTTP/2 协议的客户端,生成凭证信息并发送请求。通过与 APNs 服务器的通信,可以将推送消息发送到指定的 iOS 设备上。 ### 回答2: iOS消息推送APNs)是苹果公司提供的一种服务,用于将推送通知发送到iOS设备上的应用程序。实现APNs推送的一种方法是使用HTTP/2协议发送请求。 在Java中,可以使用一些第三方库来实现使用HTTP/2协议发送APNs消息推送。其中,使用Netty库是一个常见的选择。 首先,你需要引入Netty库的相关依赖项,并创建一个Netty的客户端连接。 然后,你需要创建APNs推送的请求和消息内容。APNs消息使用JSON格式进行发送,你需要构建一个JSON对象来包含推送的内容。这个内容可以包括通知标题、内容、图标等。 接下来,你需要将JSON对象编码为二进制数据,并发送给APNs服务器。此时,你可以使用Netty库提供的HTTP/2的客户端请求来发送。 发送请求的过程包括建立连接、发送帧、处理响应等步骤。你需要设置请求的方法、URL、Headers以及Payload(即消息内容的二进制数据)。 最后,你需要在接收到APNs服务器的响应后,进行对应的处理和错误处理。常见的响应包括成功响应和错误响应。 总结起来,实现使用HTTP/2协议发送APNs消息推送的过程,包括建立连接、构建JSON消息、编码为二进制数据、发送请求、处理响应等步骤。通过使用Netty库,可以简化这个实现过程,并提供了更好的性能和可扩展性。 ### 回答3: 在iOS中,APNS(Apple Push Notification Service)是一种用于向苹果设备(如iPhone、iPad、iPod Touch等)推送消息的服务。而在Java中,可以使用HTTP/2协议来实现发送APNS通知。 HTTP/2是一种基于HTTP/1.1的进化版本,其在性能和效率上有所提升。使用Java实现HTTP/2协议发送APNS通知的步骤如下: 1. 首先,需要准备APNS证书。在苹果开发者账号中创建一个推送证书,并将其导出为.p12文件。 2. 将.p12文件转换为Java可用的密钥和证书形式。可以使用Java的KeyTool工具来完成此步骤。 3. 使用Java的HTTP/2库,如Jetty或Netty,建立与APNS服务器的HTTP/2连接。这些库可提供与APNS服务器之间的双向通信。 4. 在建立连接后,可以使用HTTP/2的帧和流的概念向APNS服务器发送推送通知。可以使用Jetty或Netty提供的API来创建和发送HTTP/2帧。 5. 在发送通知时,需要将推送的相关信息,如设备令牌、推送内容等,封装为HTTP/2的帧数据发送到APNS服务器。 6. APNS服务器收到推送请求后,会根据设备令牌等信息将通知推送给相应的设备。 总之,使用Java实现HTTP/2协议发送APNS通知需要准备证书、使用HTTP/2库建立连接,并利用API创建和发送HTTP/2帧,最后将推送信息发送给APNS服务器。这样就可以通过HTTP/2协议向iOS设备推送消息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值