2008年7月10日木曜日

iPhoneをMacに接続したらiPhotoが勝手に起動する・その対策

気の早い方はそろそろiPhone 3Gを手に入れられたでしょうか。私は手持ちの2G機がまだ動くので、当面は買い控えるつもりです。ともあれ、この記事、いつか書こうとおもって放置していたのですが、賞味期限の切れる前に書いておきます。

iPhoneをMacに接続すると、デフォルトの状態だとiPhotoが勝手に起動します。iPhoneをデジカメとして認識するからなんだそうですが、iPhoneを充電するためだけにMacにつないだのにiPhotoが立ち上がってイライラすることがあります。簡単な対処方法としては、イメージキャプチャの環境設定で「カメラを接続したときに起動する項目」を「割り当てアプリケーションなし」にすればいい、というものがあります。ただ、これだとカメラをMacにつなげたときに手動でiPhotoを立ち上げなければならず、これも面倒です。

そこで、カメラを接続したときだけiPhotoを開き、iPhoneを接続したときはなにもしない(iTunesのみ起動する)手順を書いておきます。

1. Finderを開く

2. アプリケーション→AppleScript→スクリプトエディタ.appを開く

3. こういう内容を書きます

on get_device_name()
set list_devices to "ioreg -Src IOUSBDevice | grep '^\\+'"
set get_name_of_last to "tail -n 1 | sed 's/^\\+-o \\(.*\\)@.*/\\1/'"
set command to list_devices & " | " & get_name_of_last
return (do shell script command)
end get_device_name

on run
if get_device_name() is not equal to "iPhone" then
tell application "iPhoto" to activate
end if
end run

4. ファイルメニュー→保存を選択。ライブラリの下にCameraConnected.appとして保存(名前はなんでもよい)。このとき、フォーマットを「アプリケーション」にする。スクリプトエディタを終了する。

5. アプリケーション→イメージキャプチャ.appを開く

6. メニューからイメージキャプチャ→環境設定を選択

7. カメラを接続したときに起動する項目というところがあるので「その他」を選択したあと、先ほどのCameraConnected.appを選ぶ

8. イメージキャプチャを終了

9. MacにiPhoneを接続してもiPhotoが起動しないことを確認します。ついでに、普通のカメラをMacに接続したらiPhotoが起動することも確認しましょう。

ソース

大元となるソースはこちらです。

Tip: Prevent iPhoto from opening when you plug in your iPhone - (37signals)

上記を改良したものが本稿の元になっています。

Whatever happened to Benjamin Ragheb? - Re: Tip: Prevent iPhoto from opening when you plug in your iPhone

上にあるスクリプトは、最後に接続されたデバイスはioregの出力の一番下にあるという仮定をしています。その仮定が正しくない場合があるという説もありますが(下のリンク先のコメント欄)、私の試した限りでは大丈夫そうだったのでこちらを使いました。

おまけ:Perlな人は

上記のAppleScript中にtailやsedを呼ぶ場所があります。今どきシェルスクリプトの記法かよ、という方は最初の部分をPerlでこう書いてみてもいいです。

set list_devices to "ioreg -Src IOUSBDevice"
set get_name_of_last to "perl -0777 -ne '/.+\\n\\+\\-o (.+?)\\@/ms; print $1;'"

6 件のコメント:

  1. iPhotoが立ち上がってイライラしていて、ここに辿りつきました。しかし
    うまくいきません。
    「device_name()」の()の中に何か入れるのでしょうか?
    よろしくお願いします。

    返信削除
  2. こんにちは。うまくいったというお便りも頂いたのでもしかしたら環境の違いかもしれません。ターミナルでこのコマンドを打ってみてもらえますか? (1行です)

    ioreg -Src IOUSBDevice | grep '^\+'|tail -n 1 | sed 's/^\+-o \(.*\)@.*/\1/'

    これは

    iPhone

    を表示するはずなのですが。

    返信削除
  3. 横からすいません、便乗させて下さい。
    ウチでもやはりうまくいきません。
    以下経過報告です。
    なにかヒントになりそうなことがありましたらご指摘下さい
    よろしくお願いいたします

    スクリプトエディタでコピー&ペーストし保存しようとすると
    「名称未設定を"CameraConnected.app"として保存できませんでした。」
    と表示されます。
    まず何も入力せず保存し、その後入力して保存してみても同じです。
    そのメッセージの後、スクリプトを見てみますと
    \\の部分がすべて\に書き換えられています。

    ターミナルの入力結果は
    usage: ioreg [-b] [-c class | -l | -n name] [-p plane] [-s] [-w width] [-x]
    where options are:
    -b show object name in bold
    -c list properties of objects with the given class
    -l list properties of all objects
    -n list properties of objects with the given name
    -p traverse registry over the given plane (IOService is default)
    -s show object state (eg. busy state, retain count)
    -w clip output to the given line width (0 is unlimited)
    -x print numeric property values in hexadecimal
    ※iphoneを接続していても、いなくても同様です。

    MacはiMac(intel) Mac OS X 10.4.11
    iPhoneは2.2.1
    です。

    返信削除
  4. ifさん
    当方の手違いでコメントが半年間埋まっておりました。申し訳ありません。

    ioregの仕様が10.4だと違うみたいですね。ioregの出力を送って頂ければなんとかできるかもしれません。でもSnow Leopardにしてみるというのはどうでしょう :)

    返信削除
  5. このコメントは投稿者によって削除されました。

    返信削除
  6. 10.6でいくつかの手順が異なりましたが、適当に行ってiPhoto立ち上がらなくなりました!!
    本当に助かりました。

    ありがとうございます☆☆

    返信削除