React-native Xcode

xcodeでbuid faildが止まらない!

【Xcode】CococaPods・Podコマンド・buid faild対応

iPhoneアプリを開発していると、必ず一度は遭遇するXcodeのビルドエラー。

ビルドエラー対応についてまとめておきます。

出典:【iOS開発】 CocoaPodsとは何なのか〜導入〜使い方まで徹底解説

目次

  1. CocoaPodsとは何か?
    1. Podfileの作成:
    2. Podfileに使用したいライブラリを追加
    3. Podのインストール:
    4. プロジェクトの開き方の変更:
  2. Flutterの場合
    1. pubspec.yamlの編集:
    2. 依存関係の取得
  3. Podコマンド
    1. Podコマンドとは
    2. PodfileとPodfile.lock
    3. pod install
    4. pod update
    5. pod repo update
  4. Xcodeビルドエラー
    1. CocoaPods’s specs repository is too out-of-date
    2. open ios/Runner.xcworkspace

react-nativeでIOS開発しているときに頻繁に出てくるCocoaPodsとは何か?

CocoaPodsは、iOSのアプリ開発で、外部ライブラリやフレームワークの依存関係を管理するツール。

CococaPodsはRubyで開発されているため、gemを使って、CocoaPodsをインストールする

Zsh

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のパスが間違っている可能性があるので修正する。下記記事参照

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 installpod updateで認識されない場合に使用する。

Xcodeビルドエラー

CocoaPods’s specs repository is too out-of-date

Zsh

Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
  pod repo update

CocoaPodsの仕様リポジトリが古くて依存関係を満たせないときに発生する。

Zsh

cd ios //iosディレクトリに移動(Podfileが含まれている)
pod repo update //CocoaPodsの仕様リポジトリを最新の状態に更新する
pod install //Podfile.lockに記録されているバージョンに基づいて依存関係がインストール

open ios/Runner.xcworkspace

Zsh

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 コマンドを実行する

Zsh

flutter run -v

すると、例えば、先ほどのメッセージの詳細エラーが下記のように出てくる。

Zsh

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ディレクトリを下記コマンドで開いて確認する。

Zsh

open /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/

この場合の大抵の原因はXcodeのバージョンが古すぎて、最新の実機iOSビルドに必要なサポートファイルが含まれていないということなので、Xcodeを最新版にアップデートする。

ちなみに、Xcode-betaというバージョンもあるが、これはios-betaに対応しているので、iosでbetaを使用していなければXcode-betaの最新版にまでアップデートする必要はない。

-React-native, Xcode