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 のアセンブリを解決できません

この組み合わせは次のとおりです ( typtestはプロジェクト/バンドル名です):

  • Info.plist の ClassName: ApplicationAssembly、Build Settings の Module プロパティを定義します:いいえ
  • Info.plist の ClassName: ApplicationAssembly、Build Settings の Module プロパティを定義:はい
  • Info.plist の ClassName: typhtest.ApplicationAssembly、Build Settings の Module プロパティを定義:いいえ
  • Info.plist の ClassName: typhtest.ApplicationAssembly、Build Settings の Module プロパティを定義:はい

StackOverflow でこの回答を見つけたので、最後の組み合わせを試しました。

  • Info.plist の ClassName: _TtC8typhtest19ApplicationAssembly、Build Settings の Module プロパティを定義:はい

この組み合わせは NSException をスローしませんが、以下の iPhone 5s (iOS 7.1) からのスタック トレースであるdyld_fatal_errorがあります。

iPhone 5s - iOS 7.1 エラー スタック トレース

iPhone シミュレーター (iOS 7.1) とはわずかに異なるスタック トレースを取得します。

iOS 7.1 エミュレータ エラー スタック トレース

iOS 8.1 シミュレーターで動作するのは奇妙なことです。また、Swift 用の Typhoon Sample Application は、私のデバイスでうまく動作します。

また、Xcode とプロジェクトのキャッシュと DerivedData ディレクトリをすべて消去しようとしました。プロジェクトとビルド フォルダーを消去し、プロジェクトを再構築しましたが、機能しません。Xcode のバージョンは 6.1 (6A1052d) で、OSX Yosemite 10.10.1 を使用しています。

私のコードを含む GitHub リポジトリ: https://github.com/papcio28/Typhoon-Dyld-Error

2014 年 11 月 21 日編集

また奇妙なのは、ファクトリを手動で作成し、何かを手動で注入すると、Typhoon が機能することです。私が行った手順は次のとおりです。

  1. TyphoonInitialAssembliesInfo.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