こんにちは。今回はcocoaアプリケーションにて多重起動を制御する方法を説明します。
アプリケーションの二重起動を禁止したい場合、WindowsではグローバルMutexを使うのがセオリーなのですが、Objective-Cでは同様の機能は利用出来ないようです。
そこで、方法はいくつか考えられますが今回は起動中のアプリケーション群と自分自身を比較する方法で実装する事にしました。
説明が面倒なので今回もいきなりコードを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//自分のプロセスID pid_t myPID = [[NSProcessInfo processInfo] processIdentifier]; //自分のBundleID NSString* myBundleID = [[NSBundle mainBundle] bundleIdentifier]; //自分の起動パス NSURL* myURL = [[NSBundle mainBundle] executableURL]; //現在起動中のアプリケーション群を取得 NSArray* arr = [[NSWorkspace sharedWorkspace] runningApplications]; for (NSRunningApplication* app in arr) { //自分自身。これは無視した方が良い if (myPID == app.processIdentifier) { NSLog(@"It's me!"); } //同じパスから起動したプロセス。ここで一致するようなら自分自身を終了する if ([myURL app.executableURL]) { NSLog(@"It's same File!"); } //起動パスは違うが同一アプリケーション。必要によってはこのケースでも終了する if ([app.bundleIdentifier isEqualToString:myBundleID]) { NSLog(@"It's same App!"); } } |
内容も単純なのでソースのコメントを読めば動作は把握出来ると思います。
これをApplicationDidFinishLaunching等で実行して、必要なら[NSApp terminate:self]等すれば多重起動禁止処理が実装出来ます。