shtnkgm
About
Blog
About
Blog
  • Xcode13、iOS15に対応する

🕊️

Xcode13、iOS15に対応する

@shtnkgm・2021/8/18

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

Carthageビルドに失敗する

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

  • Carthage/Carthage - Xcode12Workaround

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 "$@"
  • Carthage/Carthage - Xcode 13 Workaround #3201

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

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

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

  • developer.apple.com - scrollEdgeAppearance
  • WWDC21 - What's new in UIKit
if #available(iOS 15.0, *) {
    let appearance = UITabBarAppearance()
    appearance.backgroundColor = .white
    UITabBar.appearance().scrollEdgeAppearance = appearance
}

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

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

  • developer.apple.com - 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が設定されている)

  • developer.apple.com - sectionHeaderTopPadding
if #available(iOS 15.0, *) {
    tableView.sectionHeaderTopPadding = 0
}

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

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

  • developer.apple.com - cellForRow(at:)
  • developer.apple.com - cellForItem(at:)

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

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

WidgetFamilyに.systemExtraLargeが追加された

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

  • developer.apple.com - 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()
        }
    }
}

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

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

  • hackingwithswift.com - How to convert a SwiftUI view to an image

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

  • Vinzius - How to remove strange padding when snapshotting SwiftUI View using UIGraphicsImageRenderer on iOS 15

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

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

  • Developer Forums - VNDetectFaceLandmarksRequest & VNFaceLandmarkRegion2D changed in iOS 15

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

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

  • 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にする。

  • developer.apple.com - upgradeKnownHostsToHTTP
  • WWDC21 - Explore WKWebView additions
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で確認

設定アクセス元ISP
無効〇〇区auやsoftbankなど
おおよその位置情報を保持(Maintain General Location)TokyoiCloud Private Relay
国と時間帯を使用(Use Country and Time Zone)JapaniCloud Private Relay
@shtnkgm
Programmer
@shtnkgmさんをフォロー
About
Blog
Site Policy

© shtnkgm