【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を追加

 

Embedded Binariesには追加しないでください!

 

そしてBuild Phasesを開き、RunScriptを追加

 

この手順はCarthageで調べるといっぱい出てきます。私もその手順通りにやったはずでした・・・。

とりあえずこれを正しく行う、ということが解決策です。

 

正しい解決策を教えてもらう前の記事は以下になりますが、その下に私の失敗の原因を記したいと思います。

 

———-以下 正しい方法を教えてもらう前の記事 ————-

 

とりあえず解決策はこちら

xcodeライブラリファイル(.framework)から特定のアーキテクチャのみ抽出する方法 – Qiita

 

cocoapodsに嫌われているのかうまく使えずCarthageサクサクじゃん〜と思って使用していたのですが、最後の最後にこんな罠が仕掛けられているとは・・・・

 

わりとすぐにこちらの方法にたどり着いたんですが、lipoって使えないじゃんプンスコできないじゃん!と思っていたのですが使う場所が悪かっただけでした。アホだー。

プロジェクト同じ場所にCarthageフォルダがあると思いますが、それぞれのフレームワークがおいてあるフォルダまで先に移動しておきましょう。。

 

上記画像だと、Alamofire.framework内のAlamofireの内容を書き換えたい・・・

 

例えばデスクトップにフォルダがある場合は

cd ~/Desktop/'プロジェクトフォルダ名'/Carthage/Build/iOS

でフレームワークが置いてある場所まで移動した後に

## 1つずつ順に行う
lipo -info ./Alamofire.framework/Alamofire
## この時点では 
## 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が通らないとかいう、原因がそこじゃないのにそこだと信じて色々迷走するという本当にアホなことをしてました。」

って書いているんですが、全然アホなことじゃなかったんですね。

 

原因はおそらくこちら。

余計なやつがあったんだと思います。

状況としてはこんな感じ。

 

Run Scriptの後に 「Copy Files」もしくは「Embedded Frameworks」 といった形でファイルが追加されている。

多分こんな感じだったんだと思います。

 

Generalの「Embedded Binaries」の部分を一生懸命消していたんですが、もしかするとここに残っていてそれが上書きされていたのかな・・・と思います。

 

このBuild Phasesも上から実行されているそうで、下にEmbedded Frameworks等があった場合に上書きされていた、ということだと思います。

それかRun Scriptの部分に誤字があり、上手く機能していなかったか・・・。いっぱい確認したんだけどな・・・。

 

 

結果的に、私が行ったEmbeded Binariesを使い、lipoを行なって「x86_64,i386」を取り除くという解決方法は一応間違ってはいなかったようで。正しくもないんですが。

最終的にcopy-frameworksも使っていなかったので、Carthageを全く使う意味がないって感じになっていましたね・・・。

 

ちゃんと正しい方法ならば、Validate時にもビルド時にもエラーは出ませんでしたので、結論としてはCarthageのREAD MEをちゃんと読んで正しい使い方をしようということでした。

 

同様のエラーが出てここにたどり着いた方は

・「Embeded Binaries」に該当のFrameworkが入っていないこと

・Run Scriptが正しく記載されていること

・Run Scriptの後にFrameworkを上書きするような記述がされていないこと

を確認してみてください。

わりとEmbedded BinariesにFramework書かないと〜みたいな記事も多いので!おそらく情報が古いのかなーと思います。。。

 

 

わざわざ教えていただきありがとうございました。

 

それではでは

2018/04/14追記
Carthage(・∀・)イイヨイイヨー
iOS
コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

Related Memo...

記事を書くほどでもないけれどメモっておきたいこと

テスト投稿。

例えばiphone7 の画面サイズ

750 × 1334
半分375 × 667

iOS

UITableView.RowAnimation の .none はアニメーションするよ

UITableView.RowAnimation の .none はアニメーションがnoneなわけじゃなく、デフォルトの設定を使うよという意味らしい。

The inserted or deleted rows use the default animations.

なのでアニメーションしちゃう。今更の気づき。

 

iOS

UINavigationController + UIScrollView の組み合わせで使っている時に謎の余白ができる時

UINavigationController + UIScrollView の組み合わせで使っていて、UIScrollView 上に AutoLayout で上下左右0で View を設置しているのに、30px程度上にずれてしまうとき。

`navigationController.navigationBar.isTranslucent = false` にすると直るかもしれない。

ScrollView上のコンテンツとNavigationBarの重なっているところが透過していたら多分これで直せるはず。

通常のターゲットではちゃんと動いているのに、iOSSnapshotTestCase を用いたテストでだけこの対応が必要なのよくわからないけれど。。。

iOS
more