修改Info.plist以在运行时设置“Application is agent(UIElement)”

时间:2011-08-09 15:12:58

标签: cocoa

假设我需要让用户能够通过首选项面板选择是将该应用程序用作“标准”(使用停靠栏图标和菜单)还是作为代理应用程序(仅限状态栏菜单)。

我认为我需要在执行期间以编程方式修改应用程序的“Info.plist”,将参数“Application is agent”更改为YES / NO。

这是正确的方法吗?

P.S。您可以在“Sparrow”中找到此行为。

1 个答案:

答案 0 :(得分:14)

您不应在运行时修改应用的Info.plist文件(或应用包中的任何内容)。这是不好的做法,如果代码已签名,也会破坏您的应用。现在这一点更为重要,因为应用商店中的所有应用都必须经过代码签名。

更好的选择是使用应用程序服务功能TransformProcessType()将您的应用程序从后台移动到前台应用程序。

首先,将应用LSUIElement中的Info.plist密钥设置为YES,然后在启动时检查用户默认值,以确定您的应用是否应作为代理运行:< / p>

#import <ApplicationServices/ApplicationServices.h>

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"LaunchAsAgentApp"]) 
    {
        ProcessSerialNumber psn = { 0, kCurrentProcess };
        TransformProcessType(&psn, kProcessTransformToForegroundApplication);
        SetFrontProcess(&psn);
    }
}

@end

确保您不要忘记将Application Services框架添加到项目中。