引数が一つの場合
アプリ起動時に渡される引数は 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: の方が呼ばれる)。