做IOS开发也有好几年了,期间免不了要跟证书打交道,记得因为证书被坑了N次,每次制作或者更新都要百度谷歌一番,为此抽出点时间将自己制作推送证书的过程记录下来,加深记忆的 同时,希望也能帮到为此困惑的亲们。(ps:开发狗都不容易啊╮(╯▽╰)╭)
1.打开钥匙串,制作证书请求文件(这一步就不多说了,不会的请右转)
在证书助理里填写相关字段,注:常用名称对应钥匙串里生成后的密钥对名称
点击继续,本地存储certSigningRequest文件后,可以在钥匙串里看到对应的密钥信息,
2.制作推送证书
登录苹果开发者中心https://developer.apple.com/,进入 account,进入Profiles,选择第一项certificates/production(以发布推送证书为例,制作开发版推送证书与此相同),点击右上角 “+”,创建证书。
选择“In-House and Ad Hoc”(企业级),并点击下一步
下一步直到选择上传CSR文件界面,这个CSR File 就是我们从证书助理请求生成的文件,上传然后下一步,选择要绑定的app id(即要实现推送服务的APP ID),完成创建。
2.制作后台可用的推送证书相关文件
下载已生成的推送证书存储至本地:aps.cer,双击安装到钥匙串。找到已安装的证书,导出并设置密码,得到appPushKey.p12 文件
目前为止 已有 appPush.certSigningRequest(证书请求文件)
aps.cer (原始推送证书)
appPushKey.p12(安装推送证书后,从钥匙串导出的加密P12文件)
格式转换:
openssl x509 -in aps.cer -inform DER -out appPushCert.pem-outform PEM (将aps.cer转换为pem格式文件)
openssl pkcs12 -nocerts -out appPushKey.pem-in appPushKey.p12 (将appPushKey.p12转换为pem格式文件)
cat appPushCert.pem appPushKey.pem >AllInOne.pem (得到可以供php调用的pem文件)
openssl pkcs12 -export -in AllInOne.pem -out AllInOne.p12 (得到可以供java后台调用的p12文件)
全部过程完成后,可以对推送证书进行验证:
openssl s_client -connect gateway.sandbox.push.apple.com:2195-cert appPushCert.pem-key appPushKey.pem
出现类似截图信息 则表示推送证书有效可用。
3.后台服务测试代码
PHP:
// Put your device token here (without spaces):
$deviceToken = 'f46bdb2a34c3f8e02c50c1f4213cf1aa9a2bd4fadfba5876da1c7f432a15ceb4';
// $deviceToken = '1843D7E2-97A6-44F8-9A2E-E18A8D516A6A';
// Put your private key's passphrase here:密语
$passphrase = 'wangfeng1990';
// Put your alert message here:
$message = '新的待办任务hahahah!';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'AllInOne.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
//gateway.sandbox.push.apple.com:2195
// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.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' => '1'
);
// 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);
?>