使用Typhoon + Swift + iOS7.x + Plist-bootstrapping的dyld_fatal_error

Paw*_*ban 5 xcode dyld ios typhoon swift

我在Swift项目中使用Typhoon Framework 2.3.0版本时遇到了非常烦人的问题.

我在Podfile中包含Typhoon,如教程中提到的,安装了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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我想将该程序集注入AppDelegate.我还在Info.plist文件中添加了TyphoonInitialAssemblies条目.在这一刻,我的问题已经开始.我测试了几个导致NSException的组合:

无法解析名称xxx的程序集

这种组合是(typhtest是项目/包名称):

  • Info.plist中的ClassName:ApplicationAssembly,在Build Settings中定义Module属性:No
  • Info.plist中的ClassName:ApplicationAssembly,在Build Settings中定义Module属性:Yes
  • Info.plist中的ClassName:typhtest.ApplicationAssembly,在Build Settings中定义Module属性:No
  • Info.plist中的ClassName:typhtest.ApplicationAssembly,在Build Settings中定义Module属性:Yes

我在StackOverflow上找到了这个答案,所以我尝试了最后一个组合:

  • Info.plist中的ClassName:_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模拟器!另外台风示例应用程序为斯威夫特的作品以及我的设备上.

我还试图清理任何Xcode和项目缓存和DerivedData目录,我已经清理了项目和构建文件夹并重建了项目,但它无法正常工作.我的Xcode版本是6.1(6A1052d),我正在使用OSX Yosemite 10.10.1.

我的代码使用GitHub存储库:https://github.com/papcio28/Typhoon-Dyld-Error

2014年11月21日编辑

同样奇怪的是,如果我手动创建工厂并手动注入某些东西,Typhoon也可以.我做的步骤是:

  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
    }
    
    Run Code Online (Sandbox Code Playgroud)

但它没有改变我想在没有手动定义工厂的情况下使用Typhoon这一事实,所以问题仍然存在.

Jas*_*ues 4

此问题已作为错误重现,并将尽快解决。之后,它也在 Typhoon 示例应用程序中重现,pod update同时干净的结帐工作正常。这表明回归错误已潜入 2.2.1 和 2.3.0 之间的某个地方,但是检查此结果会产生一些奇怪的结果,因此实际情况可能并非如此。我们会将更新/发现发布到问题日志中。

解决方法:

同时,请通过在 AppDelegate 中重写以下方法来引导 Typhoon:

dynamic func initialFactory() -> TyphoonComponentFactory {

    return TyphoonBlockComponentFactory(assemblies:[
        ApplicationAssembly(),
        AnotherAssemblyIfRequired()])
}
Run Code Online (Sandbox Code Playgroud)

这种方法就像 plist 集成一样引导 Typhoon,因此提供了 UIStoryboard 集成、UIStateRestoration 等。。直到现在它才被记录下来,因为我们认为凝视 Typhoon 的 plist 风格就足够了,提供太多选项只会让人困惑。然而,在这种情况下,它适用于 iOS7.1+Swift+Storyboards,而 plist 则不适用于。

命名空间:

至于命名空间问题,不必像您那样修改 plist 文件中的名称 - Typhoon 将检测隐式命名空间是否可用并透明地处理此问题。但是,如果这当前在 iOS7.x 中不起作用,您可以向程序集中添加一个指令,如下所示:

@objc(ApplicationAssembly)
public class ApplicationAssembly : TyphoonAssembly {
    //etc
}
Run Code Online (Sandbox Code Playgroud)

编辑:台风 2.3.1 中已修复:

从 Typhoon 2.3.1 开始,plist bootstrapping 现在可以与 Swift+iOS7.x 一起使用