【Xcode】Carthageを使ってライブラリを導入したプロジェクトのValidateに失敗しまくった話
追記があります。
どもも〜。
今回は、「よっしゃアプリもできたしアップロードするぞ〜〜〜」とワクテカしながら、アップロード前のValidateを実行すると、エラーの嵐で無事死亡したお話です。
XcodeでArchive後にValidateを実行するとエラーがズラーーーっと。
どれもCarthageを用いて導入したライブラリ達にエラーが出ています。(Carthage使ってないやつは出てないです)
エラーの内容は
iTunes Store operation failed.
Invalid Segment Alignment. The app binary at 'App名/Frameworks/Alamofire.framework' contains unsupported architectures '[x86_64,i386]'
ともう一つ
iTunes Store operation failed.
Invalid Segment Alignment. The app binary at 'App名/Frameworks/SwiftyJSON.framework/SwiftyJSON/' does not have proper segment alignment. Try rebuilding the app with the latest Xcode version.
この2つがCarthageを用いたライブラリそれぞれにエラーが出ています。
解決策
※正しい方法を追記しておきます!!!!
正しい解決策を@ikesyoさんに教えていただいたのでそちらを追記しておきます。本当にありがとうございます。
要点だけで、導入の詳細は省かせていただきます。
まずはCarthageでライブラリを導入時
carthage update
場合によっては
carthage update --platform iOS
で導入した後、Xcodeにて
Linked Frameworks and Libraries にFrameworkを追加
そしてBuild Phasesを開き、RunScriptを追加
この手順はCarthageで調べるといっぱい出てきます。私もその手順通りにやったはずでした・・・。
とりあえずこれを正しく行う、ということが解決策です。
正しい解決策を教えてもらう前の記事は以下になりますが、その下に私の失敗の原因を記したいと思います。
----------以下 正しい方法を教えてもらう前の記事 -------------
とりあえず解決策はこちら
xcodeライブラリファイル(.framework)から特定のアーキテクチャのみ抽出する方法 - Qiita
cocoapodsに嫌われているのかうまく使えずCarthageサクサクじゃん〜と思って使用していたのですが、最後の最後にこんな罠が仕掛けられているとは・・・・
わりとすぐにこちらの方法にたどり着いたんですが、lipoって使えないじゃんプンスコできないじゃん!と思っていたのですが使う場所が悪かっただけでした。アホだー。
プロジェクト同じ場所にCarthageフォルダがあると思いますが、それぞれのフレームワークがおいてあるフォルダまで先に移動しておきましょう。。
上記画像だと、Alamofire.framework内のAlamofireの内容を書き換えたい・・・
例えばデスクトップにフォルダがある場合は
cd ~/Desktop/'プロジェクトフォルダ名'/Carthage/Build/iOS
でフレームワークが置いてある場所まで移動した後に
## 1つずつ順に行う
## この時点では
## Architectures in the fat file: ./Alamofire.framework/Alamofire are: i386 x86_64 armv7 armv7s arm64 と言われる
## arm64とarmv7だけを抽出し、再生成
lipo -extract arm64 ./Alamofire.framework/Alamofire -o ./Alamofire.framework/Alamofire-arm64
$ lipo -extract armv7 ./Alamofire.framework/Alamofire -o ./Alamofire.framework/Alamofire-armv7
$ lipo -o ./Alamofire.framework/Alamofire-merged -create ./Alamofire.framework/Alamofire-armv7 ./Alamofire.framework/Alamofire-arm64
##抽出したものの情報を確認
lipo -info ./Alamofire.framework/Alamofire-merged
## Architectures in the fat file: ./Alamofire.framework/Alamofire-merged are: armv7 arm64 ## となっていればおk ##元のファイルから置き換える
rm -rf ./Alamofire.framework/Alamofire
mv ./Alamofire.framework/Alamofire-merged ./Alamofire.framework/Alamofire
rm -rf ./Alamofire.framework/Alamofire-*
これをエラーの出ているフレームワーク分行いました!
ターミナルが使えない人なだけだったの本当に悲しい・・・。
失敗談
これを解決するのに丸一日ぐらいかかったのですが、上手くいかなかったいくつか試した方法を紹介します・・・。
例えばAlamofire.frameworkでエラーが出ているとした場合、
フォルダ内を探索してみると、
どうやらこいつらが含まれているのがよろしくないんだなーというのがエラーでわかるんですが、
こいつらをそのままゴミ箱にぽい〜としてもダメでした。Validateすると変わらずエラーエラー。
色々調べてみると
このEmbedded Binaries部分にフレームワークが入っていると、Validateでエラーが出るよ!って言う記事がいくつか出てきたので、とりあえずLinked Frameworks and Librariesのみにフレームワークを追加して、いざArchive→Validate・・・・Success!
で確かにValidateは成功したんですよ。一回ちょっと浮かれましたよね。
とにかくこの検証を通過することばかりに頭がいってて、いざビルドしてみるとランチ画面で落ちるんですよね。
Dyld Error Message: Library not loaded: /Library/Frameworks/xxx Referenced from: /Users/USER/Desktop/アプリ名/Contents/ Reason: image not found
こーんな感じのエラーが出るんですね。
結局
Embedded Binariesにフレームワークを足してやるとこのエラーは解消されるんですが、こっちを直すとValidateが通らないとかいう、原因がそこじゃないのにそこだと信じて色々迷走するという本当にアホなことをしてました。
サーチパスを変えてみたり、Bitcode使用をNOにしてみたり・・・
とにかく色々してみたんですが、おそらく上記の解決策のみで全てが解決したんだろうと思います。
結構苦しめられましたが、それでもCarthageは便利だと思うので。。。
おそらく同様にこちらでも解決可能です〜同じことしてるだけなのかな・・・?(よくわからない
Stripping Unwanted Architectures From Dynamic Libraries In Xcode
------------------------------- ここまで -----------------------------
失敗した原因
上記に
「Embedded Binariesにフレームワークを足してやるとこのエラーは解消されるんですが、こっちを直すとValidateが通らないとかいう、原因がそこじゃないのにそこだと信じて色々迷走するという本当にアホなことをしてました。」
って書いているんですが、全然アホなことじゃなかったんですね。
原因はおそらくこちら。
https://twitter.com/ikesyo/status/857911786862923780
余計なやつがあったんだと思います。
状況としてはこんな感じ。
Run Scriptの後に 「Copy Files」もしくは「Embedded Frameworks」 といった形でファイルが追加されている。
多分こんな感じだったんだと思います。
Generalの「Embedded Binaries」の部分を一生懸命消していたんですが、もしかするとここに残っていてそれが上書きされていたのかな・・・と思います。
このBuild Phasesも上から実行されているそうで、下にEmbedded Frameworks等があった場合に上書きされていた、ということだと思います。
それかRun Scriptの部分に誤字があり、上手く機能していなかったか・・・。いっぱい確認したんだけどな・・・。
https://twitter.com/ikesyo/status/857915054724755457
https://twitter.com/ikesyo/status/857917640806875138
結果的に、私が行ったEmbeded Binariesを使い、lipoを行なって「x86_64,i386」を取り除くという解決方法は一応間違ってはいなかったようで。正しくもないんですが。
最終的にcopy-frameworksも使っていなかったので、Carthageを全く使う意味がないって感じになっていましたね・・・。
ちゃんと正しい方法ならば、Validate時にもビルド時にもエラーは出ませんでしたので、結論としてはCarthageのREAD MEをちゃんと読んで正しい使い方をしようということでした。
同様のエラーが出てここにたどり着いた方は
・「Embeded Binaries」に該当のFrameworkが入っていないこと
・Run Scriptが正しく記載されていること
・Run Scriptの後にFrameworkを上書きするような記述がされていないこと
を確認してみてください。
わりとEmbedded BinariesにFramework書かないと〜みたいな記事も多いので!おそらく情報が古いのかなーと思います。。。
わざわざ教えていただきありがとうございました。
それではでは
Additional Notes追記
Carthage(・∀・)イイヨイイヨー
コメントはありません。
現在コメントフォームは工事中です。