ページ

2010年1月21日木曜日

アプリ起動時に渡される引数の処理

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

引数が一つの場合
アプリ起動時に渡される引数は NSApplicationDelegate の application:openFile: で処理できる。

Mac Dev Center: NSApplicationDelegate Protocol Reference - application:openFile:

例えば下記のように書いておく。textViewはウィンドウに貼付けた NSTextView。

- (BOOL)application:(NSApplication *)theApplication
  openFile:(NSString *)filename
{
 [textView insertText:filename];
 [textView insertText:@"\n"];
 return YES;
}

引数をつけてターミナルで実行すると:
$ open -a NSAppStudy file1

こうなる。


実行する時にはファイル名だけを指定したが、引数filenameにはパスが付いた状態で渡ってくる(例では /private/tmp/file1)。なお戻り値に NO を返してもアプリは起動した。


既にアプリが起動している状態で実行した場合
アプリを起動させたまま別のファイルを付けて実行すると起動したままで同じ様に処理される。
$ open -a NSAppStudy file1
$ open -a NSAppStudy file2


引数が複数の場合
また複数の引数をつけて実行すると、引数の個数分だけ呼び出される。
$ open -a NSAppStudy file1 file2
とすると、こうなる。


ファイルダブルクリック時の呼び出し順序
リファレンスによればファイルをダブルクリックした場合には次の順番で呼び出される。

applicationWillFinishLaunching:
 ↓
application:openFile:
 ↓
applicationDidFinishLaunching:

これは覚えておこう。



引数が複数の場合(2)
なお他に application:openFiles:(最後が複数形)も用意されている。こちらを実装すると:
- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
{
 [textView insertText:[filenames description]];
 [textView insertText:@"\n"];
}

これが
$ open -a NSAppStudy file1 file2

こうなる:

application:openFiles: が実装されている場合、application:openFile: は呼び出されない(引数が一つであっても openFiles: の方が呼ばれる)。