‘windows’ was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene insteadの解決法

‘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学習に使用した参考書

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index