🕊️

Xcode13、iOS15に対応する

Xcode13、iOS15に対応するためのポイントをまとめる。
Xcode13 beta、iOS15 beta環境はこちらからインストール
https://developer.apple.com/download/ (opens new window)

Carthageビルドに失敗する

Carthageを利用しており、以下のXcode12のWorkaroundスクリプトを導入している場合は、Xcode13対応版に修正する必要がある。

Xcode13対応版

set -euo pipefail
 
xcconfig=$(mktemp /tmp/static.xcconfig.XXXXXX)
trap 'rm -f "$xcconfig"' INT TERM HUP EXIT
 
# For Xcode 12 make sure EXCLUDED_ARCHS is set to arm architectures otherwise
# the build will fail on lipo due to duplicate architectures.
 
CURRENT_XCODE_VERSION="$(xcodebuild -version | grep "Xcode" | cut -d' ' -f2 | cut -d'.' -f1)00"
CURRENT_XCODE_BUILD=$(xcodebuild -version | grep "Build version" | cut -d' ' -f3)

echo "EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_${CURRENT_XCODE_VERSION}__BUILD_${CURRENT_XCODE_BUILD} = arm64 arm64e armv7 armv7s armv6 armv8" >> $xcconfig
 
echo 'EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_'${CURRENT_XCODE_VERSION}' = $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_$(XCODE_VERSION_MAJOR)__BUILD_$(XCODE_PRODUCT_BUILD_VERSION))' >> $xcconfig
echo 'EXCLUDED_ARCHS = $(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT)__XCODE_$(XCODE_VERSION_MAJOR))' >> $xcconfig

export XCODE_XCCONFIG_FILE="$xcconfig"
carthage "$@"

その他、利用しているOSSライブラリなどがXcode13に対応していない場合は適宜対応バージョンにアップデートする必要がある。

タブバーが透明になる、背景色が適用されない

iOS15ではUITabBarが透明になってしまうことがあるので、iOS15未満と同じ挙動にするにはiOS15+の scrollEdgeAppearance を指定する。

if #available(iOS 15.0, *) {
    let appearance = UITabBarAppearance()
    appearance.backgroundColor = .white
    UITabBar.appearance().scrollEdgeAppearance = appearance
}

ナビゲーションバー(ステータスバー)が透明になる、背景色が適用されない

以下のドキュメントにも記載のある通り、iOS15ではラージタイトルだけでなくすべてのナビゲーションバーに scrollEdgeAppearance が適用されるようになった。そのため、iOS15未満と同じ挙動にするには scrollEdgeAppearance を指定する。

When running on apps that use iOS 14 or earlier, this property applies to navigation bars with large titles. In iOS 15, this property applies to all navigation bars.

let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .white
UINavigationBar.appearance().scrollEdgeAppearance = appearance

テーブルビューのセクションヘッダに余分なpaddingがある

iOS15ではデフォルトでテーブルビューのセクションヘッダの上部に20px程度のpaddingがある。 iOS15未満と同じ外観にするには、sectionHeaderTopPadding を0に指定する。 (デフォルトではUITableViewAutomaticDimension (opens new window)を意味する値として-1.0が設定されている)

if #available(iOS 15.0, *) {
    tableView.sectionHeaderTopPadding = 0
}

テーブルビュー、コレクションビューのcell取得メソッドの挙動変更

iOS15未満では表示されていないセルは cellForRow(at:)cellForItem(at:)でnilが返されていた。 iOS15以降では表示されていないセルでもセルをViewが保持している場合はnilを返さない仕様に変更になった。

ドキュメントによると、セルが保持される状況は以下の通り。

  • プリフェッチ後のセル
  • 表示された後に、表示領域の近くにあるセル
  • ファーストレスポンダーを含むセル
  • フォーカスの当たっているセル

WidgetFamilyに.systemExtraLargeが追加された

iPadOSで新しいウィジェットサイズの .systemExtraLargeが追加されたため、WidgetFamilyでSwitch文を分岐させている場合は対応する。

extension WidgetFamily {
    var shortName: String {
        switch self {
        case .systemSmall: return "s"
        case .systemMedium: return "m"
        case .systemLarge: return "l"
        case .systemExtraLarge: return "el"
        @unknown default: fatalError()
        }
    }
}

SwiftUIでViewのsnapshotを取得する際に余分なpaddingが発生してしまう

iOS14以前ではこの記事を参考に正常にSwiftUIのViewのsnapshotが取得できていた。

以下のBlogを参照。 詳細な原因は不明、iOS15でSafe Areaの扱いが変わったかもしれないとのこと。

VNDetectFaceLandmarksRequestがシミュレーターで正しく機能しない

実機では正しく動作するがシミュレーターでは正しく顔のランドマークが取得できない。 今のところ回避方法は不明。

アカウント削除機能の提供

Appleのレビューガイドラインに「アカウント作成をサポートしているアプリはアプリ内でアカウント削除を提供しなけらばならない」という旨が追加されたため、アプリによっては対応する必要がある。

5.1.1 Data Collection and Storage - (v) Account Sign-In

If your app supports account creation, you must also offer account deletion within the app.

WKWebViewで自動でHTTPSプロトコルでアクセスされる

iOS15以降ではHTTPSをサポートしていることがわかっているサイトにおいて、自動でHTTPでなくHTTPSでサイトにアクセスされる。HTTPSをサポートしていないサイトではHTTPのままアクセスされる。ローカルでのデバッグ用途など、この挙動を無効化したい場合は upgradeKnownHostsToHTTPS をfalseにする。

let configuration = WKWebViewConfiguration()
configuration.upgradeKnownHostsToHTTPS = false
webView = WKWebView(frame: .zero, configuration: configuration)

iCloud Privacy Relay|プライベートリレー

有料のiCloud+の設定でクライアントのIPアドレスがAppleによって暗号化される機能。例えばサーバーサイドでアクセス元のIPレンジで何か判定処理をしている場合には、IPレンジがiCloud Private Relayのものになるので判定できなくなるため必要に応じて対応が必要。

ユーザーの設定によって、IPアドレスから得られる情報が変わる。

東京からアクセスした場合の例) ※取得したIPアドレスをmaxmind.com (opens new window)で確認

設定 アクセス元 ISP
無効 〇〇区 auやsoftbankなど
おおよその位置情報を保持(Maintain General Location) Tokyo iCloud Private Relay
国と時間帯を使用(Use Country and Time Zone) Japan iCloud Private Relay