SMJobBless を使用してヘルパー ツールを更新する際に問題が発生し、何日も頭を悩ませてきました。
ある時点で管理タスク (kext のロード/アンロード) を実行する必要があるアプリケーションを開発しています。また、キーチェーンを使用して、アプリケーションのアカウント情報を保存しています。
管理タスクについては、SMJobBless を使用してインストールされたヘルパー ツールを使用します。このヘルパー ツールとは、DO over Mach ポート (NSConnection を使用) を使用して通信します。
ヘルパー ツールで:
// use our bundle id as our service name
NSString* name = [[NSBundle mainBundle] bundleIdentifier];
launch_data_t checkinRequest = launch_data_new_string(LAUNCH_KEY_CHECKIN);
launch_data_t checkinResponse = launch_msg(checkinRequest);
launch_data_t machServicesDict = launch_data_dict_lookup(checkinResponse, LAUNCH_JOBKEY_MACHSERVICES);
launch_data_t machPort = launch_data_dict_lookup(machServicesDict, [name UTF8String]);
mach_port_t mp = launch_data_get_machport(machPort);
launch_data_free(checkinResponse);
launch_data_free(checkinRequest);
NSMachPort *receivePort = [[NSMachPort alloc] initWithMachPort:mp];
NSConnection *server = [NSConnection connectionWithReceivePort:receivePort sendPort:nil];
アプリ内:
NSConnection *conn = [NSConnection connectionWithRegisteredName:HELPER_BUNDLE_IDENTIFIER host:nil];
id proxyServerObject = [conn rootProxy];
if(conn && proxyServerObject) {
return [proxyServerObject someMethod];
}
return NO;
Thawte のコード署名証明書を使用して、アプリケーションとヘルパー ツールの両方に署名します。これまでのところ、すべてが魔法のように機能します。ヘルパー ツールがインストールされ、DO を使用して通信できます。kext が正常にロードおよびアンロードされました。
ヘルパー ツールを更新しようとすると、問題が発生します。インストールされているツールの情報ディクショナリとアプリ バンドルにバンドルされているツールを使用して、ツールの更新が必要かどうかを確認し、再度 SMJobBless を呼び出して更新を実行します。
SMJobBless 呼び出しの後、次の行がコンソールに表示されます。
6/19/12 10:31:24.000 AM kernel: CODE SIGNING: cs_invalid_page(0x104e17000): p=74362[OURAPP] clearing CS_VALID
6/19/12 10:31:24.000 AM kernel: CODE SIGNING: cs_invalid_page(0x10d0de000): p=74364[OURAPPHELPER] clearing CS_VALID
この後、アプリケーションはキーチェーン アイテムからアプリケーション パスワードを読み取ることができず、関数は をSecKeychainItemCopyContent
返しますerrSecAuthFailed (-25293)
。ただし、インストール済みのヘルパー ツールまたはアプリケーション バンドルのコード署名を を使用して手動で検証した場合、エラーは報告されませんcodesign -vvvv PATH_TO_TOOL_OR_BUNDLE
。ツールとアプリケーションは Xcode 環境の外部で署名され、署名プロセス後に内容が変更されることはありません。
同様の状況を説明する別の投稿が見つかりましたが、その質問はまだ答えられていません. 関連する問題として、SMJobBless がエラー 4098 を返す可能性があります。
OSX 10.7.4 でテストしています。
誰かが同様の問題に直面したか、それとも私たちが間違っていることは明らかですか?