iPhoneアプリを開発していると、必ず一度は遭遇するXcodeのビルドエラー。
ビルドエラー対応についてまとめておく。
CocoaPodsとは何か?
CocoaPodsは、iOSのアプリ開発で、外部ライブラリやフレームワークの依存関係を管理するツール。
CococaPodsはRubyで開発されているため、gemを使って、CocoaPodsをインストールする
sudo gem install cocoapods
Podfileの作成:
Xcodeプロジェクトのルートディレクトリでpod init
コマンドを実行してPodfileを作成する。
Podfileに使用したいライブラリを追加
作成されたPodfileをテキストエディタで開き、必要なライブラリを指定する。例えば、pod 'AFNetworking'
のように記述する。
Podのインストール:
Podfileに使用したいライブラリ(依存関係)を追加した後、pod install
コマンドを実行してライブラリをインストールする。
プロジェクトの開き方の変更:
pod install
を実行した後、Xcodeプロジェクトファイル(.xcodeproj)ではなく、作成されたワークスペースファイル(.xcworkspace)を使ってXcodeプロジェクトを開く。
Flutterの場合
FlutterプロジェクトでiOSプラットフォームをターゲットにする場合は、内部的にCocoaPodsを使用しているため、Flutterコマンドを実行することで必要なセットアップが自動的に行われる。→CocoaPodsの代わりにFlutterのパッケージ管理システムを使用する。
pubspec.yamlの編集:
Flutterプロジェクトのpubspec.yaml
ファイルにライブラリのバージョン(依存関係)を追加する。
依存関係の取得
コマンドラインでflutter pub get
を実行し、指定した依存関係をプロジェクトに追加する。
FlutterでPod関連のエラーが出る場合には、flutter clean→flutter pub get→ビルドを実行する。
ちなみに、Flutterを使っていてAndroidシミュレーターでbuildできない時は、flutter doctorを実行。flutterの見ているjavaのパスが間違っている可能性があるので修正する。下記記事参照
https://qiita.com/y-matsumoto/items/74467e528c7b2c745b87
Podコマンド
Podコマンドとは
pod
コマンドは、CocoaPodsのコマンドラインインターフェースに対してのコマンド。
pod
コマンドを実行すると、CocoaPodsが提供するさまざまな機能を使用できる。podコマンドは Podfile
を参照して動作するので Podfile
が存在するディレクトリで実行する。
PodfileとPodfile.lock
Podfile
- プロジェクトに追加したいライブラリのリストを定義するファイル
Podfile.lock
- 実際にインストールされたライブラリの具体的なバージョンを記録
- このファイルにより、開発チーム内で同じライブラリのバージョンが使用されることが保証される
pod install
- 既存の
Podfile.lock
の内容に従って依存関係をインストールするためのものであり、Podfile.lock
を更新することはない。 - Podfile.lockが存在しない場合は生成する
- プロジェクトに初めてCocoaPodsを導入する時や、新しいライブラリを追加したい場合に使用する。
pod update
- Podfile.lockを参照せずに、
Podfile
に記載された依存関係を最新バージョンに更新し、その結果をPodfile.lock
に反映する。 pod update
はPodfile.lock
ファイルを更新するために使用される。
pod repo update
- CocoaPodsのリポジトリ(ライブラリの一覧や情報が格納されている場所)を更新する。
- 新しいライブラリや最新のバージョンが
pod install
やpod update
で認識されない場合に使用する。
Xcodeビルドエラー
CocoaPods’s specs repository is too out-of-date
Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
pod repo update
CocoaPodsの仕様リポジトリが古くて依存関係を満たせないときに発生する。
cd ios //iosディレクトリに移動(Podfileが含まれている)
pod repo update //CocoaPodsの仕様リポジトリを最新の状態に更新する
pod install //Podfile.lockに記録されているバージョンに基づいて依存関係がインストール
open ios/Runner.xcworkspace
Try launching Xcode and selecting "Product > Run" to fix the problem:
open ios/Runner.xcworkspace
まず、Xcodeを開いて、Xcodeのメニューバーから “Product > Run” を選択してアプリをビルドし実行する。
もし、これでRunできた場合は、FlutterのビルドシステムとXcode間の設定や依存関係に不一致が存在する可能性がある。
Flutterプロジェクトで問題が発生した場合、より詳細な情報を得るために -v
または --verbose
オプションを付けて flutter run
コマンドを実行する
flutter run -v
すると、例えば、先ほどのメッセージの詳細エラーが下記のように出てくる。
Unable to locate DeviceSupport directory with suffix 'DeveloperDiskImage.dmg'. This probably means you don't have Xcode installed, you will need to launch the app manually and logging output will not be shown!
ちなみに、これは、実機のiosバージョン(今回だとiOS17.1)に対応するDeveloperDiskImage.dmg がDeviceSupportフォルダ内に入っていないよというエラー
DeveloperDiskImage.dmg
- iOSデバイス(iPhoneやiPadなど)上でアプリケーションをビルドし、デバッグするために必要なシステムファイルやライブラリが含まれている。
- Xcodeの一部として提供される。Xcodeをインストールすると、そのバージョンのXcodeがサポートしているiOSデバイスのDeveloperDiskImage.dmgもダウンロードされる。
DeviceSupportディレクトリを下記コマンドで開いて確認する。
open /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
この場合の大抵の原因はXcodeのバージョンが古すぎて、最新の実機iOSビルドに必要なサポートファイルが含まれていないということなので、Xcodeを最新版にアップデートする。
ちなみに、Xcode-betaというバージョンもあるが、これはios-betaに対応しているので、iosでbetaを使用していなければXcode-betaの最新版にまでアップデートする必要はない。
コメント