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]; 

나는 몇 가지 조사를했고, 나는 당신이 보낼 수있는 것을보고 (위의 코드에서 var dict을 사용하는 이유는 무엇입니까?)하지만이 문제가 있습니다. NSWorkspaceLaunchWithoutActivation을 사용하더라도 Mail.app가 시작되고 새로운 작성 창에 초점이 맞춰집니다. 왜 그렇게하는지 모르겠습니다.

또 다른 한가지는 앱을 집중하지 않고 사용자 지정 인수를 보내면 앱이 저에 의해 시작되었는지 확인할 수 있습니다 (인수가 있는지 확인).

추신 : 나는 App Store-ready 메소드를 찾고 있습니다.

+1

당신은 다른 응용 프로그램의 실행 인수를 확인할 수없는 경우 다음

는 그렇게 할 수있는 샘플 코드 sniffet입니다. 논쟁은 모든 Cocoa 앱 템플릿의 main.m에서 볼 수있는 것입니다. 그것은 표준 POSIX argc 및 argv main()에 대한 것입니다 – uchuugaka

+0

프로세스 ID를 발급 후에 다시 가져 와서 나중에 쿼리 할 수 ​​있습니까? –

+0

NSWorkspaceLaunchConfigurationArguments는 샌드 박스 응용 프로그램에서 사용할 수 없습니다. https://developer.apple.com/reference/appkit/nsworkspacelaunchconfiguption –

답변

1

서버에 시작한 앱 이름 또는 가능하면 로컬 파일과 함께 타임 스탬프 (UTC)를 보냅니다.

그런 다음 추적 할 수 있습니다.

0

NSWorkspaceLaunchWithoutActivation이 "작동하지 않는 경우"첫째, 나는 NSWorkspaceLaunchAndHide을 시도합니다. 적합하지 않습니다, 아니 ..하지만 kludge ...

두 번째 ... 여기에 트릭을 수행하는 "전체 실행 예"..

#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를 사용하면 응용 프로그램에 인수 및 일부 환경 변수를 설정하여 사용자 또는 다른 사람이 시작할 수 있는지 확인할 수 있습니다. 이 응용 프로그램은 단지 명령 줄처럼 그렇게하기위한 API를 제공하지 않는 한

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];