У нас возникла проблема с обновлением вспомогательного инструмента с SMJobBless, которая не дает нам покоя уже несколько дней.
Мы разрабатываем приложение, для которого в какой-то момент нам нужно выполнить административные задачи (загрузка/выгрузка kext). Мы также используем связку ключей для хранения информации об учетной записи для нашего приложения.
Для административных задач мы используем вспомогательный инструмент, который устанавливается с помощью SMJobBless, с которым мы взаимодействуем, используя DO через порты 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.
Кто-нибудь сталкивался с подобными проблемами или есть что-то очевидное, что мы делаем неправильно?