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 也是启动并通过新的撰写窗口聚焦。我不知道它为什么这样做。

另一件事,如果我设法成功发送自定义参数而不关注应用程序,我如何检查应用程序是否由我启动(检查参数是否存在)?

PS:我正在寻找适用于 App Store 的方法。

4

3 回答 3

1

如果可能,将时间戳 (UTC) 与您启动的应用程序名称一起发送到您的服务器或本地文件。

然后你可以跟踪它。

于 2013-06-30T23:44:02.647 回答
0

NSWorkspaceLaunchAndHide首先,如果NSWorkspaceLaunchWithoutActivation不是“工作” ,我会尝试。不理想,不..但一个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!

恭喜!

于 2013-07-02T22:25:54.983 回答
0

您可以使用 NSTask 创建新任务。使用 NSTask,您可以为应用程序设置参数以及一些环境变量,以便您可以检查它是由您启动还是由其他人启动。

这是执行此操作的示例代码嗅探:

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];
于 2013-07-05T10:02:07.673 回答