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);
Dzięki - doktorowi SM * trudno się przebrnąć, to było bardzo pomocne. –
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 –