Создание универсального приложения для iOS 3.0 с использованием Xcode 4.3.x — исключение NSKeyedUnarchiver

Пытаюсь собрать и отладить универсальное приложение для iOS 3.0 с помощью Xcode 4.3.2. Я получаю NSException от NSKeyedUnarchiver. Кажется, это может быть связано с невозможностью прочитать основной файл .xib. Я видел это: iOS и разархивирование файлов xib - однако в этом случае это не ясно, что приложение является универсальным (их решение не работает) (ПРИМЕЧАНИЕ. Их решение не работает, потому что они используют Xcode 4.2, а не 4.3).

Вот вывод ошибки:

2000-01-01 11:00:39.-19 myApp[664:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x4e, 0x49, 0x42, 0x41, 0x72, 0x63, 0x68, 0x69)'
2000-01-01 11:00:39.-01 myApp[664:207] Stack: (
        808001701,
        805397928,
        807551015,
        807550919,
        810902709,
        815043196,
        815042704,
        814682908,
        814682012,
        814970032,
        814968048,
        814966908,
        839149932,
        807750263,
        807747947,
        814678868,
        814672532,
        12253,
        12124
    )
    terminate called after throwing an instance of 'NSException'
    Not safe to look up objc runtime data. 

person windup    schedule 01.04.2012    source источник
comment
Итак, чтобы было ясно, вы установили для всех своих файлов XIB настройки, указанные в этом ответе?   -  person borrrden    schedule 01.04.2012
comment
Я не знаю, нужно ли вам это делать, но я установил для развертывания и разработки значение 3.0 для каждого из файлов. Я также пробовал настройки только iPad .xib на 3.2. Несмотря на это, я получаю указанную выше ошибку при отладке iOS 3.0.   -  person windup    schedule 01.04.2012
comment
3.2 все еще больше, чем 3.0. Если это самое низкое значение, которое может быть, вам, возможно, придется рассмотреть возможность понижения XCode до 4.2.1, чтобы иметь возможность соответствовать настройкам, показанным в этом ответе. Если вы не хотите переходить на более раннюю версию, я думаю, вам следует подумать о повышении минимальной версии iOS.   -  person borrrden    schedule 01.04.2012
comment
Вы неправильно понимаете — я установил для всех .xibs значение 3.0 для развертывания и разработки. Я также попытался установить только для iPad .xibs значение 3.2 (поскольку это была первая ОС, поддерживающая iPad). Ни один из них не работал.   -  person windup    schedule 01.04.2012


Ответы (3)


Просто подумал, что поделюсь своим решением этой непонятной ошибки xib архива NSKeyedUnarchiver.

Я только что потратил пару недель на это, и мой обходной путь почти такой же, как у borrrden выше (т.е. использовать файлы пера, созданные со старой версией Xcode). Я перепробовал все, что только мог придумать, без особого удовольствия. (Мой другой выбор состоял в том, чтобы прекратить использовать файл xib и написать весь пользовательский интерфейс в коде или прекратить поддержку iOS 3.0)

Итак, вот моя ситуация, как я заставил обходной путь работать и как я приступил к созданию архива дистрибутива для магазина приложений.

Сначала небольшая предыстория. Мое приложение изначально было создано с помощью Xcode 3.2.5 и отлично работало на iOS 3.0 и более поздних версиях. Когда я обновился до Xcode 4.2, я получил ошибку NSKeyedUnarchiver, как только приложение загрузило файл xib. После небольшого поиска в Google я наткнулся на другие статьи, упомянутые в этой теме, поэтому я изменил версию развертывания и разработки для каждого файла xib. Это сработало, пока я не обновился до Xcode 4.3.1, когда ошибка вернулась. Я перепроверил все файлы xib, но без радости. Несмотря на то, что они были установлены для iOS3.0/IB3.0 (и я перепробовал все доступные комбинации), приложение все равно вылетало.

В попытке доказать, что это была проблема с файлами xib, я попытался выполнить отладку на устройстве (iPod Touch 2-го поколения под управлением iOS 3.0, подключенный к Xcode кабелем). Но приложение вылетит до того, как отладчик сможет запуститься. Поэтому я удалил MainWindow.xib из проекта (установив App Delegate и UIWindow в коде). Это позволило отладчику начать работу и сработала моя первая точка останова (первая строка приложения: didFinishLaunchingWithOptions), но приложение просто зависало, не вызывая исключения, как только я нажимал ViewController. После долгих копаний я переключил отладчик с LLDB на GDB (из «Продукты» -> «Редактировать схему»). Это остановило зависание приложения и выдало исключение, как я и ожидал (непонятный архивный). LLDB, очевидно, все еще имеет проблемы.

После пары недель выдергивания моих волос единственное, что сработало, — это использовать файлы пера, созданные с помощью старой версии Xcode. К счастью, на моей машине все еще стоит Xcode 3.2.5. Вот шаги, которые я использовал, чтобы заставить это работать и разрешить создание архива для магазина приложений:

  • Выйдите из Xcode 4.3.1 и запустите Xcode 3.2.5.
  • Создайте новый проект View-Based-Application и добавьте в него все файлы .xib из вашего основного проекта.
  • Установите цель развертывания на iOS3.0, затем выполните сборку и запуск выпуска на устройстве (используйте общий профиль подготовки, если он не подбирает это автоматически)
  • В Xcode откройте .app в Finder, затем покажите содержимое пакета, чтобы увидеть все файлы .nib внутри него (Xcode преобразовал файлы .xib в файлы .nib).
  • Для простоты использования скопируйте файлы .nib в другой каталог.
  • Выйдите из Xcode 3.2.5, запустите Xcode 4.3.1 и откройте свой проект.
  • Посетите каждый xib и на боковой панели справа отмените выбор своего приложения в целевом членстве (это означает, что Xcode не будет использовать эти файлы .xib для окончательного пакета).
  • Теперь добавьте все новые файлы .nib (сгенерированные Xcode 3.2.5) в свой проект (для аккуратности поместите их в собственную группу).
  • Теперь вы можете очищать, создавать и запускать сколько угодно и даже создавать архив для магазина приложений.

Чтобы убедиться, что используются правильные файлы .nib, используйте md5 из терминала. Покажите свое .app (или архив из Organizer) в Finder, чтобы увидеть, где его создал Xcode, а затем покажите содержимое пакета, чтобы увидеть файлы .nib. Сравните контрольные суммы md5 с контрольными суммами из файлов .nib, созданных Xcode 3.2.5.

Просто помните, что каждый раз, когда вы изменяете xib, он не будет использоваться, пока вы не создадите его из Xcode 3.2.5. и скопируйте полученный файл .nib в каталог хранения.

Это не идеально, и если у кого-то есть лучшее решение, которое работает, я буду рад его услышать. А пока я надеюсь, что это поможет.

person AW101    schedule 09.04.2012
comment
Спасибо, жаль, что я не видел это на прошлой неделе. Я попробовал то, что у меня было, как есть, на 3.1.2+, и это сработало, поэтому вместо этого я установил цель на 3.1. На самом деле я собирался попробовать что-то вроде того, что вы написали, но старый Xcode, который у меня был, не работал на Lion, поэтому я сдался. Были ли у вас проблемы с запуском Xcode 3.2.5 на Lion? - person windup; 10.04.2012
comment
У меня Xcode 3.2.5 на Lion работал нормально, но вы ограничены iOS4 SDK, иначе я бы застрял с ним. В какой-то момент я тоже пошел по вашему пути, но у меня были проблемы с установкой iOS 3.1.2 на устройство, поэтому я сдался. Вы знаете, есть ли у Apple эти старые прошивки, доступные для скачивания? - person AW101; 11.04.2012
comment
Получение 3.1.2 было болезненным - задайте новый вопрос, и я отвечу, поэтому я могу закрыть это. Вставьте ссылку в качестве комментария здесь. - person windup; 13.04.2012

Думаю, я понял. iOS до версии 3.2 не поддерживает формат XIB, поэтому вам нужно сначала преобразовать его в старый формат NIB, как в этом ответе: Загрузка основного XIB приводит к сбою приложения на iOS 3.0

Вот статья, к которой относится вопрос Примечания к выпуску iOS 3.2 SDK

person borrrden    schedule 01.04.2012
comment
Я просмотрел раздел примечаний к выпуску, озаглавленный Interface Builder. Он указывает на две настройки сборки Flatten.. и Strip. В Xcode 4.3 вижу настройки Flatten, но это уже да. Я не вижу настроек полосы, но предположу, что если бы она была, то было бы да, поскольку я не использую локализацию. Я что-то упускаю? - person windup; 02.04.2012
comment
Вы НЕ хотите сглаживать его, вот в чем проблема: D. - person borrrden; 02.04.2012
comment
Насколько я читал, возможность оставлять xib несжатым и неразрезанным была новой в 3.2, но по умолчанию сглаживание и разбиение, как это делалось до 3.2. Несмотря на это, я попытался установить для параметра Flatten значение NO, и вместо приведенной выше ошибки я получаю: Failed to load NSMainNibFile MainWindow_Phone. - person windup; 02.04.2012
comment
Это сообщение об ошибке не очень полезно :-S... Я полагаю, вы пытались очистить и переустановить проект? Есть ли какая-либо другая информация, которую вы можете найти, кроме этого сообщения? - person borrrden; 02.04.2012
comment
К сожалению, нет, это все, что я получаю. Да, чистка и переустановка. Можете ли вы заставить Xcode 4.3 запускать код на iOS 3.0? - person windup; 02.04.2012
comment
Нет, я просто постулирую теории (и, к сожалению, у меня нет теорий...). Я никогда не пользовался iOS 3.0 - person borrrden; 02.04.2012

Проверьте эти ссылки:

РЕШЕНИЕ 1.

iOS и разархивирование файлов xib

Прочтите ответ SK9 по приведенной выше ссылке, который выглядит следующим образом:

Я считаю, что этот ответ охватывает то, что мог дать Икурагеймс (он не рядом со своим компьютером). От его имени, чтобы решить проблему в Xcode 4.2.1, щелкните файл .xib и на панели свойств файла с правой стороны установите для развертывания значение «iOS 3.0» (в моем случае), а для разработки — «Interface Builder». 3.0" (опять же в моем случае). Сделайте это для каждого файла .xib в проекте.

Стоит иметь в виду, что Xcode 4.2.1 вполне может установить значения по умолчанию «iOS 5.0» для развертывания здесь, чтобы соответствовать текущему SDK, и «Xcode 4.1» для типа документа. Почему Xcode просто не сопоставляет цель развертывания с целью развертывания проекта, я не уверен...

Если это все еще не работает или вы слишком параноики на этом этапе, перехватите исключение, вызванное NSKeyedUnarchiver при загрузке файла .xib, и создайте представление программно.

введите здесь описание изображения

РЕШЕНИЕ 2.

Небезопасно искать данные времени выполнения objc

Прочитайте ответ BadPirate по ссылке выше, который выглядит следующим образом:

Может быть, в параллельном потоке происходит malloc. Ознакомьтесь с этим решением для ребят: http://www.fatcatsoftware.com/blog/2010/04< /а>

РЕШЕНИЕ 3.

Сбой симулятора iPhone в NSKeyedUnarchiver после установки базового SDK

Прочтите ответ Флориана по приведенной выше ссылке, который выглядит следующим образом:

Я решил проблему с этой подробной трассировкой стека:

#0  0x302ac924 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___  
#1  0x904a3509 in objc_exception_throw  
#2  0x3028e5fb in +[NSException raise:format:arguments:]  
#3  0x3028e55a in +[NSException raise:format:]  
#4  0x30513b77 in -[NSKeyedUnarchiver initForReadingWithData:]  
#5  0x30ab4b2a in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:]  
#6  0x30ab6eb3 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:]  
#7  0x308f85f1 in -[UIApplication _loadMainNibFile]  
#8  0x30901a15 in -[UIApplication _runWithURL:sourceBundleID:]  
#9  0x308fef33 in -[UIApplication handleEvent:withNewEvent:]  
#10 0x308fad82 in -[UIApplication sendEvent:]  
#11 0x309013e1 in _UIApplicationHandleEvent  
#12 0x32046375 in PurpleEventCallback  
#13 0x30245560 in CFRunLoopRunSpecific  
#14 0x30244628 in CFRunLoopRunInMode  
#15 0x308f930d in -[UIApplication _run]  
#16 0x309021ee in UIApplicationMain  
#17 0x0000255c in main at main.m:14   

Приложение аварийно завершает работу при вызове mainNibFile. И я не знаю почему, но простое пересохранение MainWindow.xib решило проблему.

Дай мне знать, если тебе еще понадобится помощь.

Эти решения должны помочь вам.

person Parth Bhatt    schedule 01.04.2012
comment
Я разместил ссылки и скопировал принятые ответы из ссылок, просто чтобы убедиться, что мой ответ не станет бесполезным, если эти ссылки по какой-то причине отключатся. Я отдал должное оригинальным плакатам, добавив их названия жирным шрифтом. - person Parth Bhatt; 01.04.2012
comment
Парт, спасибо за внимание. Первая ссылка та же самая, которую я упомянул в своем вопросе. Последнее я тоже видел, но позже в комментариях тот комментатор отказался от своего утверждения, что оно работает. Несмотря на это, я пытался загрузить и сохранить, но не помогло. Можете ли вы заставить Xcode 4.3 запускать приложение на iOS3.0? - person windup; 02.04.2012
comment
@windup: В моем первом РЕШЕНИИ-1 вам нужно изменить Deployment с построителя интерфейса на iOS 3.2. Я думаю, это должно тебе помочь. - person Parth Bhatt; 02.04.2012
comment
Я уже пытался установить для разработки и развертывания значение 3.0. Я также попытался установить для iPad .xibs значение 3.2 как для разработки, так и для развертывания. Вы предлагаете установить для всех .xibs значение 3.2 для разработки и развертывания, хотя мой целевой SDK — 3.0? - person windup; 02.04.2012