Просто подумал, что поделюсь своим решением этой непонятной ошибки 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