iOSアプリはiTunesを使えばMacでもダウンロードできます。そしてダウンロードしたipaファイルはzipファイルとして展開でき、中身を覗き見ることができるようになっています。
ところでiOSアプリケーションのURLスキーム定義はどこに書かれているのかというと、ipaファイルの中にあるplistファイルに記載されています。URLスキームのリストは公開されていませんが、手元のアプリに限って言えばplistファイルを覗くことによって特定することが可能です。
手作業で確認する
ipaファイルをリネームする
こいつを。

こう。

plistを探す
展開した先にはこれらのファイルやディレクトリが並びます。目的のplistはここにあるiTunesMetadata.plistではなくて、Payloadの下にあるFacebook.appのの内部にあります。
- META-INF
- Payload
- iTunesArtwork
- iTunesMetadata.plist
Payload/Facebook.appを右クリックしパッケージの内容を表示で中身を表示し、Info.plistを探します。Finderからであればクイックルックでplistファイルの内容をプレビューすることもできますね。
CFBundleURLTypesの項目を見るとURLスキームがわかります。Facebookでは数多くのURLスキームが定義されていました。
1"CFBundleURLTypes": [
2 {
3 "CFBundleTypeRole": "Editor",
4 "CFBundleURLName": "com.facebook",
5 "CFBundleURLSchemes": [
6 "fbauth2",
7 "fbauth",
8 "fb",
9 "fblogin",
10 "fbapi",
11 "fbapi20130214",
12 "fbapi20130410",
13 "fbapi20130702",
14 "fbapi20131010",
15 "fbapi20131219",
16 "fbapi20140116",
17 "fbapi20140410"
18 ]
19 }
20],
コードで自動処理
- ipaをzipにリネーム
- 展開
- plistを探して解析
この流れならコードで自動化できそうです。plistはXMLだし。
と思ったら違った!
plistはbplistというバイナリのplistファイルになっていました。XMLパーサーがあれば余裕と思っていたらそういうわけにはいかなそうです。
外部ライブラリを探す
珍しくjavascriptでなんとかできないかと調べていたところ、あ.jsのライブラリにbplist-parserなるものがあることがわかりました。これで簡単に解析できました。
インストールはnpm install bplist-parserでOKです。
メインプログラム
サンプルそのままですが、このようなファイルを作りました。また対象とするplistファイルはプログラムと同じディレクトリに置いておきます。
1var bplist = require('bplist-parser');
2bplist.parseFile('Info.plist', function(err, obj) {
3 if (err) throw err;
4 console.log(JSON.stringify(obj));
5});
これだけでバイナリ形式のplistをJSON形式で得られることがわかりました。
なお、バイナリplistのフォーマットは公開されているそうです。
やりたいこと
Node.jsで動かすことはできましたが、ブラウザ上のJavascriptではバイナリデータの処理周りがうまくいかず、バイナリplistの解析ができていません。bplist-parserをbrowserifyしたり、他のバイナリライブラリを使ってbplist-parserをブラウザ用に書き直したりしましたが今のところうまくいっていません。