node.jsでiOSのサイレントプッシュ通知のテストをしてみた

はじめに

サイレントプッシュ通知というものが、iOS7から出来るようになっていて、これを利用した情報の更新を考えました、大体の仕様は色々サイトを巡ったらわかったのですが、アプリケーションが完全に起動していない時は、結局来るのか来ないのかわからなくて困ったので、もうサーバから作ったほうが今後のテストもできるし早い、と思い作ったので、今回はその手順と結果を書きました。

プッシュ通知サーバの準備

APNSを利用して通知を送るためにnode.jsでサーバを建てます。

node.jsをインストールするために、homebrewでnodeとnpmをインストールします。※ターミナルを使って下さい。

続いて、nodeのapnsモジュールを入れます。 

好きな場所にサーバ用のディレクトリを切ります。

 作成したディレクトリにapp.jsファイルを作り、下記のソースコードを実装します。

このままでは、apns-dev-cert.pemとapns-dev-key-noenc.pemとデバイストークンが足りないので準備します。

まずpemです。iOS Developer Centerにて色々しなければならないのですが、長くなるので下記を参考にして、証明書を作るまでやって下さい。 

 Apple Push Notification Serviceを使ってiOSにプッシュ通知をするために必要な証明書の準備方法

下記スクリーンショットのようにキーチェインに入ったら、右クリックして証明書をapns-dev-cert.p12、秘密鍵をapns-dev-key.p12という名前で書き出しします。

キーチェイン

 

書き出したら、書きだしたディレクトリで下記コマンドを叩きます、書きだした時のパスワードがいるので気をつけて下さい。

 これが成功するとapns-dev-cert.pemとapns-dev-key-noenc.pemが生成されるので、先ほど実装していたapp.jsと同じディレクトリに入れてください。

続いてデバイストークンを取得します。

XCodeでSingle View Applicationを作り、プロジェクトのCapabilitiesを開き、Remote notificationsにチェックを入れます。

スクリーンショット 2014-12-22 21.26.16

プッシュ通知の許可をユーザに求めるため、AppDelegateのdidFinishLaunchingWithOptionsに追加します。

 下記をAppDelegateに実装することで、デバイストークンの取得ができます。

 この状態で実機デバックをするとログにデバイストークンが表示されますので、app.jsの下記を書き換えます。

 また、下記をAppDelegateに実装することで通知が届いた時に、ログが出るようになります。

 

起動、そしてプッシュ通知送信

長くなってしまいましたが、これで準備が整ったので、ターミナルでapp.jsがあるディレクトリまで移動して、下記コマンドを叩きます。

  そうすると「start-server」と表示されるので、ブラウザで「http://localhost:3000/」にアクセスし、送信しました。と出たら成功で、端末のログを見ると「didReceiveRemoteNotification」と表示されます。

これでいつでもプッシュのテストができるようになりました。

まとめ

・プッシュ通知に「content-available」が1と設定されているとサイレントプッシュ通知になるが、結構高い確率で届かない、「priority」と「sound」を追加するとかなりの確率で届くようになった。

・サイレントプッシュ通知は端末上に表示されない。

・アプリが完全に起動していない時は届かない。

・ユーザがそもそも通知の許可をしてない場合は届かない。

●この記事を書いた人