誰かが興味を持っているなら、これは(おそらく)バグであることが判明し、1つが提出されました。rdar://10280469
システムが現在機能している方法は、SMJobBless関数がヘルパーツールをインストールする必要があるかどうかに関係なく、毎回管理者パスワードを要求することです。バグは(おそらく)ヘルパーツールをインストールする必要がない場合(たとえば、既にインストールされており、アプリバンドルのバージョンと同じバージョンである場合)は管理者パスワードの要求を行わないことです。
つまり、ヘルパーツールをインストールする必要があるかどうかの判断は、ヘルパーツールをインストールする必要があることがすでにわかっている場合にのみ、SMJobBlessおよびSMJobBlessを呼び出す前に行う必要があるということです。
私の場合、ツールがインストールされているかどうかを確認するだけで済み(SMJobCopyDictionaryがこれを処理します)、ツールがインストールされている場合は、そのバージョンがアプリバンドル内のツールのバージョンよりも古いかどうかを確認します。
ツールがインストールされているかどうか、およびバージョンが何であるかを確認するためのいくつかの(不完全な)コードを以下に示します。
ヘルパーツールのバージョンチェックを行う別の方法があります。これは、ヘルパーツールがそのバージョンの要求を受信し、バージョン応答を返信するためのものです。個人的には、以下の方法が好きですが、状況によっては最善の方法である可能性があるため、この代替方法について言及したいと思います。
NSDictionary* installedHelperJobData;
installedHelperJobData = (NSDictionary*)SMJobCopyDictionary( kSMDomainSystemLaunchd, (CFStringRef)@"com.apple.bsd.SMJobBlessHelper" );
NSString* installedPath = [[installedHelperJobData objectForKey:@"ProgramArguments"] objectAtIndex:0];
NSURL* installedPathURL = [NSURL fileURLWithPath:installedPath];
NSDictionary* installedInfoPlist = (NSDictionary*)CFBundleCopyInfoDictionaryForURL( (CFURLRef)installedPathURL );
NSString* installedBundleVersion = [installedInfoPlist objectForKey:@"CFBundleVersion"];
NSInteger installedVersion = [installedBundleVersion integerValue];
NSLog( @"installedVersion: %ld", (long)installedVersion );
NSBundle* appBundle = [NSBundle mainBundle];
NSURL* appBundleURL = [appBundle bundleURL];
NSURL* currentHelperToolURL = [appBundleURL URLByAppendingPathComponent:@"Contents/Library/LaunchServices/com.apple.bsd.SMJobBlessHelper"];
NSDictionary* currentInfoPlist = (NSDictionary*)CFBundleCopyInfoDictionaryForURL( (CFURLRef)currentHelperToolURL );
NSString* currentBundleVersion = [currentInfoPlist objectForKey:@"CFBundleVersion"];
NSInteger currentVersion = [currentBundleVersion integerValue];
NSLog( @"currentVersion: %ld", (long)currentVersion );