如果有人有興趣,這(可能)原來是一個錯誤,一個已經提交。 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);
謝謝 - SM * doco有點難以渡過,這非常有幫助。 –
另請參閱此郵件主題(同一作者的同一問題),除上述內容外,還包含一個示例應用程序,其中包含上述檢查以及已安裝幫助工具的代碼簽名檢查(以防止您信任替換的幫助程序相同的名稱/版本):http://www.cocoabuilder.com/archive/cocoa/309298-question-about-smjobbless.html –