dyld_fatal_error при загрузке Typhoon+Swift+iOS7.x+Plist

У меня очень неприятная проблема с Typhoon Framework версии 2.3.0 в проекте Swift.

Я включил Typhoon в Podfile, как указано в руководстве, установил Pods, создал соединительный заголовок и добавил #import <Typhoon/Typhoon.h> в этот заголовок.

Затем я создал подкласс сборки под названием ApplicationAssebly:

import Foundation

public class ApplicationAssembly: TyphoonAssembly {
    public dynamic func appDelegate() -> AnyObject {
        return TyphoonDefinition.withClass(AppDelegate.self) {
            (definition) in
            definition.injectProperty("myAssembly", with: self)
        }
    }
}

Как видите, я хочу внедрить эту сборку в AppDelegate. Я также добавил запись TyphoonInitialAssemblies в файл Info.plist. И в этот момент начались мои проблемы. Я протестировал несколько комбинаций, приводящих к NSException :

Не удается разрешить сборку для имени xxx

Вот эти комбинации (typhtest — название проекта/пакета):

  • ClassName в Info.plist: ApplicationAssembly, определяет свойство модуля в настройках сборки: Нет
  • ClassName в Info.plist: ApplicationAssembly, определяет свойство модуля в настройках сборки: Да
  • ClassName в Info.plist: typhtest.ApplicationAssembly, определяет свойство модуля в настройках сборки: Нет
  • ClassName в Info.plist: typhtest.ApplicationAssembly, определяет свойство модуля в настройках сборки: Да

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

  • ClassName в Info.plist: _TtC8typhtest19ApplicationAssembly, определяет свойство модуля в настройках сборки: Да

Эта комбинация не вызывает NSException, но у меня есть dyld_fatal_error, трассировка стека с iPhone 5s (iOS 7.1) ниже:

iPhone 5s — трассировка стека ошибок iOS 7.1

Я получаю немного другую трассировку стека от симулятора iPhone (iOS 7.1):

трассировка стека ошибок эмулятора iOS 7.1

Что странно, работает на симуляторе iOS 8.1! Также на моем устройстве хорошо работает пример приложения Typhoon для Swift.

Я также пытался очистить все кеши Xcode и проекта и каталоги DerivedData, я очистил папку проекта и сборки и перестроил проект, но он не работает. Моя версия Xcode — 6.1 (6A1052d), и я использую OSX Yosemite 10.10.1.

Репозиторий GitHub с моим кодом: https://github.com/papcio28/Typhoon-Dyld-Error

Отредактировано 21 ноября 2014 г.

Что еще странно, если я создаю фабрику вручную и что-то заливаю тоже вручную, то Тайфун работает. Шаги, которые я сделал:

  1. Удален TyphoonInitialAssemblies элемент из Info.plist
  2. Изменяет AppDelegate.application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool на

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let factory = TyphoonBlockComponentFactory(assemblies: [AppAssembly()])
        factory.inject(self)
        return true
    }
    

Но это не меняет того факта, что я хочу использовать Typhoon, не определяя фабрику вручную, так что вопрос по-прежнему актуален.


person Pawel Urban    schedule 20.11.2014    source источник
comment
Это полезно? stackoverflow.com/a/25404131/404201   -  person Jasper Blues    schedule 20.11.2014
comment
@JasperBlues Спасибо за совет, но это ничего не решило, но приятно знать, что мне нужно добавить эксклюзив в CocoaPods :) Я отправил свой код на GitHub (ссылка выше), так что каждый может скачать и проверить для себя, где возникает ошибка :) Протестируйте на эмуляторе iOS 7.1, и вы поймете мою проблему :)   -  person Pawel Urban    schedule 21.11.2014
comment
Возможно, вы могли бы отправить нам образец проекта с ошибкой? Извините за медленную поддержку, мы в отпуске.   -  person Jasper Blues    schedule 21.11.2014
comment
@JasperBlues В моем вопросе есть ссылка на образец проекта. Это: github.com/papcio28/Typhoon-Dyld-Error   -  person Pawel Urban    schedule 21.11.2014
comment
А, хорошо, заметил. Вернусь через несколько дней и дам подробный ответ.   -  person Jasper Blues    schedule 21.11.2014
comment
Хорошо, спасибо :) С нетерпением жду вашего ответа.   -  person Pawel Urban    schedule 21.11.2014


Ответы (1)


Эта проблема воспроизведена как ошибка и будет решена как можно скорее. Это также было воспроизведено в примере приложения Typhoon после pod update, в то время как чистая проверка работает нормально. Это предполагает, что где-то между 2.2.1 и 2.3.0 закралась ошибка регрессии, однако проверка этого дала некоторые странные результаты, так что на самом деле это может быть не так. Мы будем публиковать обновления/обнаружения в журнале проблем.

Временное решение:

А пока загрузите Typhoon, переопределив следующий метод в AppDelegate:

dynamic func initialFactory() -> TyphoonComponentFactory {

    return TyphoonBlockComponentFactory(assemblies:[
        ApplicationAssembly(),
        AnotherAssemblyIfRequired()])
}

Этот подход загружает Typhoon так же, как plist-интеграция, и, таким образом, обеспечивает интеграцию с UIStoryboard, UIStateRestoration и так далее. . это не было задокументировано до сих пор, так как мы думали, что стиля plist для просмотра Typhoon достаточно, и было бы просто запутанно предоставлять слишком много вариантов. Однако в этом случае он работает для iOS7.1+Swift+Storyboards, а plist — нет.

Пространство имен:

Что касается проблемы с пространством имен, нет необходимости изменять имя в файле plist, как вы это сделали — Typhoon обнаружит, доступны ли неявные пространства имен, и прозрачно обработает это. Но если в настоящее время это не работает в iOS7.x, вы можете добавить директиву в свою сборку следующим образом:

@objc(ApplicationAssembly)
public class ApplicationAssembly : TyphoonAssembly {
    //etc
}

Изменить: исправлено в Typhoon 2.3.1:

Начиная с Typhoon 2.3.1, начальную загрузку plist теперь можно использовать с Swift+iOS7.x.

person Jasper Blues    schedule 24.11.2014
comment
Хорошо, так что я жду исправления :) Спасибо за вашу помощь :) - person Pawel Urban; 24.11.2014
comment
@PawelUrban Я обновил ответ обходным путем. - person Jasper Blues; 24.11.2014
comment
Спасибо за этот обходной путь :) Он работает как шарм :) Я отмечаю ваш ответ как принятый! - person Pawel Urban; 24.11.2014
comment
Проблема с @PawelUrban была исправлена ​​в версии 2.3.1, которая доступна в основном репозитории CocoaPods. - person Jasper Blues; 27.11.2014
comment
Я проверил версию Typhoon 2.3.1, и все работает нормально. Начальная загрузка Plist работает хорошо, я могу использовать ApplicationAssembly вместо _TtC... и у меня нет dyld_fatal_error :) Спасибо, Джаспер, за помощь! :) - person Pawel Urban; 28.11.2014
comment
Пользователи Calabash: вашей цели Calabash потребуется эта @objc(ApplicationAssembly) строка для построения. - person Danyal Aytekin; 19.05.2015