文章分两部分:
第一部分介绍,在MAC OS中使用一段php代码 模拟 服务器往APNS服务器发送推送消息内容,以及在iOS 端收到推送消息的过程;
第二部分介绍java服务器需要的授权文件的生成
一,PHP苹果APNS授权文件的生成与测试
采用simplePush测试Member center下载和本地钥匙串生成的授权文件是正确的
此部分之前默认读者已经生成了该有的如下文件(若不清楚自行搜索如何生成如下三个文件):
- The CSR(CertificateSigningRequest.certSigningRequest)
- The private key as a p12 file (PushKey.p12)
- The SSL certificate, aps_development.cer
step1:打开终端,进入以上三文件所在目录,输入openssl命令生成pem文件(注:以下命令均是在终端中输入)
(1).cer文件变成.pem文件
openssl x509 -in aps_development.cer -inform der -out PushCert.pem
(2)私钥.p12变成.pem文件
openssl pkcs12 -nocerts -out PushKey.pem -in pushKey.p12
之后需要输入私钥密码,并新设pem密钥密码,确认pem密钥密码
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
(3)合并证书和密钥pem文件
cat PushCert.pem PushKey.pem >ck.pem
(4)测试并验证当前网络能连接到苹果sandbox 服务器
telnet gateway.sandbox.push.apple.com 2195
命令端口返回提示,若connected ,则说明连接成功;之后等待15s左右,连接自动被cut掉
Trying 17.172.232.18...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.
Connection closed by foreign host.
(5)测试当前打包的证书
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushCert.pem -key PushKey.pem
需要验证pem密码
Enter pass phrase for PushKey.pem:
Step2.PHP简单服务器的制作,
具体可下载本人资源中的simplePush.php代码。
php代码如下:
<?php
// Put your device token here (without spaces):
$deviceToken = '10bc7c7d972ccb4e740e212336238a1862d040e979d17a236b1495c246a63312';
// Put your private key's passphrase here:
$passphrase = '123456';
// Put your alert message here:
$message = '来自SimplePush的推送消息';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
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',
'badge' => 16
);
// 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);
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSString *deviceTokenMessage = [deviceToken.description substringWithRange:NSMakeRange(1, deviceToken.description.length-2)];
NSLog(@"deviceTokenMessage:%@",deviceTokenMessage);
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
if (!error) {
return;
}
NSLog(@"get deviceToken failed:%@",error.description);
} run之后获取deviceToken字段,粘贴复制,去掉中间空格后,替换红色字段1
(2)红色字段2替换为你生成的ck.pem你所设置的密码
(3)生成的ck.pem文件和simplePush.php文件放在同一个目录下,并将红色字段3替换为ck.pem,本文中以ck.pem为例,不用替换。
(4)save simplePush.php文件
Step3.测试push
(1) iOS设备按HOME键进入到应用后台
(2)终端进入到simplePush.php所在目录
php simplePush.php
(3)祝贺你,在手机上成功收到push消息。ck.pem可以直接在php服务器中用做授权文件使用
注意:(1)sandbox.push推送服务器对应的授权文件只有3个月有效期,过期前需要重新revoke
(2)发布版本需要使用distribution证书,需要重新生成授权文件
二 ,Java服务器 iOS设备推送授权文件生成与测试
未完待续。。。