当屏幕在 Swift 中熄灭时,使用 WebRTC 的 WKWebView 退出广播

问题描述

我正在制作一个通过 Swift 中的 WKWebVew 进行语音聊天的应用。

即使屏幕关闭,您说话的声音也应该被其他用户听到。

但是,如果在使用 WKWebView 时关闭设备的屏幕,则广播结束并刷新 WKWebView。

import UIKit
import WebKit

class WebViewController: UIViewController {
    @IBOutlet var webView: WKWebView!

    override func loadView() {
        super.loadView()

        let webConfiguration = WKWebViewConfiguration()
        webConfiguration.ignoresViewportScaleLimits = true
        webConfiguration.allowsInlinemediaplayback = true
        webConfiguration.allowsAirPlayFormediaplayback = true
        webConfiguration.allowsPictureInPicturemediaplayback = true
        webConfiguration.mediaTypesRequiringUserActionForPlayback = []

        webView = WKWebView(frame: self.view.bounds,configuration: webConfiguration)
        webView.uiDelegate = self
        webView.navigationDelegate = self

        self.view = self.webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        webView.scrollView.bounces = false

        let localFilePath = Bundle.main.url(forResource: "www/test",withExtension: "html")
        let request = URLRequest(url: localFilePath!)
        webView.load(request)
    }
}

以下是警告窗口的处理和避免重复重新加载。

extension WebViewController: WKUIDelegate {
    //alert
    func webView(_ webView: WKWebView,runJavaScriptAlertPanelWithMessage message: String,initiatedByFrame frame: WKFrameInfo,completionHandler: @escaping () -> Void) {
        let alertController = UIAlertController(title: "",message: message,preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "OK",style: .default,handler: { (action) in completionHandler() }))
        self.present(alertController,animated: true,completion: nil)
    }

    //confirm
    func webView(_ webView: WKWebView,runJavaScriptConfirmPanelWithMessage message: String,completionHandler: @escaping (Bool) -> Void) {

        let alertController = UIAlertController(title: "",handler: { (action) in completionHandler(true) }))
        alertController.addAction(UIAlertAction(title: "Cancel",handler: { (action) in completionHandler(false) }))
        self.present(alertController,completion: nil)
    }

    //prompt
    func webView(_ webView: WKWebView,runJavaScriptTextInputPanelWithPrompt prompt: String,defaultText: String?,completionHandler: @escaping (String?) -> Void) {
        let alertController = UIAlertController(title: "",message: prompt,preferredStyle: .alert)
        alertController.addTextField { (textField) in textField.text = defaultText }
        alertController.addAction(UIAlertAction(title: "OK",handler: { (action) in
            if let text = alertController.textFields?.first?.text {
                completionHandler(text)
            } else {
                completionHandler(defaultText)
            }
        }))

        alertController.addAction(UIAlertAction(title: "Cancel",handler: { (action) in
            completionHandler(nil) }))

        self.present(alertController,completion: nil)
    }

    // href="_blank"
    func webView(_ webView: WKWebView,createWebViewWith configuration: WKWebViewConfiguration,for navigationAction: WKNavigationAction,windowFeatures: WKWindowFeatures) -> WKWebView? {
        if navigationAction.targetFrame == nil {
            webView.load(navigationAction.request)
        }
        return nil
    }
}

extension WebViewController: WKNavigationDelegate {
    // prevent reload
    public func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
        webView.reload()
    }
}

据说由于视图层次结构,WKWebView 在屏幕熄灭时 WKWebView 停止工作。

即使通过后台模式关闭屏幕,有没有办法修复视图?

在 Android 中,您可以通过前台服务 Intent WebView,因此即使屏幕关闭,WebView 也能正常工作。不知道Swift里有没有这种方式。

解决方法

不,没有这样的方法。屏幕关闭时。即设备被锁定,你不会 能够使用 WKWebView 的功能。即使您的应用程序处于后台模式。您将找到另一种解决方案,让麦克风保持开启状态并将其发送到远程服务器(甚至不确定设备锁定时是否可行)