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

Изглежда не мога да намеря никаква документация за това, така че се надявам някой да потвърди поведението, което виждам с пробата на Apple SMJobBless код.

Останах с впечатлението, че ще поиска администраторска парола само ако открие, че трябва да се инсталира нова версия на помощния инструмент.

Това впечатление обаче очевидно е невярно.

Поведението, което виждам под 10.6, е, че ако стартирам приложението за първи път, то ще поиска паролата. Ако стартирам почти веднага, няма да стане. Въпреки това, ако изчакам достатъчно дълго, той ще поиска паролата отново. По време на всичко това помощният инструмент не се променя.

Може ли някой да посочи документация, която определя това като правилно поведение?


person ericg    schedule 29.09.2011    source източник


Отговори (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 );
person ericg    schedule 13.10.2011
comment
Благодаря - SM* doco е малко труден за преминаване, това беше много полезно. - person Mark Aufflick; 29.03.2012
comment
Вижте също тази пощенска нишка (със същия въпрос от същия автор), която в допълнение към горното съдържа примерно приложение, включващо горните проверки плюс проверка на подписа на кода за инсталирания помощен инструмент (за да ви попречи да се доверите на заменен помощник със същия име/версия): cocoabuilder.com/archive/cocoa/ - person Mark Aufflick; 29.03.2012