6

私はこれに関するドキュメントを見つけることができないようですので、誰かが私が見ている動作をAppleのサンプルSMJobBlessコードで確認できることを願っています。

新しいバージョンのヘルパーツールをインストールする必要があることが検出された場合にのみ、管理者パスワードを要求するという印象を受けました。

しかし、この印象は明らかに間違っています。

10.6で見られる動作は、アプリを初めて起動すると、パスワードを要求されることです。すぐに起動すると、起動しません。ただし、十分に待つと、パスワードの入力を再度求められます。このすべての間、ヘルパーツールは変更されません。

これを正しい動作として定義しているドキュメントを誰かが指摘できますか?

4

1 に答える 1

14

誰かが興味を持っているなら、これは(おそらく)バグであることが判明し、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 );
于 2011-10-13T18:24:56.823 に答える