iOSアプリをバージョンダウンする方法

iPhoneiPadのアプリをバージョンダウンしたいと思ったことはないだろうか?
基本的にはバージョンアップはより良い方向に進むものだけど、時には自分が望まない方向に進むこともある。広告が入ってしまったとか、便利に使っていた機能が削除されてしまったとか、有料になってしまったとか、事情はいろいろある。
そんな時、iTunes経由でアプリのバージョンアップしていれば、話は簡単である。iTunesでバージョンアップする場合、古いアプリはゴミ箱に捨てられる。前のバージョンの方が良かったなと思ったら、xxxx 1.0.0.ipaと表記される目指すアプリのファイルをゴミ箱から取り出して(例:デスクトップに移動する)、ダブルクリックしてインストールしてしまえばいいのだ。

そういう意味で、ゴミ箱は削除したファイルのバックアップエリアなので、滅多なことでは空にすべきではないのだ。

仮に、ゴミ箱を空にしてしまったとか、iPhone側でアプリをアップデートしてiTunesと同期してしまったという場合であっても、TimeMachineのバックアップを復元できれば、何とかなるかもしれない。iOSアプリは以下のパスに存在するので、過去から目指すアプリの目指すバージョンを取り出して、同じようにダブルクリックすればいいのだ。

"~/Music/iTunes/Mobile Applications/xxxx 1.0.0.ipa"

過去をバックアップしておくことは非常に重要である。TimeMachineのスイッチは「入」にしておくべきである。あるいは定期的に「今すぐバックアップを作成」するべきなのだ。

iTunes_app_updateスクリプトの場合

ところが、前回からiOSアプリを常に最新バージョンに自動アップデートするスクリプトを使い始めてしまった。(今のところ自分の環境では順調に動いて、朝起きると常に最新のアプリになっているので、個人的にはかなり嬉しい)基本的にiTunesを手で操作してアップデートするスクリプトなので、以前のバージョンはゴミ箱に入っている。
それを取り出して、ダブルクリック&インストールすればバージョンダウンできるのだが、問題は、毎日最新バージョンに自動アップデートされてしまうのである。(そうゆうスクリプトが欲しくて作ったのだが)だから、バージョンダウンしておきたいなら、毎日ダブルクリック&インストールしなければならない。
これでは、何のための自動アップデートなのか...。自動バージョンダウンスクリプトも作ってしまうか?いろいろなことが頭をよぎったが、ここは不要なアプリはダウンロードしない仕組みにするべきと考えた。その方が毎日無駄なダウンロードもしなくて済むし。

除外アプリを保存しておく

  • 除外アプリを登録しておいて、ダウンロードする時に中止する操作をしようと思う。
  • そのためには、ダウンロードリストに表示されるアプリ名を一字一句間違いなく保存しておく必要がある。
  • 残念ながら、ダウンロードリストはコピー&ペーストできなかった。
  • ならば手入力するかと考えたが、スペースや記号まで一字一句間違えずに入力するのは無理な気がした。
  • ここはAppleScriptを使って、ダウンロードリストを抽出するべきなのだ。
  • その核の部分は以下のコードだ。これでダウンロードリストの内容をリストとして取得できた。
    • サイドバーのダウンロードを事前に選択しておく。


tell application "System Events"
tell process "iTunes"
set frontmost to true
window "iTunes"'s scroll area 3's table 1's rows's static text 1's value as list
end tell
end tell

除外アプリのダウンロードをやめる

  • あとは除外アプリ リストの情報を使って、ダウンロードを中止すればいいのだ。
  • その核の部分は以下のコードとなった。


"iTunes_app_update:save_download_stop_items.scpt"
set app_name_list to (load script file ((path to scripts folder as text) & result))'s stop_items

tell application "System Events"
tell process "iTunes"
set frontmost to true
repeat with download_item in (window "iTunes"'s scroll area 3's table 1's rows) --メインエリア行
if download_item's static text 1's value is in app_name_list then
click download_item's group 1's button 1
end if
end repeat
end tell
end tell

  • ところが問題発生。ダウンロード中のアプリは中止できるのだが、待機中のアプリはなぜか中止できない。
  • マウスを操作する時は問題なく中止できるのに、スクリプトを実行するとボタンを押しても中止できない。(謎)
  • そこで、一旦「すべてを一時停止」して、そこから除外アプリ以外のダウンロードを再開するようにしてみた。


"iTunes_app_update:save_download_stop_items.scpt"
set app_name_list to (load script file ((path to scripts folder as text) & result))'s stop_items

tell application "System Events"
tell process "iTunes"
set frontmost to true
click (window "iTunes"'s button "すべてを一時停止") --なぜか待機中の行は一時停止できないので
delay 3
repeat with download_item in (window "iTunes"'s scroll area 3's table 1's rows) --メインエリア行
if download_item's static text 1's value is not in app_name_list then
click download_item's group 1's button 1
end if
end repeat
end tell
end tell

  • できた!これなら問題なく動いてくれた。

ダウンロード

あとは、前回のiTuues_app_update.appに組み込めばいいのだ。(それにしても、いろいろな状況に対応しなくてはならないので、核となる上記コード×10倍くらいのコード量になってしまう)

使い方

  • save_download_stop_items.scpt で除外アプリを登録する。


  • edit_download_stop_items.scpt で除外アプリを一部削除もできる。

  • iTunes_app_update.app の使い方は、前回とほとんど同じ。
    • 但し、自動アップデートを妨げる設定を変更する機能を追加した。
      • スリープから復帰した時、パスワード入力を求めない設定にする。(システム環境設定 >> セキュリティ)
      • iPhone等を自動的に同期しない設定にする。(iTunes環境設定 >> デバイス