アプリを更新してiOS13に対応させよう
アプリ開発において、OSのバージョンアップ対応は必須の作業です。
そもそも改修の必要性があるかを確認するところから始まり、バージョンアップの対応を行うことになると思います。
そこで、今回は iOS13 へのバージョンアップ対応の内容を公開したいと思います。
目次
LaunchScreenの必須化対応
iOS13 では LaunchImage が非推奨となりました。
そのため、アプリの起動画面に Assets.xcassets の LaunchImage を使用している場合は LaunchScreen への変更を余儀なくされます。
この対応としては、大きな画像を正方形にして ImageSet に入れ LaunchScreen.storyboard の ImageView に設定することで対応できます。
この時 ContentMode を ScaleAspectFit にするといい感じになると思います。
Assets.xcassets の LaunchImage は削除し、プロジェクトの 「Asset Catalog Launch Image Set Name」 は空文字にしましょう。
ダークモード対応の必須化
iOS13 では、全てのアプリで原則ダークモードが対応されているとデフォルトで判定されます。
そのため、デバイスでダークモードをONにしたとき、何も対応しない場合は外観が思いっきり変更されてしまう事になります。
これは Info.plist に UIUserInterfaceStyle というキーで Light を指定することで、アプリ内では常にライトモード扱いとなり回避可能です。
しかし、公式ドキュメントに下記のような記述があります。
Important
Supporting Dark Mode is strongly encouraged. Use the UIUserInterfaceStyle key to opt out only temporarily while you work on improvements to your app’s Dark Mode support.
Googleの翻訳によると
ダークモードのサポートを強くお勧めします。
UIUserInterfaceStyleキーを使用して、アプリのダークモードサポートの改善作業中に一時的にのみオプトアウトします。
ということです。
恒久的な対応を行うには、下記サイト様でご紹介されている方法が良いと思います。
iOS13の外観モード(ダークモード)に対応する方法
また iOS13 の DynamicColor 対応は下記のようなメソッドを作ると良いと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import UIKit extension UIColor { /// Get Dynamic Color /// /// - parameter light: light theme color /// - parameter dark: dark theme color /// - returns: dynamic color public class function dynamicColor(light: UIColor, dark: UIColor) -> UIColor { if #available(iOS 13.0, *) { return UIColor { (traitCollection) -> UIColor in if traitCollection.userInterfaceStyle == .dark { return dark } else { return light } } } return light } } |
さらに UISegmentedControl の色も tintColor では設定できなくなっています。
この問題は下記のような感じにするとOSの特色も残したまま、カラー設定を維持できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@IBOutlet weak var segmentedControl: UISegmentedControl! func setColor() { // 上記のdynamicColorを使用 let color = UIColor.dynamicColor(light: UIColor.red, dark: UIColor.blue) if #available(iOS 13.0, *) { // 背景・テキストのカラーを指定 self.segmentedControl.selectedSegmentTintColor = color self.segmentedControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor : UIColor.white], for: .selected) self.segmentedControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor : color], for: .normal) // ボーダーを設定 self.segmentedControl.layer.borderColor = color.cgColor self.segmentedControl.layer.borderWidth = 1.0 } else { self.segmentedControl.tintColor = color } } |
ただし、アプリ起動中に外観モードを変更した時 DynamicColor を指定していない場合は変わらないです。
その時は下記のメソッドを ViewController で override して色を指定することで対応することも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 |
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) if self.traitCollection.userInterfaceStyle == .dark { self.view.backgroundColor = UIColor.red } else { self.view.backgroundColor = UIColor.blue } } |
PresentViewControllerの表示変更
iOS13 から、画面を呼び出す self.present 命令の初期表示が変更され、下の画面が表示されるようになりました。
また、この表示の場合、呼び出した画面を下にスワイプすると ViewController を終了させることができます。
そのため、時間で表示する場合や1回しか表示しない ViewController から別の ViewController を呼び出した場合、戻ってきても何も発生しないという状態になってしまいます。
この対応については プログラムで対応する方法 と StoryBoardで対応する方法 の2種類があります。
プログラムで対応する方法
ViewController の modalPresentationStyle に .fullScreen を設定することで対応できます。
1 2 3 |
viewController.modalPresentationStyle = .fullScreen |
StoryBoardで対応する方法
ViewController の Presentation を Full Screen にすることで対応できます。
UIWebViewの廃止
UIWebView は、随分前から Deprecated となっていましたが、とうとう WKWebView に移行しなければならなくなりました。
というもの、iOS13 でいきなり使えなくなることはありませんが、将来的に消えることが明示されています。
しかし、UIWebViewを使用したままアプリ更新の申請を行うと ITMS-90809 というエラーコード付きのメールが送られてくるようです。
審査に出したiOSアプリが ITMS-90809 としてAppleから問題を指摘される話
Push通知システムの変更
あまり情報が普及していませんが、Push通知にも更新がありました。
具体的には下記のような変更があります。
- プッシュトークン取得の変更
- APNS(Apple Push Notification Service)APIヘッダーに新しい属性が必要
- バックグラウンド通知のためにAPNS優先度を5に設定する必要がある
- Push APIのTLS v1のサポートを終了
詳細は下記の記事から確認出来ますが、対応しないと通知が届かないことになりますので気をつけましょう。
iOS 13 and Xcode 11 Changes That Affect Push Notifications
https://onesignal.com/blog/ios-13-introduces-4-breaking-changes-to-notifications/
iOS 13 プッシュ通知ヘッダー必須問題(未解決)とNSDataのdescriptionの話
さいごに
今回の iOS13 の対応は、比較的大きめの対応が必要ですね。
個人的には PresentViewControllerの表示変更 と ダークモード対応の必須化 が大きく影響しました。
みなさんも iOS13 にしっかり対応して、素晴らしいアプリを提供していきましょう。
- おすすめ記事
POPULAR
のえる
Full-stack Developer