# Xcode13、iOS15に対応する
Xcode13、iOS15に対応するためのポイントをまとめる。
Xcode13 beta、iOS15 beta環境はこちらからインストール
https://developer.apple.com/download/
# Carthageビルドに失敗する
Carthageを利用しており、以下のXcode12のWorkaroundスクリプトを導入している場合は、Xcode13対応版に修正する必要がある。
https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md
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 "$@"
参考にしたissue: Xcode 13 Workaround #3201
その他、利用しているOSSライブラリなどがXcode13に対応していない場合は適宜対応バージョンにアップデートする必要がある。
# タブバーが透明になる、背景色が適用されない
iOS15ではUITabBarが透明になってしまうことがあるので、iOS15未満と同じ挙動にするにはiOS15+の scrollEdgeAppearance
を指定する。
ドキュメント: https://developer.apple.com/documentation/uikit/uitabbar/3750912-scrolledgeappearance WWDC21セッション動画: https://developer.apple.com/videos/play/wwdc2021/10059/
if #available(iOS 15.0, *) {
let appearance = UITabBarAppearance()
appearance.backgroundColor = .white
UITabBar.appearance().scrollEdgeAppearance = appearance
}
# ナビゲーションバー(ステータスバー)が透明になる、背景色が適用されない
以下のドキュメントにも記載のある通り、iOS15ではラージタイトルだけでなくすべてのナビゲーションバーに scrollEdgeAppearance
が適用されるようになった。そのため、iOS15未満と同じ挙動にするには scrollEdgeAppearance
を指定する。
ドキュメント: https://developer.apple.com/documentation/uikit/uinavigationbar/3198027-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 を意味する値として-1.0が設定されている)
ドキュメント: https://developer.apple.com/documentation/uikit/uitableview/3750914-sectionheadertoppadding
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = 0
}
# テーブルビュー、コレクションビューのcell取得メソッドの挙動変更
iOS15未満では表示されていないセルは cellForRow(at:)
や cellForItem(at:)
でnilが返されていた。
iOS15以降では表示されていないセルでもセルをViewが保持している場合はnilを返さない仕様に変更になった。
ドキュメント(UITableView):
https://developer.apple.com/documentation/uikit/uitableview/1614983-cellforrow
ドキュメント(UICollectionView): https://developer.apple.com/documentation/uikit/uicollectionview/1618088-cellforitem
ドキュメントによると、セルが保持される状況は以下の通り。
- プリフェッチ後のセル
- 表示された後に、表示領域の近くにあるセル
- ファーストレスポンダーを含むセル
- フォーカスの当たっているセル
# WidgetFamilyに.systemExtraLargeが追加された
iPadOSで新しいウィジェットサイズの .systemExtraLarge
が追加されたため、WidgetFamilyでSwitch文を分岐させている場合は対応する。
ドキュメント: https://developer.apple.com/documentation/widgetkit/widgetfamily/systemextralarge
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()
}
}
}
# アカウント削除機能の提供
Appleのレビューガイドラインに「アカウント作成をサポートしているアプリはアプリ内でアカウント削除を提供しなけらばならない」という旨が追加されたため、アプリによっては対応する必要がある。
レビューガイドライン: https://developer.apple.com/app-store/review/guidelines/
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にする。
ドキュメント: https://developer.apple.com/documentation/webkit/wkwebviewconfiguration/3752243-upgradeknownhoststohttps WWDCセッション動画: https://developer.apple.com/videos/play/wwdc2021/10032/
let configuration = WKWebViewConfiguration()
configuration.upgradeKnownHostsToHTTPS = false
webView = WKWebView(frame: .zero, configuration: configuration)