Se qualcuno è interessato, questo (probabilmente) si è rivelato un bug e uno è stato archiviato. rdar: // 10280469
Il modo in cui il sistema attualmente funziona è che richiederà sempre una password di amministratore indipendentemente dal fatto che la funzione SMJobBless debba o meno installare lo strumento helper o meno. Il bug è (probabilmente) che una richiesta di password amministratore non dovrebbe essere eseguita se non è necessario installare lo strumento helper (ad esempio, è già installato e ha la stessa versione di quello nel pacchetto app).
Quindi, ciò significa che è necessario stabilire se lo strumento di supporto deve essere installato o meno prima che venga chiamata una chiamata a SMJobBless e SMJobBless solo se è già noto che lo strumento di supporto deve essere installato.
Nel mio caso, ho solo bisogno di controllare se lo strumento è installato (SMJobCopyDictionary gestisce questo) e, se lo strumento è installato, se la sua versione è precedente o meno la versione dello strumento nel mio pacchetto di app.
Alcuni (incompleti) codici per verificare se lo strumento è installato e quali sono le versioni riportate di seguito.
C'è un'altra alternativa per fare un controllo di versione dello strumento di supporto che è per lo strumento di supporto per ricevere una richiesta per la sua versione e per poter inviare una risposta di risposta. Personalmente, mi piace il metodo qui sotto, ma volevo menzionare questa alternativa in quanto potrebbe essere il percorso migliore in alcune situazioni.
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);
Grazie - la SM * doco è un po 'difficile da guadare, questo è stato molto utile. –
Vedere anche questo thread di posta (della stessa domanda dello stesso autore) che in aggiunta a quanto sopra contiene un'app di esempio che include i controlli sopra più un controllo della firma del codice per lo strumento helper installato (per evitare che si fida di un helper sostituito con il stesso nome/versione): http://www.cocoabuilder.com/archive/cocoa/309298-question-about-smjobbless.html –