‘windows’ was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene insteadの解決法
この記事からわかること
- Swift UIで発生する警告
- ‘windows’ was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene insteadの解決法
- UIApplicationの使い方
- UIWindowSceneの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
‘windows’ was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene instead
SwiftUIで以下のコードを実装時に警告が発生しました。
AdMobを使ってバナー広告を定義しているコード
import GoogleMobileAds
struct AdMobBannerView: UIViewRepresentable {
func makeUIView(context: Context) -> GADBannerView {
let banner = GADBannerView(adSize: GADAdSizeBanner)
banner.adUnitID = "ca-app-pub-3940256099942544/2934735716"
banner.rootViewController = UIApplication.shared.windows.first?.rootViewController
banner.load(GADRequest())
return banner
}
func updateUIView(_ uiView: GADBannerView, context: Context) {
}
}
警告対象のコード
UIApplication.shared.windows.first?.rootViewController
発生した警告
‘windows’ was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene instead
翻訳
'windows' は iOS 15.0 で廃止されました: 代わりに関連するウィンドウシーンで UIWindowScene.windowsを使用してください
解決方法
解決方法は警告にもある通りUIWindowScene.windows
を代用して実装していきます。
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
banner.rootViewController = windowScene?.windows.first!.rootViewController
上記のようにすれば警告は無くなりました。
解説
まずUIApplication
クラスはアプリケーションを制御、管理するクラスです。その中のshared
プロパティからシングルトンのUIApplicationインスタンスにアクセスできます。インスタンスから.windows
プロパティを参照してアプリの表示ウィンドウと非表示ウィンドウにアクセスできましたがiOS15以降から非推奨となってしまいました。非推奨となった機能はしばらくの間は使えますが、いつ使用不可になるかわからないので早めの対応をした方が良さそうです。
代替となっているUIWindowScene.windows
を使用するためにはUIWindowScene
インスタンスの生成と型変換が必要になります。
UIApplication.shared.connectedScenes
プロパティを通じてアクティブになっているシーンにアクセスできます。保持する方はSet形式
でUI Scene型
なので要素へのアクセスと型変換が必要です。
定義
var connectedScenes: Set<UIScene> { get }
connectedScenes
プロパティはSet
形式ですがマルチウィンドウでなければfirst
で一番最初の要素にアクセスします。as?
構文を使って型変換を試みます。
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
これでUIWindowScene
のインスタンスができたのであとはプロパティであるwindows
にアクセスすればOKです。
banner.rootViewController = windowScene?.windows.first!.rootViewController
私がSwift UI学習に使用した参考書
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。