2012-03-25 24 views

答えて

3

NSWorkspaceを使ってアプリを起動し、NSDistributedNotificationCenterを使ってデータを渡しました。これは明らかに完全には開発されていませんが、うまくいきました。 docsの1つの警告 - 私が引数(この例では文字列)で送信した辞書は、サンドボックス化されたアプリケーションでは使用できません(辞書はゼロでなければなりません)。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
ws = [NSWorkspace sharedWorkspace]; 
NSNotificationCenter *center = [ws notificationCenter]; 
[center addObserver:self selector:@selector(poster:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; 
[ws launchApplication:@"OtherApp.app"]; 

}

-(void)poster:(NSNotification *) aNote { 
NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter]; 
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"theDataToSend" forKey:@"startup"]; 
[center postNotificationName:@"launchWithData" object:nil userInfo:dict]; 
NSLog(@"Posted notification"); 

}

そして、これが開かれたアプリである:

これは、他のアプリ開きアプリである

-(void)awakeFromNib { 
NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter]; 
[center addObserver:self selector:@selector(doStartup:) name:@"launchWithData" object:nil]; 

}

-(void)doStartup:(NSNotification *) aNote { 
NSLog(@"%@",aNote.userInfo); 

}

+0

分散通知をスプーフィングするのは簡単です。どのプロセスでも、どのデータでも1つを転記することができます。安全な何かのためにそれらに頼らないでください。 –

+0

その情報をありがとうKurt。これを行うより安全な方法について何をお勧めしますか? – rdelmar

+0

残念ながら、解決するのは簡単な問題ではありません。他にはそれほど便利ではありません。おそらく、UNIXドメインソケットや名前付きパイプを試してみてください。 10.7が必要な場合はXPC。あなたは、あなたと話している他のアプリがあなたが誰だと思っているかを確認しなければなりません。本当にその周りには何の方法もありません。 –

1

どのように2番目のCocoaアプリを起動しますか?

私がこれをしたとき、私は通常NSAppleScriptでAppleScriptを使って他のアプリと通信します。そのようにアプリを起動することもできます。もちろん、他のアプリはAppleScriptをサポートする必要があります。

両方のアプリケーションを制御できる場合は分散オブジェクトを使用することもできますが、より複雑です。

コマンドラインプログラムで作業する必要がある場合は、NSTaskが便利です。

+0

また、カスタムURLスキームを使用することができます。 – paulmelnikow

+0

私はopenURLメソッドを使用しています。これは、アプリケーションを起動するためのeaiserの方法であり、うまくいきます。私があなたが言及した両方のアプローチを探しています。 – willyMon

関連する問題