バイナリ形式のplistファイル
移転しました →
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スキームが定義されていました。
"CFBundleURLTypes": [ { "CFBundleTypeRole": "Editor", "CFBundleURLName": "com.facebook", "CFBundleURLSchemes": [ "fbauth2", "fbauth", "fb", "fblogin", "fbapi", "fbapi20130214", "fbapi20130410", "fbapi20130702", "fbapi20131010", "fbapi20131219", "fbapi20140116", "fbapi20140410" ] } ],
コードで自動処理
- ipaをzipにリネーム
- 展開
- plistを探して解析
この流れならコードで自動化することができそうです。plistはXMLだし。
と思ったら違った!
plistはbplistというバイナリのplistファイルになっていました。XMLパーサーがあれば余裕と思っていたらそういうわけにはいかなそうです。
外部ライブラリを探す
珍しくjavascriptでなんとかできないかと調べていたところ、あ.jsのライブラリにbplist-parser
なるものがあることがわかりました。これで簡単に解析することができました。
インストールはnpm install bplist-parser
でOKです。
メインプログラム
サンプルそのままですが、このようなファイルを作りました。また対象とするplistファイルはプログラムと同じディレクトリに置いておきます。
var bplist = require('bplist-parser'); bplist.parseFile('Info.plist', function(err, obj) { if (err) throw err; console.log(JSON.stringify(obj)); });
これだけでバイナリ形式のplistをJSON形式で得られることがわかりました。
なお、バイナリplistのフォーマットは公開されているそうです。
やりたいこと
Node.jsで動かすことはできましたが、ブラウザ上のJavascriptではバイナリデータの処理周りがうまくいかず、バイナリplistの解析ができていません。bplist-parser
をbrowserifyしたり、他のバイナリライブラリを使ってbplist-parser
をブラウザ用に書き直したりしましたが今のところうまくいっていません。