6
假设我需要让用户能够通过首选项面板选择是否将应用程序用作“标准”(带有停靠图标和菜单)或作为代理应用程序(仅限状态栏菜单)。在运行时修改Info.plist以设置“应用程序是代理(UIElement)”
我想我需要在执行过程中以编程方式修改应用程序的“Info.plist”,将参数“Application is agent”更改为YES/NO。
这是正确的方法吗?
P.S.你可以在“麻雀”中找到这种行为。
假设我需要让用户能够通过首选项面板选择是否将应用程序用作“标准”(带有停靠图标和菜单)或作为代理应用程序(仅限状态栏菜单)。在运行时修改Info.plist以设置“应用程序是代理(UIElement)”
我想我需要在执行过程中以编程方式修改应用程序的“Info.plist”,将参数“Application is agent”更改为YES/NO。
这是正确的方法吗?
P.S.你可以在“麻雀”中找到这种行为。
你不应该在运行时修改你的应用程序的Info.plist
文件(或你的应用程序包中的任何东西)。这是不好的做法,如果它是代码签名,也会破坏你的应用程序。由于应用商店中的所有应用都必须进行代码签名,因此现在这一点更为重要。
更好的选择是使用应用程序服务功能TransformProcessType()
将您的应用程序从后台移动到前台应用程序。
首先,设置在LSUIElement
关键应用的Info.plist
到YES
,然后检查在启动用户默认,以确定您的应用程序必须运行作为代理或不:
#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框架添加到您的项目中。
另外,更改'Info.plist'也会失败,权限不足以及只读卷(如磁盘映像)。 – gcbrueckmann
感谢Rob Keniger.its为我工作得很好 – sp309