SMJobBless-документация о том, когда он запрашивает пароль администратора
Я не могу найти никакой документации по этому вопросу, поэтому надеюсь, что кто-то сможет подтвердить поведение, которое я вижу с образцом кода Apple SMJobBless.
У меня сложилось впечатление, что он запросит пароль администратора только в том случае, если обнаружит, что требуется установить новую версию вспомогательного инструмента.
Однако это впечатление, по-видимому, неверно.
Поведение, которое я вижу под 10.6, заключается в том, что если я запускаю приложение в первый раз, оно попросит пароль. Если я запускаю почти сразу, это не так. Однако, если я подожду достаточно долго, он снова запросит пароль. Во время всего этого вспомогательный инструмент не меняется.
Может ли кто-нибудь указать на документацию, которая определяет это как правильное поведение?
1 ответ:
Если кто-то заинтересован, это (вероятно) оказалось ошибкой, и она была подана. 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 );