Если кому-то интересно, это (вероятно) оказалось ошибкой и одна была подана.rdar: // 10280469
В настоящее время система работает так, что она запрашивает пароль администратора каждый раз, независимо от того, требуется или нет функция SMJobBless для установки вспомогательного инструмента или нет.Ошибка (вероятно) заключается в том, что запрос пароля администратора не следует делать, если вспомогательный инструмент не требуется устанавливать (например, он уже установлен и имеет ту же версию, что и в комплекте приложений).
Таким образом, это означает, что определение необходимости установки вспомогательного инструмента необходимо выполнить до вызова SMJobBless и SMJobBless, только если известно, что вспомогательный инструмент необходимо установить..
В моем случае мне нужно только проверить, установлен ли инструмент (SMJobCopyDictionary обрабатывает это) и, если инструмент установлен, является ли его версия старше, чем версия инструмента в моем приложении.bundle.
Некоторый (неполный) код для проверки, установлен ли инструмент и какие версии указаны ниже.
Существует еще одна альтернатива для проверки версии вспомогательного инструмента, которая позволяет вспомогательному инструменту получать запрос на его версию и отправлять ответ о версии обратно.Лично мне нравится метод, описанный ниже, но я хотел бы упомянуть об этой альтернативе, так как в некоторых ситуациях это может быть лучшим путем.
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 );