アイリッジ開発者ブログ

アイリッジに所属するエンジニアが技術情報を発信していきます。

【知らなきゃヤバい】Xcode16対応 - iOSアプリ開発

1. 概要

こんにちは、開発部第一グループ山崎です。

XcodeはiOSアプリ開発にほぼ必ず必要となる統合開発環境(IDE)です。2024年9月にXcode16がリリースされました。Xcode15以下で対応してきた今までのiOSアプリなどはXcode16に移行することが必要です。

  • ビジネス目線での必要性

例年通りであれば、2025年4月からはXcode15でビルドしたアプリはもはやApp Store Connectで申請できなくなると想定されます。プロジェクトの規模にもよりますが、対応に時間がかかるケースもありますので、早めに取り掛かることをオススメします。

  • 開発目線での必要性

新機能や改善により、Xcode 16はより効率的で使いやすくなっているため、たとえアプリを公開していない開発者の方も特別な事情がなければXcode15(未満)から16へと移行することを勧めます。

SDKサポート内容

Xcode16にはiOS 18、iPadOS 18、tvOS 18、watchOS 11、macOS Sequoia 15、visionOS 2のSDKが含まれています。いずれも各OSの最新版となり、やはりApple のプラットフォームで開発をしていく場合はXcode16は必須と言えるでしょう。

Xcode16 動作環境

Xcode16はMac OS Sonoma 14.5以降で動作します。

この記事の検証環境

Xcode16, iOS 18

2. 既存プロジェクトの対応方法

既存のプロジェクトをXcode 16に移行する際の注意点と必要な手順を解説します。

Xcode16.x をダウンロードし、プロジェクトのビルドを行う

Xcode16を含むAppleのソフトウェアのダウンロードは下記のページで行えます。Apple IDが必要なためご注意ください。Apple Developer Program(有料)の加入は必要なく、無料でダウンロードできます:

  1. App Storeでダウンロード
    • 無料でダウンロード可能です。最新版のXcodeがダウンロードされます。
    • 初心者の方、とりあえず試してみたい方はこちらでダウンロードするのを勧めます。
  2. Apple Developer 「Download All」のページ: https://developer.apple.com/download/all/
    • 無料でダウンロード可能です。ただしApple IDが必要です。
    • 最新版だけでなく、過去のバージョンのXcodeや、Xcode以外の細かなツールもダウンロードできます。
      • 複数のバージョンのXcodeを一台のパソコンに併存させたい場合に便利です。
    • 開発者の方はこちらをお勧めします。

エラー対応

Xcode16でビルドした際にエラーが発生した場合は、修正を行います。

筆者は3つほどのプロジェクトをXcode16対応してみましたが、以下のようなエラーが発生しました。

  1. @MainActorが追加されたApple公式APIをオーバーライドしていた場合

    Build SettingsからSwift Concurrency をYESにしなくても、Method does not override any method from its superclass というエラーが発生する場合があります。

    いくつかのAppleの提供するAPIのインターフェースに@MainActorが強制的に追加されています。

    こういったApple公式のAPI(メソッドなど)をプロジェクト側でオーバーライドしていると、@MainActor無しの古いインターフェースがすでに消されているため、エラーが出てしまうことがあります。

  2. Firebase/Flutterfire

    Flutter(iOSとAndroidアプリを両方生成できるフレームワーク)を利用している場合で、Firebase関連のライブラリ(Firebase/Flutterfire)を導入している場合、iOSアプリをビルドする際に以下のようなエラーが発生する場合があります。

    Include of non-modular header inside framework module 'firebase_auth.FLTAuthStateChannelStreamHandler': '/Users/xxxxxxx/ios/Pods/Headers/Public/Firebase/Firebase.h'

    対策としては、Runner.xcworkspaceをXcodeで開き、

    Build Settings より Allow Non-modular includes in Framework ModulesをYESにするとエラー文は出なくなります。

    参考: include of non-modular header inside framework module 'firebase_messaging.FLTFirebaseMessagingPlugin' #12962

  3. その他補足

    リリースノートを確認した限りでは、

    • UIKit
    • Foundation
    • SwiftUI

    …などよく使われるフレームワークにおいて、破壊的な変更は確認できませんでした。そのため、エラーはそれほど発生しないかもしれません。

    ただし、Swift6関連の破壊的変更が多くあり、リリースノートの3割程度がSwift6関連の変更の解説に費やされているほどです。Swift5から6へ切り替える設定を明示的にONにしない限りは何もエラーは発生しませんので、ここでは一旦スルーし、別の項目で解説します。

ライブラリ調査・更新

多くのプロジェクトではライブラリを利用しているかと思います。Xcode16対応に伴いライブラリ側でエラーが発生すれば、エラーを解消するためライブラリをXcode16対応版に更新する必要があります。

詳細な対策を示します:

  • ライブラリ側でXcode16対応がされていれば、そのバージョンを取り込み直す(一番簡単)
  • ライブラリ側でXcode16対応がされていない場合
    • ライブラリ側が対応してくれそうな時期やその見込み、そのライブラリの重要性、あなたのプロジェクトのリリース時期にライブラリ側が間に合うかなどを鑑み、ライブラリの対応を待つのか、あるいは諦めるのかを決める。
      • 該当ライブラリ側で近いうちに対応してくれそうであれば、待つ(簡単だが、待ち時間が必要)
      • 該当ライブラリ側で対応してくれるのを諦め、自分で対策する(多くの場合、工数がそれなりに、あるいは非常に嵩む)
        • 該当ライブラリのライセンスで許可されていれば、forkして自分で修正して用いてしまう。 ※ forkとはGitの操作の一つで、ここでは該当ライブラリをコピーして自分で自由に編集して使うことを指す。
        • 該当ライブラリ側へと修正を提案(プルリクエスト)する。
        • 代替ライブラリを探す。
        • もはやライブラリを使わず、0から自分で実装してしまう。

サードパーティSDK調査・更新

ライブラリと同様、他社が開発したSDKをプロジェクトに組み込んでいることもあるかと思います。もしXcode16でプロジェクトを起動し、サードパーティSDK由来のエラーが起きた場合は、ライブラリと同様基本的にはサードパーティSDK側の対応を待つことになります。

サードパーティSDKは多くの場合企業によって開発され、提供されています。その企業との契約内容やコミュニケーションチャネルを確認し、対応が必要なことを伝える必要があるでしょう。

何らかの事情で該当サードパーティSDKが対応してくれない場合は、早急に他のSDKやサービスに代替させることを検討すべきでしょう。多くの場合それなりに工数が嵩む作業となります。

非推奨のAPIなど

その他、エラーにはならないものの、もはや動作しないor非推奨となったAPIをプロジェクトで使っていれば、代替物に入れ替えることを推奨します。主だったものを以下に記載します(他にもあり、全ては載せきれないので詳細はリリースノートをご確認ください)

  • Interface Builder
    • @IBDesignable が非推奨となり、もはやXIBファイルのキャンバス上に描画されなくなりました。
      • @IBDesignable  は開発者側で、Interface Builderを使ってオリジナルのUI部品を作るときに使われることがあった要素。絶対に使われているとは限らないので、プロジェクトごとに検索をかけて、使われている場合は@IBDesignable  無しで作り直す、そもそもInterface BuilderはもうやめてSwift UIに移行するなどの対処を推奨。
  • Localization
    • genstrings コマンドラインツール(C, Objective-Cソースコードから文字列を探し出しLocalizable.stringsというファイルを生成するために使われていた機能)が非推奨になりました。
      • 代わりに、最新のString Catalogs機能で似た機能があるので、そちらに代替することを推奨。String Catalogs においては、プロジェクトをビルドするたびにソースコードが自動で解析され、文字列がLocalizableファイルに列挙されます。そのため、わざわざコマンドを叩く必要がなくなったということでしょう。

Privacy Reportの更新(App Storeで公開しているアプリの場合)

Privacy Report とはXcode15から追加されたPrivacy Manifest の関連機能で、あるXcode プロジェクト本体またはライブラリが収集しているセンシティブな情報の一覧及びその収集目的をpdfファイルのレポートとして出力する機能です。この情報を元に、App Store Connectに情報を入力し、アプリのPrivacy Nutrition Labelが完成します。

Xcode16対応でライブラリの更新を行った際は、こちらも更新しないといけない場合があります。ライブラリを更新したら、以下を行いましょう:

  • XcodeでProduct > ArchiveよりプロジェクトのArchiveを作成
  • Xcode OrganizerよりArchiveを左クリックし、Generate Privacy Report を選択
  • 生成されたPrivacy Reportを元に、App Store Connect でプライバシー情報を更新(以前入力したものと何も情報が変わっていなさそうな場合は不要)

3. Swift 6の対応方針

SwiftはiOSアプリの開発言語です。Xcode16にはSwift6が同梱されており、従来のSwift5ではなくSwift6を使うことも可能です。

Swift6にはSwift Concurrency, Typed Throw など多くの変更があり、簡単に対応するのは難しいです。会社でiOSアプリ開発を行っている場合は、チーム単位で対応方針を明確にし、徐々にSwift5からSwift6に移行していくべきでしょう。

一方で、Xcode16対応の際に絶対にSwift6にしなければいけないわけでもなく、Swift5を使い続けることも可能です。

Swift6対応 おすすめの戦略:

  1. ひとまずSwift5のままでXcode16対応を行う
  2. 一通りXcode16対応が終わって落ち着いたら、徐々にSwift6の設定をONにしていき、エラーを解消していく
  3. 一通りエラーがなくなった段階で、Swift6に完全移行する

Xcode16対応とSwift6対応を分けている理由としては、両者を一気に行うと、なぜエラーが生じているのかの理由の切り分けがやりにくくなり、進めづらくなると想定されるためです。

4. Xcode 16 新規追加機能・機能改善

上記ではXcode16へと移行するにあたりやらなければいけないことを解説しましたが、以下ではXcode16で新規追加・改善される機能をご紹介します。新規機能を積極的に使い、キャッチアップしていきましょう。

予測コード補完の強化

Apple シリコン搭載のMac限定となりますが、より高度な予測コード補完がサポートされました。SwiftとApple SDKに特化して訓練された機械学習モデルを使用しているとのことです。どういったコードを書いていいかわからない時に役立つもので、特に初心者の方には有用性が高いでしょう。

ビルドシステムの改善

ClangとSwiftコンパイラと連携して、プロジェクトソースのモジュール依存関係を明示的なタスクとして処理するようになりました。ビルドしている最中に、今どのモジュールがどう処理されているのか、より明示的に表示されるようになっているため、バグの解決時に役立ちます。

Swift 6対応の強化

Swift 6言語モードでのビルドが可能になりました。また、いきなりSwift6に移行するのが難しい場合は、新しいビルド設定により、Swift 6の機能を個別に採用できるようになりました。

Swift6対応は時間がかかるという負の面ばかり申し上げてきましたが、Swift6のSwift Concurrency機能はデータ競合を防ぐために強力な機能であって、堅牢なプロジェクトを作り上げるのに役に立ちます。

ローカライゼーションの改善

従来、SwiftUI時代のローカライゼーションツールとしてString Catalog が導入されていましたが、いくつかの機能が強化されました。

String Catalogフィルターバーが強化され、より複雑な検索基準をサポートするようになりました。Begins with, Does not contain といった検索条件が利用可能です。

String Catalogエディタで、さまざまな問題に対するインラインの警告とエラーが表示されるようになりました。

テスト機能の強化

Swift Testingという新しいテストフレームワークが導入されました。

テストプランエディタでSwift Testingのテストやスイートをタグで含めたり除外したりできるようになりました。

また、Xcodeからテストを実行するとコードカバレッジがXcode上に自動で表示されます。

5. 参照

Apple Developer Documentation - Xcode 16 Release Notes

Apple Developer Documentation - Privacy manifest files

Apple Developer Documentation - Localizing and varying text with a string catalog

Apple Developer Documentation - Swift Testing

Github - Firebase/Flutterfire - include of non-modular header inside framework module 'firebase_messaging.FLTFirebaseMessagingPlugin' #12962