我们在使用 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 上进行测试。
有没有人遇到过类似的问题,或者有什么明显的我们做错了?