2011-09-29 67 views
5

我似乎無法找到關於此的任何文檔,所以希望有人能夠確認我看到的Apple代碼示例SMJobBless的行爲。SMJobBless - 關於何時請求管理員密碼的文檔

我的印象是,如果它檢測到需要安裝新版本的幫助工具,它只會要求輸入管理員密碼。

但是,這種印象顯然是不正確的。

我在10.6下看到的行爲是,如果我第一次啓動應用程序,它會詢問密碼。如果我幾乎立即啓動,它不會。但是,如果我等了很長時間,它會再次要求輸入密碼。在所有這些過程中,輔助工具不會改變。

任何人都可以指出文檔,將其定義爲正確的行爲?

回答

12

如果有人有興趣,這(可能)原來是一個錯誤,一個已經提交。 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); 
+0

謝謝 - SM * doco有點難以渡過,這非常有幫助。 –

+1

另請參閱此郵件主題(同一作者的同一問題),除上述內容外,還包含一個示例應用程序,其中包含上述檢查以及已安裝幫助工具的代碼簽名檢查(以防止您信任替換的幫助程序相同的名稱/版本):http://www.cocoabuilder.com/archive/cocoa/309298-question-about-smjobbless.html –