2013年9月7日土曜日

Ruby で APNS を行う(houston)

今日は、Ruby を使って、APNS(Apple Push Notification Service)を行ってみたいと思います。

今回も 1 から作っていくのではなく、mattt さんが作成してるライブラリの力を借りる事にします。
ライブラリの名前は、
houston[ヒューストン] (https://github.com/nomad/houston)

名前の由来等サイトに書かれている気がしますが、、、とりあえず作業に入りたいと思います。
あと、APNS での Push の仕組みなどは Apple のドキュメントを参照してください。

Apple Document: Local Notification および Push Notification プログラミングガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/RemoteNotificationsPG.pdf

また、今回は完全なシステムを立ち上げるのではなく、あくまで手動で huston を使って Push の確認を取るところまでを記載します。
言うまでもなく実システムに組み込む場合は、細かな処理に手を入れる必要があります。

また、今回は色々なサイトを見させてもらったのですが、PHP で Push を実現する事が出来る apns-php を使っておられる方が非常に分かりやすく解説されており、非常に勉強になりました。
houston 以外の部分(houston もほとんどサイト丸写しなんですけどね。。。)は、こちらのサイトを見たほうがわかりやすいかもしれません。

MonteCut さん
iOS + PHPでPush Notificationを実装する


以下が、作業内容です。
なんども言いますが、1.〜 4. までは確実に
iOS + PHPでPush Notificationを実装する
の方がわかりやすい。。。

1.iOS Developer から Push 用の IDs の取得を行う
Push を行うに当たり、端末の識別番号を取得するなどの処理を行うiPhone側(iOS)プログラムが必要となります。
このプログラムを作りに当たって ID を取得します。
自分は、これまでに IDs の登録時のApp ID Suffix の Bundle ID をワイルドカードの物(Wildcard App ID)で賄っていました。
しかし、Push を行うにはこの形式の物は使えないと、色々なサイトに書かれてあったので、Push テスト用に別途作成しました。


2. 証明書の取得
1. で作成した IDs から証明書ファイルを取得します。
取得した証明書をダブルクリックでキーチェインアクセスへ登録します。

登録後、p12 ファイルを取得します。
取得方法は、キーチェインアクセスで、今回追加した証明書を選択し(キーチェインを「ログイン」、分類を「自分の証明書」を選択すると出てくる)、左の三角を押して、自分の鍵を出した状態で、Ctrlキーで両方選択し、右クリックで p12 形式で書き出します。
(今回名前を AppNameDev.p12 とした) この p12 から pem ファイル形式へ変換します。
$ openssl pkcs12 -in AppNameDev.p12 -out AppNameDev.pem -nodes
そしてその pem ファイルを houston で使用・指定します。

3. プロビジョニングファイルの作成
これも1. 同様に Push で確認を行うためのプログラムを実機で試すために必要なプロファイルです。
どうやら、Push の確認については、実機でないと行えない様なので、これも iOS Developer で取得しておきます。

iOS Developer から Provisioning Profiles と辿り「+」ボタンで作成していきます。
Development は iOS App Development として、Select App ID は、1. で作ったアプリを選択します。
Select certificates. は、自分の証明書を選択
Select devices. は、動かす端末を選択
Name this profile and generate. は、任意のプロファイル名を入れ Generate で作成後、ダウンロードします。
ダウンロードしたものをダブルクリックでオーガナイザに登録します。

4. iOS で Push 対応のプログラムを作成する
XCode を立ちあげ、適当なプロジェクトを選択(Empty Applicationでもいい)し、プロジェクト設定画面を開きます。
PROJECT で、プロジェクトを選択し、Build Settings を選択し、Code Signing の項目の Code Signing Identity の Debug 用プロファイルを 3. で登録した物に設定します。

次に、プログラムを書いていきます。
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...

    // アプリケーションが起動するたびに、デバイストークンを要求してそれをプロバイダに渡すことで、
    // プロバイダが最新のデバイストークンを持つことを保証
    [application registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert)];
    
    return YES;
}

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *) devToken
{ 
    NSLog(@"deviceToken: %@", devToken);
    // 自分のサーバーにトークンを送信する
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *) err
{ 
    NSLog(@"Errorinregistration.Error:%@", err); 
}
実装が問題なくでき、ビルドも通ったら、実行してみてください。
上手くいけば、デバイストークンが取得できるはずです(ログに出力されている)。
ここで、表示されるデバイストークンをメモっておきます。

実際には、ここで取得したトークンを、サーバへ送信して、サーバー側で値を管理する様にしないと行けません。

5. Ruby(huston) のプログラムを作成する
ここでようやく houston の出番です。
houston のサイトから zip ファイルを取得します(git で取得しても良い)
取得したファイルを展開し、任意の場所へ移動します(以降 houstonフォルダとする)。

houstonフォルダ内に、証明書を入れるフォルダを作成します(ここでは、certificateフォルダとする)。
作成したフォルダに、2. で作成した証明書ファイルを入れます。

次に、houstonフォルダに、Push を実行するためのスクリプトファイルを作成します(名前は任意。今回は pushTest.rb とした)
パスの関係上で、Web のサンプル通りだとエラーになったので、各プログラムの読み込むパスを変更しました。
require './lib/houston'  ← ./lib/ を追加
# Environment variables are automatically read, or can be overridden by any specified options. You can also
# conveniently use `Houston::Client.development` or `Houston::Client.production`.
APN = Houston::Client.development
APN.certificate = File.read("./certificate/AppNameDev.pem")

# An example of the token sent back when a device registers for notifications
token = "<4.で取得したトークンを貼り付ける>"

# Create a notification that alerts a message to the user, plays a sound, and sets the badge on the app
notification = Houston::Notification.new(device: token)
notification.alert = "Hello, World!"

# Notifications can also change the badge count, have a custom sound, indicate available Newsstand content, or pass along arbitrary data.
notification.badge = 57
notification.sound = "sosumi.aiff"
notification.content_available = true
notification.custom_data = {foo: "bar"}

# And... sent! That's all it takes.
APN.push(notification)
lib フォルダの houston.rb も同様に
module Houston
  VERSION = "0.3.0"
end

require './lib/houston/client'        ← ./lib/ を追加
require './lib/houston/notification'  ← ./lib/ を追加
require './lib/houston/connection'    ← ./lib/ を追加
ここまで、できれば後は実行するだけです。
$ ruby pushTest.rb
これで、iPhone に Push 通知が飛んできます。

駆け足で書いているため(絵がないからわかりづらい)、抜けているかもしれませんが、また自分でも使うことがあると思うので、その際に修正していきたいと思います。



番外
この huston も、先日のdubai と同様、bin フォルダに apn と言うプログラムが用意されています。
これを使えば、コマンドラインから Push を行う事が出来ます。
(パスは自分の環境に対応してください)
$ apn push "4.で取得したトークン" -c /certificate/AppNameDev.pem -m "Hello from the command line!"

用途に合わせて、使い分けをすれば、軽作業で Push 処理が実現できるかと思います。


0 件のコメント:

コメントを投稿