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

Mat*_*oal 7 cocoa

比方说,我需要给用户一个首选项面板来选择是否使用该应用程序为"标准"(与停靠图标和菜单)或代理应用程序(只有状态栏菜单)的能力.

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

这是正确的方法吗?

PS你可以在"麻雀"中找到这种行为.

Rob*_*ger 15

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

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

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

#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
Run Code Online (Sandbox Code Playgroud)

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