はじめに
SwiftUIでUIWindow
を使うことがたまにあります。
ちょっとめんどなので@Environment
で簡単に使えるようにしてみました。
このUIWindow
の取得方法がベストなのかはわからないです。
もっと良い方法があればコメントください。
実装
private struct UIWindowSceneEnvironmentKey: EnvironmentKey {
static var defaultValue: UIWindowScene? {
return UIApplication.shared.connectedScenes.first(where: {
$0.activationState == .foregroundActive
}) as? UIWindowScene
}
}
extension EnvironmentValues {
var windowScene: UIWindowScene? {
get { self[UIWindowSceneEnvironmentKey.self] }
set { self[UIWindowSceneEnvironmentKey.self] = newValue }
}
}
extension View {
func windowSceneValue(_ windowScene: UIWindowScene?) -> some View {
environment(\.windowScene, windowScene)
}
}
使い方
iOS14からレビュー依頼を出す際にUIWindowSceneが必要になりました。
今回は例としてレビュー依頼を実装してみます
import SwiftUI
import StoreKit
struct ContentView: View {
@Environment(\.windowScene) var windowScene
var body: some View {
Button("レビュー依頼") {
if let windowScene {
SKStoreReviewController.requestReview(in: windowScene)
}
}
}
}
おわり
簡単に書けるようになりました