2011-09-29 14 views
5

Nie mogę zlokalizować żadnej dokumentacji na ten temat, więc mam nadzieję, że ktoś może potwierdzić zachowanie, które widzę z próbką Apple'a o kodzie SMJobBless.SMJobBless - dokumentacja, kiedy prosi o hasło administratora

Miałem wrażenie, że poprosiłoby o podanie hasła administratora tylko wtedy, gdyby wykryło konieczność zainstalowania nowej wersji narzędzia pomocniczego.

Jednak wrażenie to jest nieprawdziwe.

Zachowanie, które widzę poniżej 10.6, polega na tym, że jeśli uruchomię aplikację po raz pierwszy, poprosi o podanie hasła. Jeśli uruchomię się niemal natychmiast, nie będzie. Jeśli jednak poczekam wystarczająco długo, ponownie poprosi o hasło. Podczas tego wszystkiego narzędzie pomocnicze się nie zmienia.

Czy ktoś może wskazać dokumentację, która określa to jako prawidłowe zachowanie?

Odpowiedz

12

Jeśli ktokolwiek jest zainteresowany, to (prawdopodobnie) okazało się błędem, a jeden został zgłoszony. rdar: // 10280469

Sposób działania systemu polega na tym, że będzie on pytał o hasło administratora za każdym razem, niezależnie od tego, czy funkcja SMJobBless musi zainstalować narzędzie pomocnicze, czy też nie. Błąd (prawdopodobnie) polega na tym, że żądanie hasła administratora nie powinno zostać wykonane, jeśli narzędzie pomocnika nie musi być zainstalowane (na przykład jest już zainstalowane i ma tę samą wersję, co w pakiecie aplikacji).

Co oznacza, że ​​określenie, czy narzędzie pomocnicze musi zostać zainstalowane, musi zostać wykonane przed wywołaniem SMJobBless, a SMJobBless powinno zostać wywołane tylko wtedy, gdy jest już znane, że narzędzie pomocnicze musi być zainstalowany.

W moim przypadku wystarczy sprawdzić, czy narzędzie jest zainstalowane (SMJobCopyDictionary obsługuje to) i, jeśli narzędzie jest zainstalowane, czy jego wersja jest starsza, czy wersja narzędzia w pakiecie aplikacji.

Niektóre (niekompletne) kod, aby sprawdzić, czy narzędzie jest zainstalowane i jakie wersje są poniżej.

Istnieje inna alternatywa dla sprawdzenia wersji narzędzia pomocnika, która jest dla narzędzia pomocniczego, aby odebrać żądanie dla jego wersji i wysłać odpowiedź w wersji wstecz. Osobiście podoba mi się poniższa metoda, ale chciałem wspomnieć o tej alternatywie, ponieważ w niektórych sytuacjach może to być najlepsza ścieżka.

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

Dzięki - doktorowi SM * trudno się przebrnąć, to było bardzo pomocne. –

+1

Zobacz także ten wątek (to samo pytanie tego samego autora), który oprócz powyższego zawiera przykładową aplikację zawierającą powyższe sprawdzenia oraz sprawdzenie podpisu kodu dla zainstalowanego narzędzia pomocnika (aby zapobiec zaufaniu zastępcy pomocnika ta sama nazwa/wersja): http://www.cocoabuilder.com/archive/cocoa/309298-question-about-smjobbless.html –

Powiązane problemy