【问题标题】:SMJobBless - documentation on when it asks for admin passwordSMJobBless - 关于何时要求管理员密码的文档
【发布时间】:2011-11-28 00:41:00
【问题描述】:

我似乎找不到任何关于此的文档,因此希望有人可以使用 Apple 的示例 SMJobBless 代码确认我看到的行为。

我的印象是,如果它检测到需要安装新版本的帮助工具,它只会要求输入管理员密码。

但是,这种印象显然是不正确的。

我在 10.6 下看到的行为是,如果我第一次启动应用程序,它会要求输入密码。如果我几乎立即启动,它不会。但是,如果我等待足够长的时间,它会再次要求输入密码。在所有这些过程中,辅助工具不会改变。

谁能指出将其定义为正确行为的文档?

【问题讨论】:

    标签: macos cocoa launchd


    【解决方案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 );
    

    【讨论】:

    • 谢谢 - SM* doco 有点难以通过,这很有帮助。
    • 另请参阅此邮件线程(同一作者提出的同一问题),除上述内容外,该邮件线程还包含一个示例应用程序,包括上述检查以及已安装帮助工具的代码签名检查(以防止您信任具有相同名称/版本的替换助手):cocoabuilder.com/archive/cocoa/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2015-12-07
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多