2011-08-09 9 views
6

ユーザーに、「標準」としてアプリケーションを使用するかどうかを環境設定パネルで選択できるようにする必要があるとします)またはエージェントアプリとして(ステータスバーメニューのみ)。実行時にInfo.plistを変更して「アプリケーションがエージェント(UIElement)」に設定されている場合

実行中にプログラムの "Info.plist"をプログラムで変更し、 "Application is agent"パラメータをYES/NOに変更する必要があると思います。

これは正しい方法ですか?

P.S.この動作は "Sparrow"で見つけることができます。

答えて

13

実行時にアプリのInfo.plistファイル(またはアプリのバンドル内のもの)を変更しないでください。これは悪い習慣であり、コードが署名されていればあなたのアプリを壊すでしょう。これは今日、アプリストアのすべてのアプリをコード署名する必要があるため、もっと重要です。

より良いオプションは、アプリケーションサービス機能TransformProcessType()を使用して、アプリをバックグラウンドからフォアグラウンドアプリに移動することです。

まず、あなたのアプリのInfo.plistYESにでLSUIElementキーを設定して、あなたのアプリがエージェントとして動作してするかどうかを決定するために起動時にユーザーのデフォルトをチェックしてください。

#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

関連する問題