SMJobBless-документация о том, когда он запрашивает пароль администратора


Я не могу найти никакой документации по этому вопросу, поэтому надеюсь, что кто-то сможет подтвердить поведение, которое я вижу с образцом кода Apple SMJobBless.

У меня сложилось впечатление, что он запросит пароль администратора только в том случае, если обнаружит, что требуется установить новую версию вспомогательного инструмента.

Однако это впечатление, по-видимому, неверно.

Поведение, которое я вижу под 10.6, заключается в том, что если я запускаю приложение в первый раз, оно попросит пароль. Если я запускаю почти сразу, это не так. Однако, если я подожду достаточно долго, он снова запросит пароль. Во время всего этого вспомогательный инструмент не меняется.

Может ли кто-нибудь указать на документацию, которая определяет это как правильное поведение?

1 5

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 );