AppleはXcode 27.2 Beta 2のリリースノートで、iOS 27.1専用APIを使うMac Catalystビルドのコンパイル問題を既知問題として記載しています。該当するリリースノートに一致し、Catalystだけで識別子が見つからない場合は、プラットフォーム境界を確認して条件コンパイルで分離し、iOSとCatalystを個別に再ビルドしてください。
症状:iOSのビルドは通るのに、Mac Catalystでundeclared identifierやcannot findが出る。
最短対応:同じコミットで両ターゲットを比較し、該当APIの利用箇所を対象プラットフォームに合わせて分離します。
iOSとMac Catalystの共通コードを保守し、APIの対象プラットフォームとツールチェーンの問題を見分けたい開発者向けです。
Xcode CIのビルド担当者や、リモートMac上のジョブを管理するDevOps担当者も、再現確認と受け入れ条件の整理に使えます。
SECTION 01まずXcode 27.2のMac Catalystコンパイル失敗を既知問題と見分ける
Appleの記録が対象にしているのは、Xcode 27.2 Beta 2で、iOS 27.1専用APIを使うMac Catalystのコンパイル時に発生する問題です。すべてのCatalystエラーや、後続のXcodeバージョンにも当てはまるとは限りません。修正に入る前に、ログのエラーと使用APIがこの条件に一致するか確かめます。
| ログ・再現状況 | 優先して確認する点 | 判断の目安 |
|---|---|---|
Catalystだけでundeclared identifierやcannot findが出る |
エラー行の識別子とAPIの対応プラットフォーム | iOS 27.1専用APIに該当するなら、既知問題の説明と照合します。Xcode 27.2 Beta 2のリリースノート |
| iOSとCatalystの両方で失敗する | ソースの変更、依存パッケージ、共通のビルド設定 | プラットフォーム限定の問題と決めつけず、通常のコンパイルエラーとして追います |
| iOSは成功し、Catalystで別のエラーが出る | ターゲット別設定、SDK、依存関係の解決結果 | API境界だけでなく、ターゲットの設定差も比較します |
「iOS 27.1 APIが見つからない」という症状だけで、原因をXcodeやビルドノードに確定するのは避けてください。エラー位置が異なる、あるいは同じソースが両ターゲットで失敗するなら、依存パッケージの不足や設定差、ソース自体の誤りを先に調べます。
SECTION 02iOSでは通るのにMac Catalystだけ失敗するとき、何を比較する?
同じコミットを使ってiOSとMac Catalystを別々にビルドし、失敗がCatalystターゲットに限られるかを確認します。Mac CatalystはiPadアプリのMac版を構築する仕組みですが、iOS向けのAPIがすべて同じ条件で利用できると仮定してはいけません。Mac Catalystアプリの公式ガイドで対象プラットフォームの考え方を確認し、問題のAPIがどの環境向けかを切り分けます。
| 比較項目 | iOSターゲット | Mac Catalystターゲット |
|---|---|---|
| 同一コミットのビルド | 成功するか、同じエラーか | エラーの識別子・ファイル・行を記録 |
| APIの対象範囲 | APIがiOS向けかを確認 | Catalystで利用可能かを確認 |
| ビルド設定 | SDK、ターゲット設定、依存関係を記録 | iOS側との差分を調べる |
Xcodeの設定値を比較するときは、名前や値を推測せず、Build Settingsの公式リファレンスと実際のターゲット設定を照合してください。ターゲット名だけでなく、選択されたSDKと完全なエラーログを残せば、ソースの条件分岐が必要なのか、設定のずれなのかを判別しやすくなります。
第一段階:エラーとAPIの対応を確認する
エラーが示すシンボルを特定し、APIの宣言やドキュメントで対応プラットフォームを確認します。依存先のAPIなら、アプリのコードではなく、そのパッケージのバージョンと該当ソースも調査対象です。
第二段階:ビルド対象をそろえて再現する
同じブランチ、コミット、依存関係を使ってiOSとCatalystをビルドします。ローカルだけで設定を変えた状態や、異なるコミット同士の結果は比較材料にしないでください。
SECTION 03条件コンパイルはどの範囲に置く?
Mac Catalystの条件コンパイルは、APIの対象範囲に応じて、問題のシンボルを使うコードだけを分岐します。実行時のifでは、コンパイラが現在のターゲットにないAPIの参照を解決できない場合があるため、ビルド時にコードを選ぶ必要があります。
Swiftでは#if targetEnvironment(macCatalyst)、Objective-CではTARGET_OS_MACCATALYSTを使う方法が、Xcode 27.2 Beta 2のリリースノートに記載されています。条件コンパイルの構文と扱いは、Swiftの条件コンパイルに関する公式説明も参照してください。
修正範囲を広げすぎると、Catalystで必要な機能まで無効にしたり、iOS側で必要な処理を誤って除外したりします。反対に、問題のAPI呼び出しだけを条件から外して代替処理を用意しないままでは、コンパイルが通っても機能が欠けた状態になります。
- APIがiOSのみで必要:Catalystではその参照をコンパイル対象から外し、Catalyst側の代替動作を明示します。
- APIがCatalystのみで必要:Catalyst条件の分岐内に実装を置き、iOS側から参照されないことを確認します。
- 共通モジュールから利用する:呼び出し元と実装側の両方でターゲット境界を確認し、公開インターフェースが両ターゲットで整合するようにします。
第三段階:共有コードと依存パッケージを点検する
エラー箇所がアプリのターゲット、共有モジュール、または外部依存のどこにあるかを特定します。編集できない依存先が原因なら、対象バージョンと失敗ターゲットを記録し、更新、別パッケージへの置き換え、または修正までの一時保留を比較してください。
アプリ側で依存先のソース全体を排除すると、別ターゲットの機能や共通APIまで欠ける可能性があります。条件分岐を加えた後は、iOS側で該当機能が残っていることもテストで確認します。
SECTION 04仕上げに何をCIで再検証する?
修正後は、同一コミットを使ってiOSとMac Catalystのビルドをそれぞれ実行します。プロジェクトでテストやアーカイブを行う場合は、コンパイル成功だけで完了にせず、そのターゲットで必要なテストと成果物の生成も確認します。
| 確認内容 | iOS | Mac Catalyst |
|---|---|---|
| コンパイル | 対象SDKと結果を記録 | 対象SDKと結果を記録 |
| 条件分岐の機能 | iOS側の処理が残ることを確認 | Catalyst側の代替動作を確認 |
| テスト・成果物 | プロジェクトで必要な対象を実行 | 必要なテストやアーカイブを個別に確認 |
アーカイブや配布までをリリース経路に含める場合は、Appleの配布・リリース手順に沿って、ビルド後の工程も対象にします。登録済みデバイス向け配布を使う場合は、デバイス登録と配布の説明を参照してください。これらは配布手順の資料であり、コンパイルエラーの原因を特定する資料とは役割が異なります。
第四段階:CIログに再現条件を残す
ログにはXcodeのバージョン、SDK、ターゲットプラットフォーム、コミット、失敗箇所を記録します。ローカルの一度の成功だけで問題を閉じず、CIで使う実行環境でも同じビルド対象を再検証してください。後続のBeta、RC、正式版で既知問題の記載が変わった場合は、Appleのリリースノートとプロジェクトの結果を照合してから、一時的な条件分岐を残すか外すか判断します。
SECTION 05修正を閉じる前の判断条件
- Catalystだけで失敗し、APIがiOS専用と確認できた:条件コンパイルで該当箇所を分離し、iOSとCatalystを個別に再ビルドします。
- 両ターゲットで失敗する、またはAPIの対象が一致しない:プラットフォーム問題と決めつけず、依存関係、ターゲット設定、ソースを調査します。
- 依存パッケージ内で発生し、アプリから修正できない:バージョンと対象ターゲットを記録し、更新・置き換え・一時保留を選びます。
- 後続Xcodeで改善したように見える:公式リリースノートだけで修正済みと判断せず、同じコミットを使った両ターゲットの結果で確認します。
ローカルMacとCIノードで結果が食い違うなら、まずXcode、SDK、依存関係、ビルド設定の差分を記録してください。ビルド実行環境を増やすだけでは、APIのプラットフォーム境界は解消しません。物理デバイスやローカル接続が必須なら手元のMacを維持し、継続的な重負荷ジョブが中心なら専用環境との費用・運用負担を比較するのが妥当です。
再現用のMac環境を一時的に確保したい場合は、まずMACNOXのプランと料金で公開条件を確認し、必要な期間や運用方法に合うか判断してください。購入前の比較や実行環境の確保を進める際は、MACNOXの利用案内も参照できます。 Xcodeのバージョン差が原因かを確かめる用途では、実際のCI条件を再現してから利用期間を決めると、不要な長期契約を避けやすくなります。
最終更新:2026年10月9日。問題の記載と条件コンパイルはAppleのXcode 27.2リリースノート、プラットフォーム条件の確認はSwiftの公式資料に基づいています。