问题描述
我正在制作一个通过 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 的功能。即使您的应用程序处于后台模式。您将找到另一种解决方案,让麦克风保持开启状态并将其发送到远程服务器(甚至不确定设备锁定时是否可行)