- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的被一个简单的任务困在这里,但仍然无法让它工作。
我已经成功使用 HelperApp 实现了“LaunchAtLogin”功能,如 this article 中所述。 。但我的应用程序应该对 launch-by-helper-app 和 launch-by-user 操作做出不同的 react 。所以我现在的任务是有某种标志表明 MainApp 是由 HelperApp 启动的。
我知道有很多类似的问题,但仍然没有一个解决方案适合我。沙盒似乎删除了我尝试发送到 MainApp 的所有参数。
这是我尝试过的:
- [NSWorkspace - launchApplicationAtURL: options: configuration: error:]
- [NSWorkspace - openURLs: withAppBundleIdentifier: options: additionalEventParamDescriptor: launchIdentifiers:]
- LSOpenApplication()
直到最近,我认为当用户手动启动应用程序时,我可以依赖 Finder 发送的 -psn 参数。但即使 MainApp 由 HelperApp 启动,此参数也会在 10.8 上发送。
在 article如上所述,作者建议使用[NSWorkspace - launchApplicationAtURL: options: configuration: error:]
。参数已发送,但没有任何内容到达 MainApp。
有人成功完成此(或类似)任务吗?
需要帮助!提前致谢!
最佳答案
经过 hell 般的搜索和实验,我准备好回答我自己的问题,这样其他人就可以节省时间和精力。
我的结论是,目前 HelperApp 无法在沙箱下通过一些参数启动 MainApp。至少我还没有找到任何方法来做到这一点。
像这样启动MainApp:
[[NSWorkspace sharedWorkspace] launchApplication:newPath];
在MainApp中添加以下内容:
Application_IsLaunchedByHelperApp = YES;
ProcessSerialNumber currPSN;
OSStatus err = GetCurrentProcess(&currPSN);
if (!err)
{
// Get information about our process
NSDictionary * currDict = [(NSDictionary *)ProcessInformationCopyDictionary(&currPSN,
kProcessDictionaryIncludeAllInformationMask) autorelease];
// Get the PSN of the app that launched us. Its not really the parent app, in the unix sense.
long long temp = [[currDict objectForKey:@"ParentPSN"] longLongValue];
long long hi = (temp >> 32) & 0x00000000FFFFFFFFLL;
long long lo = (temp >> 0) & 0x00000000FFFFFFFFLL;
ProcessSerialNumber parentPSN = {(UInt32)hi, (UInt32)lo};
// Get info on the launching process
NSDictionary * parentDict = [(NSDictionary*)ProcessInformationCopyDictionary(&parentPSN,
kProcessDictionaryIncludeAllInformationMask) autorelease];
// analyze
// parent app info is not null ?
if (parentDict && parentDict.count > 0)
{
NSString * launchedByAppBundleId = [parentDict objectForKey:@"CFBundleIdentifier"];
if (![launchedByAppBundleId isEqualToString:HELPER_APP_BUNDLE_ID])
{
Application_IsLaunchedByHelperApp = NO;
}
}
}
就是这样。 Application_IsLaunchedByHelperApp
现在具有正确的值。
解决方案不是我的。我在网上找到了它(我猜是cocoabuilder)。祝大家好运!感谢您关注我的问题。
更新看起来有些情况下在登录应用程序启动时会显示 launchedByAppBundleId = @"com.apple.loginwindow"
。所以代码的最后一部分将如下所示:
//
// analyze
//
// parent app info is not null ?
if (parentDict && parentDict.count > 0)
{
NSString * launchedByAppBundleId = [parentDict objectForKey:@"CFBundleIdentifier"];
if (![launchedByAppBundleId isEqualToString:HELPER_APP_BUNDLE_ID] &&
![launchedByAppBundleId isEqualToString:@"com.apple.loginwindow"])
{
Application_IsLaunchedByHelperApp = NO;
}
}
关于cocoa - 了解 MainApp 是否由 HelperApp 启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15599345/
我的项目由一个用于设置用户默认值的 PrefPane 和一个在后台运行的 HelperApp 组成。两者都通过 CFPreferences 函数访问共享首选项 plist 文件。 基本上,Helper
我真的被一个简单的任务困在这里,但仍然无法让它工作。 我已经成功使用 HelperApp 实现了“LaunchAtLogin”功能,如 this article 中所述。 。但我的应用程序应该对 la
我这里有一个严重的问题。请在下面找到我的场景: 登录 点击链接 点击后,会打开一个新选项卡 我已使用以下代码将焦点切换到新打开的选项卡 ArrayList newTab = new ArrayList
在 Java 中使用 Selenium Web 驱动程序,我试图通过单击应用程序中的链接来下载文件。 即单击链接后,下载应该开始而不询问是否使用 Firefox 12 浏览器保存文件的选项。 我正在使
我学习了如何将 Firefox 4 与 watir 和 webdriver(在 Win7 x64 上)一起使用,设置配置文件项。例子: profile = Selenium::WebDriver::F
我是一名优秀的程序员,十分优秀!