iPhone アプリケーションの URL スキームを調べる

Launch Center という iPhone アプリケーションがあります。

iOS 5.1 になって iPhone の設定を開けなくなったのは悲しい出来事でしたが、それでも少ない手間で目的のアプリケーションを起動することができるなかなか便利なアプリケーションです。いまさらここで詳しい使い方を書くのもあれなので、いくつか参考になるところを。

このアプリケーションはいわゆるランチャーなのですが、起動することができるアプリケーションは URL スキームを持っているかどうかで決まります。 Launch Center で対応しているアプリケーションもありますが、それ以外のアプリケーションは URL スキームを持っているかどうか調べないと分からない。

調べる方法はいくつかありますが、なかなか面倒。こういうものは人力でするものではありません。

iPhone のアプリケーションはバックアップ先の Mac に保管されていると思います。この保管されているアプリケーションの中にある、Info.plist というファイルを調べると URL スキームを持っているかどうか、持っているならどういう文字列か、ということはすぐに分かります。

iPhone のアプリケーションは実際のところ Zip ファイルで拡張子 ipa を zip に変更すれば、そのまま解凍できるというのはよく知られた話です。が、これらのアプリケーションのファイル名を変えて、解凍し、Info.plist を開き、目的の文字列を探し出すのは面倒な作業です。

これらの作業(Zip に変更し、解凍)を行うスクリプトをぴよまるソフトウェアさんが公開していますが、ここまでするのも大袈裟です。

ようは Info.plist 内の特定の文字列を探し出すだけです。アプリケーションのすべては必要ありません。どうすれば、Info.plist だけを抜き取ることができるか...。AppleScript だけでは Zip ファイルを解凍せずに目的のファイルを抜き出すことはできません。

でも、python は標準で入っているよな...。python には zipfile があるよな...。

なら、両者を組み合わせればいいだけで、こういうことこそ AppleScript の得意とするところ。

アプリケーション形式の AppleScript でパッケージ内に python スクリプトを配置しています。使い方は至って単純で iPhone アプリケーション(拡張子 ipa。複数可)をこのアプレットに放り込むだけ。もしくは、アプレットをダブルクリックで起動し、拡張子 ipa のファイルを選択するだけです。

処理が終了すると、デスクトップ上に「URL Schemes.csv」というファイルを作り、その中に URL スキームを書き出します。あとは、テキストエディタで開くなり、CSV ファイルなので Numbers や Excel で開くなりしてください。

ま、いつものごとく特別にエラー処理はしていないのでご利用は、ご自身の責任でお願いします。

AppleScript Editor で作る Cocoa アプリケーション

Mac OS X 10.7 を導入したのがそもそも遅かった...というのもあるのですが、旬の話題はそろそろ次の OS ですか。そうですか。そうですか。

そんな話題で盛り上がっている中、AppleScriptObjC...略して ASOC です。

AppleScriptObjC...っていうのはいったいなんなのか?

というところから話を始めますが、そもそも AppleScript というのは Mac を使う上で面倒な『日々の同じ作業を自動化する』ために生まれたプログラミング言語。いわゆるバッチ処理ですね。

Mac で作業するっていうことはいろいろなアプリケーションを扱うってことで、Mac での作業を自動化するということは、いろいろなアプリケーションを自在に操る必要があるわけです。その『アプリケーションを自在に操る』ために用意されたのが AppleScript です。

大雑把にいってしまうと、AppleScript というのはいろいろなアプリケーションを繋ぎ合わせるためのプログラミング言語。グルー言語(糊言語)なんていったりしますが、AppleScript はまさしく糊でいろんなアプリケーションを連携させることに長けています。

AppleScript は年月を積み重ねることで様々な機能が付加され続けてきましたが、シェルスクリプトと連携することができるようになったおかげで Perl や Python、Ruby などのスクリプト言語との連携もでき、Safari を通じて JavaScript を利用することができるようにもなりました。グルー言語の面目躍如といったところでしょうか。AppleScript 単体ではできない処理もアプリケーションや他のスクリプト言語の力を借りて処理が行えたりします。

do shell script 命令を利用することで他のスクリプト言語を活用することはできたのですが、Mac OS X の Cocoa フレームワークの機能を利用することはできませんでした。が、Mac OS X 10.6 から追加された ScriptingBridge というフレームワークを利用することにより、ついに AppleScript からも Cocoa の機能を利用することができるようになったのです。

Mac OS X 10.6 では Xcode でしか AppleScriptObjC のアプリケーションを作ることができませんでしたが、Mac OS X 10.7 からは AppleScript Editor で Cocoa アプリケーションが作れるようになりました。

もう、AppleScript なんでもアリです。というか、こんな面白いオモチャいじられずにおられるものか。

では、さっそく AppleScript Editor で Cocoa アプリケーションを作ってみましょう。

AppleScript Editor を起動し、「ファイル」メニューの「テンプレートから新規作成」メニューにある「Cocoa-AppleScript Applet.app」をクリックします。

template_menu.jpg

すると、保存されているテンプレートをもとに新しいアプレットが作成され、編集が行えるようになります。

テンプレートからアプレットが作成されたら、すでに Cocoa の機能を利用できる環境が整っています。おもむろに以下のコードを記述してみましょう。

tell current application's NSDistributedNotificationCenter's defaultCenter()
    addObserver_selector_name_object_(me, "update:", "com.apple.iTunes.playerInfo", missing value)
end tell

on update_(aNotification)
    set userInfo to aNotification's userInfo
    if (|Player State| of userInfo) as text is "Playing" then
        tell me to activate
        display dialog (|Name| of userInfo as text) with title (|Artist| of userInfo as text) with icon 1 buttons {"OK"} default button 1 giving up after 5
    end if
end update_

on quit
    tell current application's NSDistributedNotificationCenter's defaultCenter()
        removeObserver_(me)
    end tell

    continue quit
end quit

Objective-C のプログラムを AppleScript のスクリプトにどのように変換すればいいかは、AppleScriptObjC Release Notes に書かれています。

スクリプトは iTunes からの通知を受け取って曲の変わり目にその曲の情報を表示するというものです。

実行は、通常のスクリプトと同じように「スクリプト」メニューの「実行」を選択すればいいのですが、選択するとシートが表示されます。

run_application_sheet.jpg

ここでは必ず「アプリケーションを実行」を選択してください。「スクリプトを実行」を選択すると、通常の AppleScript として実行され、Cocoa の機能は利用できません。

シートの表示が煩わしい場合は、「スクリプト」メニューの「アプリケーションを実行」を選択すればシートは表示されず、すぐに実行されます。

スクリプトはアプリケーションとして実行されるので、明示的に終了させないといつまでも起動したままになります。通常のアプリケーションと同じようにアプリケーションメニューの「終了」を選択します。

アプリケーションとして実行されるということは AppleScript Editor でのデバック機能は利用できないということです。結果や実行途中のイベントも取得できません。これが困ったところで、現在のところデバックするには log 命令を利用して Console.app にログを表示するぐらいしか方法がありません。

ほかの注意点としては、display dialog 命令で NSString を表示する際には明示的に型変換を行うといったことがあげられます。これは、NSString だけのことではなく、Cocoa のクラスを AppleScript で利用する際にはこの型の変換を常に意識しておく方がいいです。

また、current application 経由で Cocoa の機能を呼び出しているため、current application を省略することもできません(短く記述したいなら、my でも it でも可)。

総体的には手っ取り早く Cocoa の機能を使ったアプリケーションを作るには選択肢として有りだと思うのですが、デバック機能が log 命令ぐらい(ファイルに書き出したり、ダイアログも使えますが)しかないのが致命的です。GUI の構築に手間がかかるというのも、その辺りを期待していた人には問題になるかも。

Xcode で作った ASOC アプリケーションのコードをそのまま流用できないというのもなんだかなぁというところです(スクリプトそのものはコピーアンドペーストで利用できます。Xcode はスクリプトをテキストファイルとして保持しているけど、AppleScript Edito ではコンパイル済みのスクリプトファイルでないと利用できないので)。

とりあえず、Cocoa の機能を呼び出せることは分かったけど、これを使ってなにができるか?、どこまで利用できるのか?といったことが問題になってくると思います。例えば、GUI を利用したいとか、クラス間の連携だとか...。その辺りのことは、また次回にでも。