rcmdnk's blog

The Core iOS Developers Cookbook (Developers Library)

この前 mas-cli という MacでコマンドラインからApp Storeからインストールしたアプリの一覧を調べたり それをインストールしたり出来る様にするコマンドを紹介しました。

古い環境で使えなそう、という以外、コレ使っておけば良い感じなんですが、 直接IDを調べたり他の方法でインストールできれば色々便利なので、 ちょっとコレを使わずに出来るのか探してみました。

Sponsored Links

App Storeからインストールしたアプリ一覧取得、及びIDを取得

App Storeからインストールしたアプリ一覧については、

上で紹介していますが、App Storeからインストールしたアプリの中には Contents/_MASReceipt/receiptというファイルがあります。 このファイルがApp Store関連お情報とかを持ってるみたい?です。

とにかくこのファイルはApp Storeのアプリにのみあるので、これを探して、

$ find /Applications -path '*Contents/_MASReceipt/receipt' -maxdepth 4 | cut -d '/' -f 3
App Language Chooser.app
Degrees.app
...

みたいにすればアプリ名が取得できます。 フルパスを取得したければパイプ後を削除で。

これをアプリが入っている可能性のある、 /Applications/Applications/Utilities に対してやれば大概の場合すべて見つかるはずです。

一方、下のページには別の方法が示されています。

Find if an application is from the Mac App Store - Mac OS X Hints

ここを見ると、App Storeのアプリをmdlsというメタデータを抽出するコマンドを使うと、

$ mdls /Applications/App\ Language\ Chooser.app
_kMDItemOwnerUserID                     = 0
kMDItemAlternateNames                   = (
    "App Language Chooser.app"
)
kMDItemAppStoreAdamID                   = "451732904"
kMDItemAppStoreCategory                 = "デベロッパツール"
kMDItemAppStoreCategoryType             = "public.app-category.developer-tools"
kMDItemAppStoreHasReceipt               = 1
...

と沢山表示されますが、最初の方にkMDItemAppStoreHasReceiptという項目があり、 これが1になっています。

他のアプリではこの項目は表示されません。

従って、これが1の値を持つものをリストすれば良いのですが、それも mdfindというSpotlightのコマンドラインインターフェースを使うことで 簡単に取得できます。

$ mdfind "kMDItemAppStoreHasReceipt=1" | awk '{n=split($0, tmp, "/")}{print tmp[n]}'
App Language Chooser.app
Degrees.app
...

こんな感じ。 mdfind<kMDItem~>=<Value>の値を与えるとそのメタ情報を持った ファイルを取得出来ます。

検索先として、

$ mdfind -onlyin /Applications "kMDItemAppStoreHasReceipt=1" | awk '{n=split($0, tmp, "/")}{print tmp[n]}'

の様に-onlyinで場所指定することも出来ますが、 しなくても十分速いので全て検索したいなら一気に全検索で大丈夫です。 (上のfindの場合は流石に/とかで探したらちょっと厳しい。)

パイプ後は、先ほどと違って前につくディレクトリの数が分からないので ちょっと工夫。

ただし、ファイルはSpotlightにインデックスされている必要があるので 入れたばかりのものとかSpotlightにインデックスされない領域にあるものは表示されません。

試した所、何故かKeynote、Numbers、Pagesと言ったOS XのOfficeソフトだけ 表示されませんでした。。。 が、何故かSpotlightだとちゃんと見つかります。 さらに、一度Keynoteを立ち上げてみたところ、その後はきちんと見つかる様になりました。

一切使ってなかった事はありますが、Spotlightからだとちゃんと見つかるので良く分かりません。

まあ、通常、インストールしたアプリはすぐに一回くらいは使うので良いかな、と。 そもそも使ってないなら無いも同じで。。。

ということで、こちらのが簡単といえば簡単。

さらに、上のmdlsの結果を見て分かる通り、このコマンドで kMDItemAppStoreAdamIDというのがありますが、 これがアプリのApple StoreでのIDになります。

なのでこれを使えばmasでもインストールできます。

取得するなら

$ mdls -name kMDItemAppStoreAdamID -raw /Applications/App\ Language\ Chooser.app
451732904

とすると直接取得できます。 (-nameで指定した項目のみ取得、rawで値のみ表示。)

アプリ名だけでなくアプリへのパスが必要です。 一括取得するなら組み合わせて

$ mdfind "kMDItemAppStoreHasReceipt=1" | while read a;do echo $(mdls -name kMDItemAppStoreAdamID -raw "$a") $(echo $a|awk '{n=split($0, tmp, "/")}{print tmp[n]}');done | sort -k2

みたいなワンライナーでもIDとアプリ名が取ってこれます。

これで純正コマンドだけでアプリを取得してIDも取得できます。

App Storeのアプリをコマンドラインからインストールする

以下を参考しました。

半人肉方式备份、恢复 AppStore 中安装的应用 - V2EX

ID取得方法も載ってますが、インストール方法として、

$ open -W "macappstore://itunes.apple.com/cn/app/id$appid"

が載っています。 openはOS Xの何でも開くコマンドですが、 -Wを指定すると開いたファイルなりアプリなりが閉じるまで コマンドライン側は待機状態になります。

で、macappstore:://で指定したものは、 App Store.appで開かれ、指定したIDのアプリのページを開きます。

上のURLはcnで中国のURLですが、この部分は無くても結局手元のApp Store.appで 開くので問題ないので、

$ open -W "macappstore://itunes.apple.com/app/id451732904

みたいにするとApp Store.appが立ち上がってApp Language Chooser.appのページが 開かれます1

ここで実はコマンドラインから、と言っても完全ではなく、 ここではApp Storeのインストールボタンを押してインストールしなくてはいけません。

mas-cli install 451732904の様には行かず。

今のところここまででした。

Brew-fileのアップデート

この前mas-cliを含めてApp Storeのアプリもリスト、インストール 出来る様にしましたが、 この中では完全にmas-cliに依存してたので、 mas-cliがどうしても使えない環境でも使える様にしてみました。

検索方法としてはmdfindだと手元の環境だけかもしれませんが 取得できないものもあったので findを使った前も使ってた方法で行っています。

mdlsにより今回からmas-cliがなくてもIDも取得出来る様になっています。

インストールに関しては上にも書いたように、 brew file installでインストールするアプリが見つかったら、 mas-cliが使えない場合は App Store.appが立ち上がるのでそこでインストール出来る様になります。

まあ現状El Capitanになっていればmas-cliを使えるので 意味があるかどうかは分かりませんがやってみたかっただけな実装。

もしインストールに関しても簡単に既存のコマンドだけで出来るのであれば mas-cliから脱却してシンプルに出来るのにな、とまだ模索中。

Sponsored Links
Sponsored Links

« 英文法チェックソフトのまとめ Vimのdiffモード関連Tips »