2013年9月6日金曜日

Ruby で Passbook を作る(Dubai)

iPhone に標準搭載されている Passbook。
みんな使っていますか?

今回は、Ruby を使用して Passbook を作成する方法を記載します。
とは言っても、1 からの作成ではなく、既にライブラリとして用意されている物を利用させて貰います。

ライブラリ名前は Dubai(ドバイ)
https://github.com/nomad/dubai 作者は Mattt Thompson 氏。
Heroku の方らしい。

ライブラリの名前の由来がダジャレっぽかった気がするが、気にしない。
(ドバイとか分かりやすい名前は良いのだが、情報を調べる際に関係ない物が多くかかるので、こういうネーミングはあんまり好きじゃない)

さて、今回は Passbook を一度作成した事がある方を対象とする。
細かな説明については、他の方が書かれているから。

さて作成に入る。

1. Pass 作成用の p12 ファイルを作成する
iOS Developer から Passbook 用の IDs を作成して、証明書を取得する。
証明書をキーチェインアクセスで選択して p12 形式で書き出す。
(この時のパスワードを覚えておくこと)
このファイルを後ほど使用する。

2. プログラムの取得
github から取得する(今回はGitクライアントを使わずに zip ファイルを落とした)。

次に、zip ファイルを展開する。
dubai フォルダが作成されるので任意の場所へ移動する。

次に、ターミナルで dubai フォルダまで移動する。
ここで、必要ファイルを取得するために
bundle install
をする。

3. 証明書ファイルのフォルダを作成
本当は、どこでもいいんだろうけど、今回は dubai フォルダに
「certificates」 というフォルダを作成し、1. で作った p12 ファイルを格納する。

4. Passbook のフォルダを格納する
Pass が作成できる前段階まで仕上げた物(フォルダ)を dubai フォルダに格納する。
(ここで言う、前段階まで仕上げた物というのは、Appleから取得したテンプレートフォルダに有った signpass プログラムで Passbook が作成できる段階のものを指す)

5. ruby スクリプト作成
dubai フォルダに、適当な ruby ファイルを作成する(今回は passbookCreate.rb と言う名前のファイルにした)

後は、Web のサンプル通りにすれば良いが、パスの指定で、エラーが出たので、
lib フォルダの dubai の読み込みと、lib/dubai.rb のファイルの読み込み部分を変更した。
(ここの辺が、ruby が分かっていない点)
require './lib/dubai' ← "./lib/"を追加

Dubai::Passbook.certificate, Dubai::Passbook.password = "./certificates/証明書.p12", "証明書パスワード"

# Example.pass is a directory with files "pass.json", "icon.png" & "icon@2x.png"
File.open("作成するPassの名前.pkpass", 'w') do |f|
  f.write Dubai::Passbook::Pass.new("Passの元フォルダ.raw").pkpass.string
end
require './lib/dubai/pass'    ← "./lib/"を追加
require './lib/dubai/server'  ← "./lib/"を追加
require './lib/dubai/version' ← "./lib/"を追加
6. 実行
上記まで作業が完了したら、作成したスクリプトを実行する。
$ ruby passbookCreate.rb
これで、.pkpass のファイルが作成されている。
出来たPassbook ファイルをダブルクリックすれば Mac なら Pass を開いて見ることができる。
また、iPhone へ Pass をメールで添付すれば、iPhone に保存することも出来る。
iOS シミュレータなら Pass をドラッグアンドドロップでも行ける。
Web での配信もできるが、面倒なのでここではしない。


番外? pk プログラム
dubai フォルダ内の bin には pk と言うプログラムがある。

これは、
・ Passbook 雛形作成
・ Passbook 生成
・ 配信サーバー機能
が出来る。

Passbook 雛形作成
以下のコマンドで、Passbook 用の雛形フォルダ及び、データが作成される。
$ pk generate [Pass データフォルダ] -T [Pass の種類]
Pass の種類は以下の通り
・ boarding-pass
・ coupon
・ event-ticket
・ store-card
・ generic

これで、作成された pass.json を編集・画像ファイルを準備すれば Pass 作成の準備が完了となる。


Passbook 生成
Passbook 生成前のファイルが準備出来たら、以下のコマンドで Pass の作成を行う
$ pk build Example.pass -c /path/to/certificate.p12
Web ページには、上記の様に書いているが、この通り(Pass名や証明書ファイルとかは当然変える)すると、
Error: PKCS12_parse: mac verify failure
You may be getting this error because the certificate password is either incorrect or missing
とエラーが出る(エラーでも空パスが作成される)。
以下のように -p オプションを付与すると、パスワードを聞いてくるようになる。
$ pk build Example.pass -c ./certificate/pass_certificate.p12 -p
ここのパスワードは、証明書を作成した時のパスワード。
これで、パスが作成される。


配信サーバー機能
※ 正直動いていないのでよくわかない。

以下のコマンドで、パスの作成と配信用のサーバ(Sinatra)が起動できる。
ここでも後ろに -p オプションを付けないとエラーになる。
$ pk serve Example.pass -c /path/to/certificate.p12 -p
Enter certificate password:

== Sinatra/1.4.2 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on localhost:4567, CTRL+C to stop
これで、localhost の 4567 番ポートにアクセスすればパスが取得できるはずだが、上手く行かなかった。
今回は使わない機能だったので、これ以上の深追いをしないこととした。
ひょっとしたら、localhost ではなくドメインの設定とかも出来るかもしれない。。。

長々と、書いたが非常に簡単なステップで Passbook  の作成ができるので、興味のある方はどうぞ。

0 件のコメント:

コメントを投稿