過去数日間、これで頭を壁にぶつけていましたが、Google/SO/Githubで複数回検索しても、問題の解決策が見つかりません!
私がやろうとしているのは、Firebaseポッドを使用するアプリのユニットテストを作成することだけです。
Xcode 7.3.1とCocoapods 1.0.1を使用しています。 更新: Xcode 8.0で問題が残る
このポッドファイルでは:
platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!
target 'MyApp' do
pod 'Firebase'
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'
target 'MyAppTests' do
inherit! :search_paths
end
end
私のXCTestクラスでは
必須モジュール「Firebase」がありません
@testable import MyApp
のエラー
または、このポッドファイルを使用して:
platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!
def common_pods
pod 'SwiftyTimer'
pod 'Firebase'
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'
end
target 'MyApp' do
common_pods
end
target 'MyAppTests' do
common_pods
end
テストはビルドされますが、コンソールに次のような警告が散らばっています:
クラス<-FirebaseClassName->は... MyApp ...と... MyAppTests ...の両方で実装されます。2つのうちの1つが使用されます。未定義のもの
私にとっての解決策は、cocoapodsをバージョン1.1.0.rc.2に更新することでした。
Sudo gem install cocoapods --pre
同じ問題がありました。 pod 'Firebase'
をテストターゲットに移動して解決しました。 Podfileを次のように変更します。
platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!
target 'MyApp' do
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'
target 'MyAppTests' do
inherit! :search_paths
pod 'Firebase'
end
end
次のように、継承を:complete
に変更してみてください。
target 'MyAppTests' do
inherit! :complete
end
重要なことは、あなたのレポジトリをチェックアウトしている誰かが、pod update
ファイルや他のハッカーをコピーするだけで通常通り.xcconfig
を実行できるようにすることです。
問題は、CocoaPodsが設定に対して独自の値を生成した後、Firebaseがヘッダー検索パスで特別な処理を行うため、CocoaPodsがテストターゲットに引き継ぐためにこの変更を認識しないことです。次の2つの方法のいずれかを解決できます。
ファイルナビゲータでMyAppTests.<configuration>.xcconfig
を見つけて、次をHEADER_SEARCH_PATHS
に追加します。
${PODS_ROOT}/Firebase/Analytics/Sources
[*]
Build SettingsでHeader Search Pathsの設定を見つけて、オプション1と同じ値をリストに追加します。再帰的に設定する必要はありません。
* AKMのコメントによると、これはバージョン3.14.0で${PODS_ROOT}/Firebase/Core/Sources
に変更されました
この問題は、firebaseプロジェクトの次の場所に記録されています。
https://github.com/firebase/firebase-ios-sdk/issues/58
回避策があります:
「$ {PODS_ROOT}/Firebase/Core/Sources」を、ビルド設定->ヘッダー検索パスのみでテストターゲットに追加します
しかし、これはCocoaPods 1.4.0以降にアップグレードすることで修正されます。これはより良いソリューションです。
これを書いている時点(2017年11月)cocoapods 1.4.0はまだベータ版であるため、それをインストールするには、ベータ版を明示的に要求する必要があります。
gem install cocoapods --pre
これとpod install
を実行することで、テストの実行に関する問題が解決しました。
これを機能させるための3つのステップ:
CocoaPods:1.5.0 Swift 4 Firebase:4.13.0
ステップ1:ポッドファイルに次のターゲットブロックを追加してください。
# Uncomment the next line to define a global platform for your project
platform :ios, '11.3'
target 'TIMII' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Pods for TIMII
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'Firebase/Storage'
target 'TIMIITests' do
inherit! :search_paths
pod 'Firebase/Core'
end
end
ステップ2:YourAppTests Project Navigatorの[ビルド設定]タブ内。ヘッダー検索パス行を見つけて、次の行をデバッグに追加します
$(継承)$ {PODS_ROOT}/Firebase/Core/Sources
ステップ3:ターミナルでの実行:
ポッド更新
上記のすべてを試してみましたが、最初はMissing required module 'Firebase'
で始まり、テストターゲットにFirebase Podを追加しようとすると"Class ... is implemented in both ... "
またはリンカーの問題が発生し、さまざまなエラーに遭遇しました。
私のために働いた解決策は次のとおりでした:
$(inherited) non-recursive
$(SRCROOT)/Pods/Headers/Public recursive
$(SRCROOT)/Pods/Firebase recursive
この時点で、ビルドフォルダーをクリーンアップし、再ビルドしてからテストを再実行するとうまくいきました。これが誰かを助けることを願っています!
同様の問題がありました。あなたの質問に関して、私はMyApp.<configuration>.xcconfig
ファイルの内容をMyAppTests.<configuration>.xcconfig
ファイルにコピーしました。私はテストをきれいにしてビルドしましたが、うまくいきました。
"$ {PODS_ROOT}/Firebase/Core/Sources"をBuild Settings-> Header Search Pathsの下のTestsターゲットにのみ追加します
@ Will は、CocoaPodsのインストール後のHeader Search Pathsに関する問題について言及しました。
私は、ポッド「Firebase」が個別のモジュールに埋め込まれている複数のターゲットを持つプロジェクトを持っています、MyProject-Shared
と言います。 「MyProject-Shared」ターゲットにのみインストールされた「Podfile」のFirebaseポッド。 「MyProject-Shared」を使用する他のモジュールは、エラーのためコンパイルできません。
'必須モジュール「Firebase」が見つかりません'
私の場合のトリックは、eachターゲットのBuild SettingsAnalytics-Frameworkを参照:
"${PODS_ROOT}/Firebase/CoreOnly/Sources"
それがあなたの時間を節約することを願っています。