対象になりそうなプロジェクトの条件
- iOS 10以下のサポートを切るために
Deployment Targetを11.0にしようとしている - Projectのみで
Deployment Targetを指定し、各Targetでは参照(未指定)にしている - OSSをCarthageで利用している
-
Embedded Frameworkをプロジェクト内で自作して利用している。 - OSSのframeworkもembedded frameworkもFrameworkフォルダに書き出している。
- Build PhasesのRun Script
*1にてlipoコマンドを利用しFrameworkフォルダ内のframeworkをすべてSlicingをしている(-extractなどを利用)
Archive Buildできなくなった原因
- arm64アーキテクチャのみでbuildされたembedded frameworkをslicingしようとしたから。
Deployment TargetのversionがbuildされるBinaryのarchitectureに影響する
Release build時のDeployment Targetが11.0以上の場合はarm64のnon fat fileとしてbuildされる。(10.x以下だとarmv7,arm64のfat file)
そのため、embedded frameworkもarm64のnon fat fileでbuildされ、*1のslicingのscriptでerrorとなる。(スクリプトの書き方にもよる)
(注)10.x以下の説明はdefaultのarchitectureとvalid architecturesの場合です。10.x以下でも設定次第でarm64のみのbuild可。
通常のアプリの最低動作保証バージョン変更方法
- Project(もしくはTarget)のDeployment targetを最低動作保証バージョンに設定する
iOS10.x以下からiOS11.xにする場合の変更方法
- 対応方法
- ProjectのDeployment targetを最低動作保証バージョンに設定する
- アプリのTargetのDeployment targetを最低動作保証バージョンに設定する
- 自作Embedded frameworkのtargetは11.0未満にする(指定されていなければtargetに設定しfat fileにする)
その他、Deployment targetを11以上に設定してビルドエラーのとき確認したいこと
- 32bitのArchitecture(
armv7,armv7s...)をProjectorTarget->ArchitectureとValid Architecturesに同時に設定していないか。(Architectureが${ARCHS_STANDARD}の場合確認不要) - Carthageでbuildされたbinaryを取得し、そのまま利用していないか。
- Embedded Frameworkのdeployment targetがarchitectureにbuild時の影響しないか
現時点で不要だった対応(2019/04/17)
- info.plistの
Required Device Capabilityをarmv7からarm64への変更