2011-08-09 62 views
6

假设我需要让用户能够通过首选项面板选择是否将应用程序用作“标准”(带有停靠图标和菜单)或作为代理应用程序(仅限状态栏菜单)。在运行时修改Info.plist以设置“应用程序是代理(UIElement)”

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

这是正确的方法吗?

P.S.你可以在“麻雀”中找到这种行为。

回答

13

你不应该在运行时修改你的应用程序的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 

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

+0

另外,更改'Info.plist'也会失败,权限不足以及只读卷(如磁盘映像)。 – gcbrueckmann

+1

感谢Rob Keniger.its为我工作得很好 – sp309

相关问题