会社で適当に作るASOC

会社で仕事の都合でMacのアプリをちょいちょいと作る必要がある。
シェルスクリプトでいいようなものだけど、画面が出ないといけないとか、アイコンが無いとか、ターミナルの画面が怖いからヤダとか言われる。
先日は「ターミナルだとパスワードの入力に*****とならないから困る」とか言われてしまった。

そんな時に、シェルスクリプトをxcodeでくるんでアプリっぽく動かす方法。
Objective-cを使った方が早いような気がしなくもないけどとりあえずASOC (AppleScriptObjC) で作ってみるサンプル。見た目は通常のアプリのように見えるので仕事したっぽく見える。

スクリプト系はメモリ管理しなくていいので好きです。動作はなんとなく遅い気がするがちょっとしたものを作るにはいい。(しかしデバッグが役に立たないので大規模なものを作るには向かないと思うよ。)

仕様

今回のサンプルの仕様は、「/tmp/test.txt」ファイルを削除するアプリとする。
やりたい処理はすべて rmtest.sh に書く。
めんどくさいのですべて管理者権限で動かす。そのためパスワードを入れる必要がある。
1. アプリ起動、処理開始ボタンがあるウィンドウが出る。
2. ボタンを押すとファイルを削除
3. 処理結果をダイアログに表示
4. 終わり。メニューからアプリを終了してください。

rmtest.sh

#!/bin/sh
#
rm  -f  /tmp/test.txt
#
# 以下はエラーチェック
# エラーはechoで出しておく
if [ -r /tmp/test.txt ];then
    echo "Error !"
else
    echo "0"
fi

Xcode

まずはxcodeを用意する。
xcodeを起動したら「Cocoa-AppleScript Application」を選ぶ。
MainMenu.xib のウィンドウにボタンを一つ追加する。
AppDelegate.applescript にボタンの処理を書く。

AppDelegate.applescript

-- 適当な場所に以下を足す。
--
-- ボタンを押す
on clickButton_(sender)
    set my_script1 to "rmtest.sh"
    set my_endmsg to "削除しました"
    set my_errmsg to "削除失敗しました"
    set my_script1 to POSIX path of (path to resource my_script1)
    set my_script1 to "\"" & my_script1 & "\""
    set my_result to do shell script "/bin/sh  " & my_script1 with administrator privileges
    if my_result is "0" then
        display dialog my_endmsg
    else
        display dialog my_errmsg
    end if
end clickButton_

プロジェクトにシェルスクリプトファイルを追加する。
ボタンとAppleScriptをつなぐ。First Responder を右クリックすると「clickButton」(clickButton_じゃないようだ)が現れるのでそれをボタンとつなぐ。
その他、About画面やアイコン等も好きに変更する。
※ここらへんはxcodeの操作なので省略
これでボタンを押すとパスワードを聞いてファイルを削除するアプリが出来上がる。
シェルスクリプトを使ったものはこんな感じでだいたいOK。
返す結果の量が多すぎるとダイアログが画面からはみ出して、OKボタンが押せなくなるので注意。

問題点

パスの取得で、フォルダ名、ファイル名に「スペース」「かっこ」等が含まれていると失敗する。アプリ名にかっこを付けているものもダメ。
途中で何か工夫しないといけないようだ。が、未調査。
ダブルコーテーションでくくったらとりあえずOK。

rmtest.zip (xcodeのプロジェクト等)

2012/6/2