如何解决我在WKWebview中嵌入了一个自定义UIView,如何设置uiDelegate和navigationDelegate来让webview didFinish函数起作用?
我有一个带有WKWebview的自定义UIView。
而且我发现我的webview委托函数webView didFinish
,didReceive
不起作用。
我在OK
中打印了webView didFinish
,但发现我的本地文件已经加载。
我的代码怎么了?
谢谢
public class CustomWebView: UIView{
@objc public var webview: WKWebView?
public var customDelegate: CustomDelegate?
override init(frame: CGRect) {
super.init(frame: frame)
loadXib()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
loadXib()
}
func loadXib(){
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "\(Self.self)",bundle: bundle)
let source = "var devicePlatform = 'iOS';"
let userScript = WKUserScript(source: source,injectionTime: .atDocumentStart,forMainFrameOnly: true)
let userContentController = WKUserContentController()
userContentController.add(self,name: "test")
userContentController.addUserScript(userScript)
let config = WKWebViewConfiguration()
config.userContentController = userContentController
if #available(iOS 9.0,*) {
config.applicationNameForUserAgent = "Custom_APP"
} else {
}
self.webview = WKWebView(frame: self.bounds,configuration: config)
guard let wView = self.webview else { return }
wView.uiDelegate = self as? WKUIDelegate
wView.navigationDelegate = self
wView.scrollView.bounces = false
wView.translatesAutoresizingMaskIntoConstraints = false
wView.allowsBackForwardNavigationGestures = true
wView.configuration.preferences.setValue(true,forKey: "allowFileAccessFromFileURLs")
wView.evaluateJavaScript("navigator.userAgent") { (result,error) in
if let userAgent = result as? String,error == nil {
print("===) uA : \(userAgent)")
}
}
addSubview(wView)
}
}
extension CustomWebView {
public func start(){
guard let webview = self.webview else { return }
if Custom_Constants.IS_LOAD_LOCAL_HTML_FILE {
guard let url = URL(string: Custom_Constants.BASE_URL) else { return }
webview.loadFileURL(url,allowingReadAccessTo: url.deletingLastPathComponent())
} else {
guard let request = getRequest() else { return }
webview.load(request)
}
}
public func doHybridNativeRequest(request:NativeRequest){
self.webview?.evaluateJavaScript("native2Web(\(request.getParameter()))",completionHandler: nil)
}
func doActionType(response:WebResponse){
let actionName = response.name
if actionName == "backToApp" {
customDelegate?.goBackToApp?(webView: self,webResponse: response)
}
if actionName == "storeData" {
customDelegate?.storeData?(webView: self,webResponse: response)
}
if actionName == "retrieveData" {
customDelegate?.retrieveData?(webView: self,webResponse: response)
}
}
func filterWebResponse(message:WKScriptMessage,response:WebResponse){
if message.name == "test" {
doActionType(response: response)
}
}
}
extension CustomWebView{
fileprivate func getRequest() -> URLRequest? {
var request: URLRequest?
if let url = URL(string: "\(Custom_Constants.BASE_URL)") {
print("===) url here: \(url)")
request = URLRequest(url: url,cachePolicy: .reloadIgnoringLocalCacheData,timeoutInterval: 180)
}
return request
}
}
extension CustomWebView : UIWebViewDelegate{
public func webView(_ webView: WKWebView,runJavaScriptAlertPanelWithMessage message: String,initiatedByFrame frame: WKFrameInfo,completionHandler: @escaping () -> Void) {
}
public func webView(_ webView: WKWebView,runJavaScriptConfirmPanelWithMessage message: String,completionHandler: @escaping (Bool) -> Void) {
let alertController = UIAlertController(title: nil,message: message,preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "YES",style: .default,handler: { (action) in
completionHandler(true)
}))
alertController.addAction(UIAlertAction(title: "NO",handler: { (action) in
completionHandler(false)
}))
}
}
extension CustomWebView: WKNavigationDelegate{
public func webView(_ webView: WKWebView,didFail navigation: WKNavigation!,withError error: Error) {
self.customDelegate?.errorHasOccurred?(error: error)
printLog("===) webView didFail....")
}
public func webView(_ webView: WKWebView,didFinish navigation: WKNavigation!) {
print("===) OK")
self.customDelegate?.webviewDidFinish?(webview: webView,navigation: navigation)
}
}
extension CustomWebView: WKScriptMessageHandler{
public func userContentController(_ userContentController: WKUserContentController,didReceive message: WKScriptMessage) {
guard let getDict = message.body as? Dictionary<String,Any> else{
return;
}
print("===) \(message.body)")
let response:WebResponse = WebResponse(parameter: getDict)
filterWebResponse(message: message,response: response)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。