首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

wkwebview调用js

WKWebView 是苹果在 iOS 8 及以后版本中引入的一个用于在应用内显示网页内容的组件。它是 WebKit 框架的一部分,提供了比旧的 UIWebView 更好的性能和更多的功能。WKWebView 调用 JavaScript 的能力是通过 JavaScriptCore 框架实现的,它允许 Objective-C 或 Swift 代码与网页中的 JavaScript 代码进行交互。

基础概念

WKWebView 调用 JavaScript 主要通过以下几个概念实现:

  1. WKScriptMessageHandler:允许网页通过 window.webkit.messageHandlers.<name>.postMessage() 发送消息到原生应用。
  2. WKUserContentController:用于注册脚本消息处理器,管理网页与原生应用之间的通信。
  3. evaluateJavaScript(_:completionHandler:):这是一个方法,允许原生代码执行网页中的 JavaScript 代码,并可选地接收执行结果。

优势

  • 性能提升:WKWebView 相比 UIWebView 在渲染速度和内存占用上有显著提升。
  • 稳定性增强:WKWebView 将网页渲染的部分工作交给了操作系统,减少了应用的崩溃率。
  • 更好的用户体验:支持更多的 HTML5 特性和 CSS3 功能。
  • 安全性:提供了更严格的安全沙箱环境,限制了网页对设备的访问权限。

类型

  • 同步调用:原生代码调用 JavaScript 并等待结果。
  • 异步调用:原生代码调用 JavaScript 并通过回调接收结果。

应用场景

  • 混合应用开发:在原生应用中嵌入网页内容,并实现原生与网页的双向通信。
  • 动态内容加载:根据用户操作动态执行 JavaScript 代码以更新网页内容。
  • 表单自动填充:原生应用可以自动填充网页表单字段。

示例代码

以下是一个 Swift 示例,展示了如何在 WKWebView 中调用 JavaScript 函数:

代码语言:txt
复制
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let config = WKWebViewConfiguration()
        webView = WKWebView(frame: view.bounds, configuration: config)
        webView.navigationDelegate = self
        view.addSubview(webView)
        
        if let url = URL(string: "https://example.com") {
            let request = URLRequest(url: url)
            webView.load(request)
        }
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        // 调用 JavaScript 函数
        let jsString = "alert('Hello from Swift!')"
        webView.evaluateJavaScript(jsString, completionHandler: { (result, error) in
            if let error = error {
                print("Error executing JavaScript: \(error)")
            } else {
                print("JavaScript executed successfully")
            }
        })
    }
}

遇到问题及解决方法

问题:调用 JavaScript 时没有反应或者出现错误。

原因

  • JavaScript 代码本身有误。
  • 网页尚未完全加载完成就调用了 JavaScript。
  • 权限问题,例如跨域请求被阻止。

解决方法

  1. 确保 JavaScript 代码无误,并在浏览器的控制台中测试。
  2. 确保在 webView(_:didFinish:) 或其他合适的生命周期方法中调用 JavaScript。
  3. 检查网页的 CORS 设置,确保没有跨域问题。
  4. 使用 Safari 的开发者工具连接到 WKWebView,检查控制台中的错误信息。

通过以上方法,可以有效地调用 JavaScript 并处理可能出现的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • iOS小技能:WKWebView与JS的交互

    前言 由于目前UIWebView 已经被抛弃了,因此推荐使用WKWebView的WKScriptMessageHandler实现iOS与JS交互 WKWebView是Apple在iOS8推出的Webkit...框架中的负责网页的渲染与展示的类,相比UIWebView速度更快,占用内存更少,支持更多的HTML特性 I JS调用iOS 使用例子:点击页面图片,调用iOS方法进行图片放大显示 1.1 JS代码: window.webkit.messageHandlers.openImage.postMessage...但只有在整个webView加载完成之后调用此方法才会有响应 2.1 执行JS iOS使用WKWebView的-evaluateJavaScript:completionHandler:方法执行拼接好的JS...iOS调用JS数据显示框 WKWebView在每次加载请求完成后会调用此方法 (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation

    7.3K30

    WKWebView

    2,WKWebView拥有与Safari中相同的Nitro JavaScript引擎,大大提高了页面JS执行速度;但是UIWebView不支持Nitro JavaScript引擎,所以加载较慢。...5,WKWebView可以和JS直接互调函数,交互更方便;而UIWebView则需要依靠WebViewJavaScriptBridge第三方库来协助处理与JS的交互,实现起来较繁琐。...苹果JS字符串,用于OC调用JS方法。 实例方法 - goBack。导航到后退列表的后退项中。 - goForward。导航到后退列表的前进项中。 - reload。重新加载当前页面。...*)navigation { } //页面加载失败时调用 - (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified...我们可以通过JSCore或者JSBridge来在native中执行JS代码,并且在JS中去回调Native的相关函数。 现在很火热的跨平台以及热修复技术,都是基于JS与Native通信来实现的。

    6K20

    iOS开发中的WKWebView与JS的交互

    /u010105969/article/details/53189934),可当时用来展示网页的控件是UIWebView,而在iOS8之后苹果推出了WKWebView,此控件也能用来显示网页,可与JS的交互却与...在点击前三个按钮的时候会调用方法: // 警告框 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString...如果点击第四个conform按钮会调用方法: // 确认框 - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage...如果点击最后一个input按钮会调用方法: // 输入框 - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt...注意:在利用UIWebView展示网页的时候我们如果要想与JS进行交互那么我们就得获取JS代码中的方法名,而我们在使用WKWebView的时候就不用了。

    2.3K20

    WKWebView 那些坑

    无奈之下,我们只能约定一个JS接口,让游戏开发商实现该接口,具体是通过 canvas getImageData()方法取得图片数据后返回 base64 格式的数据,客户端在需要截图的时候,调用这个JS接口获取...退出的时候,JS刚好执行了window.alert(), alert 框可能弹不出来,completionHandler 最后没有被执行,导致 crash;另一种情况是在 WKWebView 一打开,...另一个 crash 发生在 WKWebView 退出前调用: -[WKWebView evaluateJavaScript: completionHandler:] 执行JS代码的情况下。...WKWebView 退出并被释放后导致completionHandler变成野指针,而此时 javaScript Core 还在执行JS代码,待 javaScript Core 执行完毕后会调用completionHandler...8.2、goBack API问题 WKWebView 上调用 -[WKWebView goBack], 回退到上一个页面后不会触发window.onload()函数、不会执行JS。

    4.7K130
    领券