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],

コードで自動処理

  1. ipaをzipにリネーム
  2. 展開
  3. plistを探して解析

この流れならコードで自動化できそうです。plistはXMLだし。

と思ったら違った!

plistはbplistというバイナリのplistファイルになっていました。XMLパーサーがあれば余裕と思っていたらそういうわけにはいかなそうです。

外部ライブラリを探す

珍しくjavascriptでなんとかできないかと調べていたところ、あ.jsのライブラリにbplist-parserなるものがあることがわかりました。これで簡単に解析できました。

joeferner/node-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のフォーマットは公開されているそうです。

CFBinaryPList.c

やりたいこと

Node.jsで動かすことはできましたが、ブラウザ上のJavascriptではバイナリデータの処理周りがうまくいかず、バイナリplistの解析ができていません。bplist-parserをbrowserifyしたり、他のバイナリライブラリを使ってbplist-parserをブラウザ用に書き直したりしましたが今のところうまくいっていません。