教你搞定IOS远程消息推送APNS

一、引言

IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://blog.csdn.net/jaccty/article/details/47429617这篇博客中有详细的介绍,这里主要讨论远程推送的流程与配置过程。

二、远程推送机制的原理

1、从一张很火的图说起

搜索IOS远程推送,你总能看到一张如下的流程示意图,因为这张图确实很火,所以我也将它引用在此:


这张图示意的很清晰,大致意思是这样:你的应用服务端将消息发送到apple的APNS服务器,APNS服务器将消息推送到指定的Iphone,最后由Iphone负责将消息推送至你的APP。在此先不说这个过程是如何实现的,仅仅看这个流程,你可能会觉得,在你们服务端和客户端之间增加了一个apple的APNS,不是增加开发者的负担么?其实结果恰恰相反,因为apple对推送的统一管理,使我们开发者的工作变得异常简单。

2、服务端如何连接到客户端的

如果你是做android开发的,你一定非常了解长链接与心跳包。事实上,大部分的android应用的推送也确实是通过长链接来实现的。因为android系统的开放性,APP是很容易做到自启动和后台长链接的,而心跳验证,就是始终保证长链接属于接通状态,然后由服务端直接推送消息。如果IOS开发者也采用这种思路,就十分困难了,在IOS中想要保持一个APP服务始终不被系统杀死,我只能说太难了。通过上面的流程图,对比android的推送思路,我们很容易明白,IOS中其实也始终有一个长链接,那就是系统本身,这个长链接始终与APNS服务器相连,然后统一管理所有应用程序的推送。

3、这是IOS推送机制的优势?

下面的这些,只是我个人的一些看法。系统并无优劣,优劣在于个人喜好。

1、因为推送的服务端是appleID的验证用户,推送可靠性会高。

2、所有推送消息由APNS统一管理,效率高。

3、在客户端只需系统维护一个长链接,节省了用户流量消耗和手机的性能消耗,并且提高了安全性,使得有恶意推送和流氓软件的几率降低。

三、分分钟让你的APP收到远程推送

1、工欲善其事、必先利其器——创建推送证书

(1)请求CSR文件

在MAC应用程序中找到钥匙串访问,打开它。

点击选项栏中的钥匙串访问中的证书助理:


选择从证书颁发机构申请证书:


填写电子邮件和名称,选择储存到磁盘,然后继续。

这时,我们存储的地方有了这样一个文件:CertificateSigningRequest.certSigningRequest。

(2)导出密钥文件

打开钥匙串,会发现多了一对密钥,名字就是上面你填写的常用名称。

我们选择专用密钥进行导出,然后设置一个我们自己的密码:


这时候我们又有了一个后缀名为.p12的文件。

(3)创建AppId

到https://developer.apple.com的member Center:


用你付过费的开发者appleID登陆后,选择Certificates:



如果你的项目已经创建了APP id,则可以不用重新创建,但是你创建的APP id必须要支持远程推送。如果还没有创建,点击加号,创建一个:


之后的界面中APP ID有两种类型:Explicit和Wildcard,分别是特殊的和通配的,我们需要推送功能,这个ID不能是通配的,所以我们选择第一个。

这里需要填的的Bundle ID必须和我们App中的一致:

在APP ID的服务设置中,将Push Notification勾选上,点击continue。

之后点击submit,最后点击Done。这时我们的APP IDs列表中会出现我们刚才创建的APP ID。

(4)创建证书

点击我们刚才创建的APP ID,你会看到Push Notification一行为未设定的。我们点击Edit。

在Push Notifications设置里是如下界面,development是开发证书,Production是产品证书,我们现在需要测试,所以用Development证书,上线时要使用Production证书。点击Create Certificate。

接着点击continue,如下界面会让我们选择一个CSR文件,我们第一步创建的文件在这里派上用场了,选择那个文件,点击Generate。

将创建好的证书下载到电脑中:


至此,我们已经有了三个文件了,分别是CSR文件,.p12文件,.cer文件。要将这三个文件放在同一个目录下。.cer文件分为测试和产品两个,需要哪个自行选择。写了这么多,我们的准备工作可算是做完了,不要灰心,其实你的推送工作基本上也就做完了。只是申请过程麻烦了一些,但工程的代码,我们几乎不用怎么配置。

2、兵马未动、粮草先行——服务端进行信息推送的设置

(1)处理证书

打开终端cd到我们上面得到的三个文件所在的目录。

在终端执行如下命令:

?
1
$ openssl x509 - in  aps_development.cer -inform der -out PushCert.pem

aps_development.cer是刚才生成的.cer文件的文件名。会在当前文件夹中生成一个pem文件,这是我们服务端对应的证书。

再执行如下命令:

?
1
$ openssl pkcs12 -nocerts -out PushKey.pem - in  key.p12

key.p12是上面生成的.p12文件的文件名。这时终端会让输入密码,这里的密码就是上面我们设置的密钥的密码。输入密码后回车,如果密码正确,会让我们输入新密码(一定切记),输入两次后,终端会提示成功创建PushKey.pem文件。

最后一步,将我们生成的两个pem文件和成为一个:

?
1
cat  PushCert.pem PushKey.pem > ck.pem

(2)测试证书是否可用

在终端执行下面的命令:

?
1
$ telnet gateway.sandbox.push.apple.com 2195

等一小会,如果终端显示下面的情形,则证书正常。


然后执行如下命令:

?
1
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushKey.pem

输入密码后回车显示如下的结果则连接成功:


3、天涯海角、一步之遥——应用程序中的配置

在我们项目的AppDelegate中添加如下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
double  version = [[UIDevice currentDevice].systemVersion doubleValue]; //判定系统版本。
if (version>=8.0f){
         UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert) categories:nil];
         [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
         
     } else {
         UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
         [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
     }
}
 
- ( void )application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{  // 处理推送消息
     NSLog(@ "userinfo:%@" ,userInfo);
     NSLog(@ "收到推送消息:%@" ,[[userInfo objectForKey:@ "aps" ] objectForKey:@ "alert" ]);
}
- ( void )application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *) error {
     NSLog(@ "Registfail%@" ,error);
}
-( void )application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
     NSLog(@ "%@" ,deviceToken); //这里的Token就是我们设备要告诉服务端的Token码
}

下面是网上搜的PHP服务端的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
//这里填写设备的Token码
$deviceToken  '74314cc9e8f747e2fa96c2c1585c830cdf994de6b453ce9fa1c09ba396b2f9e9' ;
//这里是密钥密码
$passphrase  'abcabc' ;
//推送的消息
$message  '这是一条推送消息' ;
 
 
$ctx  = stream_context_create();
stream_context_set_option( $ctx 'ssl' 'local_cert' 'ck.pem' ); //ck文件
stream_context_set_option( $ctx 'ssl' 'passphrase' $passphrase );
 
// Open a connection to the APNS server
$fp  = stream_socket_client(
     'ssl://gateway.sandbox.push.apple.com:2195' $err ,
     $errstr , 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,  $ctx );
 
if  (! $fp )
     exit ( "Failed to connect: $err $errstr"  . PHP_EOL);
 
echo  'Connected to APNS'  . PHP_EOL;
 
// Create the payload body
$body [ 'aps' ] =  array (
     'alert'  =>  $message ,
     'sound'  =>  'default'
     );
 
// Encode the payload as JSON
$payload  = json_encode( $body );
 
// Build the binary notification
$msg  chr (0) . pack( 'n' , 32) . pack( 'H*' $deviceToken ) . pack( 'n' strlen ( $payload )) .  $payload ;
 
// Send it to the server
$result  = fwrite( $fp $msg strlen ( $msg ));
 
if  (! $result )
     echo  'Message not delivered'  . PHP_EOL;
else
     echo  'Message successfully delivered'  . PHP_EOL;
 
// Close the connection to the server
fclose( $fp );
     
?>

把上面的PHP文件和我们的ck文件放在同一目录下。在终端的当前目录下,执行如下命令:

?
1
$php push.php

如果我们的设备王略正常,就可收到推送的消息了:



四、几点注意

1、如果终端发送信息时提示密钥不可访问之类的错误,请检查是否cd到了当前目录,如果还存在问题,将密钥部分从新生成一次。

2、注意PHP代码中的字符为英文字符。
  • 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、付费专栏及课程。

余额充值