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
を指定する。
- developer.apple.com - scrollEdgeAppearance (opens new window)
- WWDC21 - What's new in UIKit (opens new window)
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を返さない仕様に変更になった。
- developer.apple.com - cellForRow(at:) (opens new window)
- developer.apple.com - cellForItem(at:) (opens new window)
ドキュメントによると、セルが保持される状況は以下の通り。
- プリフェッチ後のセル
- 表示された後に、表示領域の近くにあるセル
- ファーストレスポンダーを含むセル
- フォーカスの当たっているセル
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にする。
- developer.apple.com - upgradeKnownHostsToHTTP (opens new window)
- WWDC21 - Explore WKWebView additions (opens new window)
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 |