みかづきブログ・カスタム

基本的にはちょちょいのほいです。

UIApplication.shared.isIdleTimerDisabledを使って、アプリの起動中にiOSデバイスがスリープしないようにする 📱

UIApplication.shared.isIdleTimerDisabled を trueに設定すれば、スリープに入らなくなります。

developer.apple.com


試しに、かつてつくった WKWebViewを設置しただけのiOSアプリ に組み込んでみましょう。

blog.kimizuka.org


ソースコード

ContentView.swift

import SwiftUI

var urlString = "https://google.co.jp"

struct ContentView: View {
    var body: some View {
        WebView(urlString: urlString).onAppear {
            print("appear")
            UIApplication.shared.isIdleTimerDisabled = true // 追加
        }.onDisappear {
            print("disapper")
            UIApplication.shared.isIdleTimerDisabled = false // 追加
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}



WebView.swift(前回から変更なし)

import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    var urlString: String
    
    func makeUIView(context: Context) -> WKWebView {
        let config = WKWebViewConfiguration()

        config.allowsInlineMediaPlayback = true

        return WKWebView(frame: .zero, configuration: config)
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        guard let url = URL(string: urlString) else {
            return
        }

        uiView.load(URLRequest(url: url))
    }
}

コードとしてはContentView.swiftに2行追加したのみです。
一応、Viewが非表示になった際に、UIApplication.shared.isIdleTimerDisabledをfalseに戻しています。
これだけで、アプリ起動時は本体がスリープしなくなります。
この書き方だと画面遷移した場合その限りではない気がするのですが、WebViewを表示するだけの画面遷移なしのアプリで使うこと前提なので、いまのところ困っていません。

ウェブサイトからだとスリープの設定はできないので、ネイティブアプリでラップした意味が出てきますね。


関連記事

blog.kimizuka.org