5

他のアプリを起動するこのアプリで作業しています。私が使用したアプリが起動に聞いている:
カスタムパラメータを使ってアプリからアプリを起動するには、アプリが私によって起動されたかどうか確認できますか?

[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self 
selector:@selector(appLaunched:) name:NSWorkspaceDidLaunchApplicationNotification 
object:nil]; 

をそして、私は彼らが使用して起動します(メールは一例です):

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"lalalala"], NSWorkspaceLaunchConfigurationArguments, nil]; 
[[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL URLWithString:@"/Applications/Mail.app"] options:NSWorkspaceLaunchWithoutActivation configuration:dict error:nil]; 

私はいくつかの研究をした、と私はあなたが送ることができることを見ましたあなたがアプリを起動したときの議論(これは上記のコードではdictのvarを使った理由ですが)、私はこれに問題があります:NSWorkspaceLaunchWithoutActivationを使ってもMail.appが起動し、新しい作文ウィンドウに集中します。なぜそれがそれをやっているのかわかりません。

もう1つのことは、アプリケーションに焦点を当てずにカスタム引数を正常に送信できた場合、アプリが私によって起動されたかどうかを確認できます(引数があるかどうかを確認します)。

PS:App Store対応のメソッドを探しています。

+1

そのアプリはちょうどコマンドラインのようにそれを行うためのAPIを提供しない限り、あなたは他のアプリの起動引数を確認することができません。引数は、すべてのCocoaアプリテンプレートのmain.mに表示されるものです。それは私が標準POSIXのargcとargv main()のためだよ – uchuugaka

+0

起動後にプロセスIDを取得して、それを後で照会することはできますか? –

+0

NSWorkspaceLaunchConfigurationArgumentsは、サンドボックスアプリケーションでは使用できません:https://developer.apple.com/reference/appkit/nsworkspacelaunchconfiguresarguments –

答えて

1

可能な場合は、サーバーに開始したアプリ名またはローカルファイルとともにタイムスタンプ(UTC)を送信します。

これで追跡できます。

0

NSWorkspaceLaunchWithoutActivationが「動作していない」場合、まず、NSWorkspaceLaunchAndHideを試してみます。理想的ではない、ない..しかし、その場しのぎ...

第二に...ここにトリックを行う "フル、実行している例では、" だ...

#import <Cocoa/Cocoa.h> 
NSString *psAUX(NSString*grep) {  
    FILE *read_f; char buff[BUFSIZ+1]; int char_rd; NSString *res, *cmnd; 
    memset(buff, '\0', sizeof(buff)); 
    cmnd = [NSString stringWithFormat:@"/bin/ps aux|grep -i %@",grep]; 
    read_f = popen(cmnd.UTF8String, "r"); 
    if (read_f == NULL) return nil; 
    char_rd = fread(buff, sizeof(char), BUFSIZ, read_f); 
    if (!char_rd) return nil; 
    return res = [NSString stringWithUTF8String:buff], pclose(read_f), res; 
} 
int main(int argc, char *argv[]) { @autoreleasepool {   
    NSString* secretStr; NSURL *mailURL; NSDictionary *cfg; NSWorkspace *ws; NSApplication.sharedApplication; 
    secretStr = @"TAMPAX"; 
    mailURL = [NSURL URLWithString:@"file:///Applications/Mail.app"]; 
    cfg = @{NSWorkspaceLaunchConfigurationArguments:@[secretStr]}; 
    ws = NSWorkspace.sharedWorkspace; 
    [ws launchApplicationAtURL:mailURL options:0 configuration:cfg error:nil]; 
    fprintf(stderr,"%s", 

     [psAUX(@"Mail.app") containsString:secretStr] 
     ? "You ARE Mail's baby's daddy!" 
     : "Hands off, she's NOT yours!"); 

[NSApp run]; } } 

NSLog - >You ARE Mail's baby's daddy!

おめでとうございます!

+0

ありがとうございます!私は後でそれを試してみる。 Btw、そのアプリストアが用意されていますか? –

+0

私は明らかにそれに対して不快感を与えるものは見ません...基本的に 'NSTask'を呼び出すのとはちょっと違う方法です。 –

+0

申し訳ありませんが、これはサンドボックスアプリケーションでは機能しません –

0

NSTaskを使用して新しいタスクを作成できます。 NSTaskを使用すると、あなたや他の誰かが起動したかどうかを確認できるように、アプリケーションにいくつかの環境変数だけでなく引数も設定できます。ここで

はそうするサンプルコードsniffetです:

NSTask* taskApp = [[NSTask alloc] init]; 
[taskApp setLaunchPath:@"App path goes here"]; 
[taskApp setArguments:[NSArray arrayWithObjects:@"Arg1",@"arg2", nil]]; 
[taskApp setEnvironment: [[NSProcessInfo processInfo] environment]]; 
[taskApp launch]; 
関連する問題