2012年11月10日 星期六

iOS APNS Server端處理

都是參考別人資料做的,這邊做個紀錄
從APPLE那邊取得兩個檔後
cer (apns.cer)
private key file (key.p12) 

1、將apns.cer轉為pem檔

    $ openssl x509 -in apns.cer -inform der -out apns-cer.pem

2、key.p12轉為pem檔
    $ openssl pkcs12 -nocerts -out key.pem -in key.p12
    Enter Import Password: 
    MAC verified OK
    Enter PEM pass phrase: 
    Verifying - Enter PEM pass phrase: 

3、可將key.pem的密碼移除
    $ openssl rsa -in key.pem -out key-nopwd.pem

4、測試連apns server看看能不能過
    $ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-cer.pem -key key-nopwd.pem

5、連apns server沒問題的話,將兩個pem檔包在一起
    $ cat apns-cer.pem key-nopwd.pem > apns.pem

簡單的PHP Code測試

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', "/var/www/apns.pem(pem檔存放路徑)");
$fp = stream_socket_client($applePath, $err, $errstr, 60, STREAM_CLIENT_CONNECT,$ctx);
if(!$fp){
echo "connect error";
print_r($err);
        print_r($errstr);
exit;
}

$body['aps'] = array('alert' => "test message", 'badge' => 1, 'sound' => 'default', );
$payload = json_encode($body);
$msg = chr(0) . pack("n", 32) . pack('H*', str_replace(' ', '', "2e14b444b5ceaf776b005bd0a5f661b7dc76e8ff757920677ee7a07e7ba16455(app token注意development跟production環境不同,要對應不同的pem檔)")) . pack("n", strlen($payload)) . $payload;
                    
if (!fwrite($fp, $msg)){
echo "no";
}else{
echo "ok";
}

但這是簡單的發送,實際運用可能有一些地方需要exception handle,
PHP的部份我就直接用 ApnsPHP http://code.google.com/p/apns-php/ 這套library來實作了
若是用Yii Framework可以用這套https://github.com/shiki/yii-apns 基本上是基於ApnsPHP 改寫的


沒有留言:

張貼留言