5

我在 Swift 项目中遇到了 Typhoon Framework 2.3.0 版的非常烦人的问题。

我在教程中提到的 Podfile 中包含了 Typhoon,安装了 Pod,创建了桥接头并添加#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。我还在 Info.plist 文件中添加了 TyphoonInitialAssemblies 条目。在这一刻,我的问题开始了。我测试了一些导致 NSException 的组合:

无法解析名称 xxx 的程序集

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

  • Info.plist 中的类名:ApplicationAssembly,在构建设置中定义模块属性:
  • Info.plist 中的类名:ApplicationAssembly,在构建设置中定义模块属性:
  • Info.plist 中的类名:typhtest.ApplicationAssembly,在构建设置中定义模块属性:
  • Info.plist 中的类名:typhtest.ApplicationAssembly,在构建设置中定义模块属性:

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

  • 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 Sample Application for Swift也适用于我的设备。

我还尝试清理任何 Xcode 和项目缓存以及 DerivedData 目录,我已经清理了项目和构建文件夹并重建了项目,但它不起作用。我的 Xcode 版本是 6.1 (6A1052d),我正在使用 OSX Yosemite 10.10.1 。

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

21.11.2014 已编辑

同样奇怪的是,如果我手动创建工厂并手动注入一些东西,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
    }
    

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

4

1 回答 1

4

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

解决方法:

同时,请通过在您的 AppDelegate 中覆盖以下方法来引导 Typhoon:

dynamic func initialFactory() -> TyphoonComponentFactory {

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

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

命名空间:

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

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

编辑:在台风 2.3.1 中修复:

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

于 2014-11-24T09:38:05.777 回答