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

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

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

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

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

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

1 Ответ

14 голосов
/ 13 октября 2011

Если кому-то интересно, это (вероятно) оказалось ошибкой и одна была подана.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 );
...