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

Попытка создать и отладить универсальное приложение для 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. 

Ответы [ 3 ]

3 голосов
/ 09 апреля 2012

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

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

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

Сначала немного фона : Мое приложение изначально создавалось с Xcode 3.2.5 и отлично работало на iOS 3.0 и выше.Когда я обновил до Xcode 4.2, я получил ошибку NSKeyedUnarchiver, как только приложение загрузило файл XIB.После небольшого поиска в Google я наткнулся на другие статьи, упомянутые в этой теме, поэтому я изменил версии Deployment and Development для каждого файла 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 (из Products -> Edit Scheme).Это остановило приложение от зависания и выдало исключение, как я и ожидал (непонятный архив).Очевидно, что у LLDB все еще есть проблемы.

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

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

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

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

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

0 голосов
/ 01 апреля 2012

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

РЕШЕНИЕ-1:

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

Чтение * 1011Ответ * SK9 в приведенной выше ссылке:

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

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

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

enter image description here

SOLUTION-2:

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

Читать BadPirate ответ по вышеуказанной ссылке, а именно:

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

SOLUTION-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 решило проблему.

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

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

0 голосов
/ 01 апреля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...