Titaniumアプリでプッシュ通知(Push Notification)【iOS版】

push-notification_iosアプリ側にプッシュ通知しようと調査したときの覚書。まずはiOSから。

開発環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA
サーバー:CentOS 6.5, PHP 5.4.32

 

参考サイト

 

目次

  1. APNsとの通信下準備。証明書署名要求(CSR)を作成
  2. iOS Dev CenterでPush Notification可能なApp IDを作成
  3. App IDと証明書署名要求を提出して証明書を取得
  4. Linuxサーバーで使いやすいようにPEMフォーマットに変換
  5. プッシュ通知を受け取るデバイス用にProvisioning Profile作成
  6. アプリにプッシュ通知がきたときの動作を記述
  7. サーバーから通知テスト

 


1.APNsとの通信下準備。証明書署名要求(CSR)を作成

iOSの場合はApple Push Notification service(APNs) へプッシュ通知したい情報を送ると各端末に自動でプッシュしてくれる。

APNsから信頼してもらうために署名要求を提出して、署名(サイン)してもらった証明書を取得する必要がある。

まずはMac上で証明書署名要求(CSR)を作る。

  1. Keychain Accessを起動
  2. Keychan Access → Certificate Assistant → Request a Certificate From a Certificate Authority...を選択
  3. 「User Email Address」「Common Name」を入力して「Saved to disk」を選択してContinue.
  4. パスフレーズを入力

実際はLinuxサーバーからAPNsにアクセスするので、証明書署名要求(CSR)を作成する過程で作られる秘密鍵をエクスポートしておく。

Keychain Accessの「Keys」を見ると、さっき作ったCommon Nameで秘密鍵(private key)があるはず。

  1. 右クリックしてExportを選択
  2. 「.p12」が選択されていることを確認してSave.
  3. パスワードを入力

このp12ファイルはサーバーに置いておく。

 


2.iOS Dev CenterでPush Notification可能なApp IDを作成

Xcodeが自動生成する「Xcode iOS Wildcard App ID」はPush NotificationできないのでApp IDを新規作成する。

iOS Dev CenterからProvisioning Profile → Certificates, Identifiers & Profiles → Identifiersを選択。

  1. 「+」をクリック
  2. 「Push Notifications」をチェックしてContinue.

 


3.App IDと証明書署名要求を提出して証明書を取得

iOS Dev CenterのCertificatesを選択。

  1. 「+」で新規作成。
  2. 開発用の場合は「Apple Push Notification service SSL (Sandbox)」を選択
  3. App IDはさっき作ったのを選択
  4. CSRも作ったのを選択
  5. Continueするとすぐに証明書が発行される。

発行された証明書をダウンロードして保存。

 


4.Linuxサーバーで使用するためにPEMフォーマットに変換

プッシュ通知するサーバー(CentOS 6.5)にファイルを転送してPEMファイルを作る。

# cd apns/

証明書をPEMに変換
# openssl x509 -in aps_development.cer -inform der -out 2014hoge_cer.pem

秘密鍵をPEMに変換
# openssl pkcs12 -nocerts -in hoge.p12 -out hoge_key.pem

p12を作成したときのパスワードと新しくパスフレーズを入力

パスフレーズを解除
# openssl rsa -in hoge_key.pem -out hoge_key-nopass.pem

2つのファイルを結合
# cat 2014hoge_cer.pem hoge_key-nopass.pem > apns.pem

 


5.プッシュ通知を受け取るデバイス用にProvisioning Profile作成

iOS Dev CenterのProvisioning Profilesから

  1. 「+」で新規作成
  2. 開発用なら「iOS App Development」
  3. さっき作ったApp IDを選択
  4. アプリ用証明書を選択
    ※さっき作ったのはAPNs用証明書なのでここでは表示されない。
  5. デバイス選択
  6. 分かりやすい名前で登録

ダウンロードしなくても、Xcodeを開いて
Xcode → Preferences... → Accounts → View Details...
で更新すると同期される。

 


6.アプリにプッシュ通知がきたときの動作を記述

Titaniumの公式サイトを参考にアプリを起動したときに下記コードを実行する。

Ti.Network.registerForPushNotifications({
    // Specifies which notifications to receive
    types: [
        Ti.Network.NOTIFICATION_TYPE_BADGE,
        Ti.Network.NOTIFICATION_TYPE_ALERT,
        Ti.Network.NOTIFICATION_TYPE_SOUND
        ],
    success: function(e) {
        alert('Success: ' + JSON.stringify(e));
        console.log(e);
    },
    error: function(e) {
        console.log(e);
    },
    callback: function(e) {
        alert('Received push: ' + JSON.stringify(e));
        console.log(e);
    }
});

実機デバイスでアプリを実行すると、「プッシュ通知を許可しますか?」と聞いてくる。許可すると「success」プロパティにセットした関数が実行されてデバイストークンを取得できる。

プッシュ通知するにはこのデバイストークンを指定する必要があるらしい。

つまり全ての端末にプッシュ通知するには、全てのデバイストークンをループする必要がある。

 


7.サーバーから通知テスト

さっき取得したデバイストークン向けにプッシュ通知してみる。

PHPでは、ApnsPHPが簡単で便利。

ダウンロードしたsample_push.phpを参考に。

require_once './ApnsPHP/Autoload.php';
$push = new ApnsPHP_Push(
    ApnsPHP_Abstract::ENVIRONMENT_SANDBOX,
    './apns.pem'
);

$push->connect();
$message = new ApnsPHP_Message('デバイストークン');
$message->setText('Hello APNs-enabled device!');
$message->setSound();
$message->setExpiry(30);
$push->add($message);
$push->send();
$push->disconnect();

これをサーバー上で実行するとさっき書いた「callback」プロパティの関数が実行されるはず。

 

次回はAndroid端末向けにプッシュ通知する方法を調査する。

 

< Related Posts >