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

js调用ios webview

JavaScript 调用 iOS WebView 主要涉及到在 iOS 应用中使用 WKWebView 组件来实现网页与原生应用之间的交互。以下是关于这个问题的基础概念、优势、类型、应用场景以及常见问题和解决方案的详细解答。

基础概念

WKWebView 是 iOS 8 及以上版本中用于显示网页内容的组件,它提供了比 UIWebView 更好的性能和更多的功能。通过 WKWebView,JavaScript 可以与原生代码进行双向通信。

优势

  1. 性能提升WKWebViewUIWebView 更快,内存占用更少。
  2. 更好的用户体验:支持更多的网页标准和现代浏览器的特性。
  3. 安全性增强:提供了沙盒机制,限制网页对设备的访问权限。
  4. 灵活的交互方式:支持 JavaScript 与原生代码的双向通信。

类型

  • 单向通信:原生代码调用 JavaScript 函数。
  • 双向通信:JavaScript 调用原生代码,原生代码也可以调用 JavaScript。

应用场景

  1. 混合应用开发:在原生应用中嵌入网页内容,如新闻阅读器、电商应用等。
  2. 动态内容加载:根据用户操作动态加载不同的网页内容。
  3. 表单提交和处理:在网页中处理用户输入的数据,并将结果传递给原生应用。

示例代码

1. 原生代码调用 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!) {
        let jsString = "alert('Hello from Swift!')"
        webView.evaluateJavaScript(jsString) { (result, error) in
            if let error = error {
                print("Error executing JavaScript: \(error)")
            }
        }
    }
}

2. JavaScript 调用原生代码

首先,在原生代码中定义一个协议并实现它:

代码语言:txt
复制
import WebKit

@objc protocol JavaScriptHandler {
    func handleJavaScriptCall(_ message: String)
}

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

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let config = WKWebViewConfiguration()
        let userContentController = WKUserContentController()
        userContentController.add(self, name: "nativeHandler")
        config.userContentController = userContentController
        
        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 userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "nativeHandler", let messageBody = message.body as? String {
            handleJavaScriptCall(messageBody)
        }
    }

    func handleJavaScriptCall(_ message: String) {
        print("Received message from JavaScript: \(message)")
    }
}

然后在网页中使用 JavaScript 发送消息:

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
    <title>JavaScript to Native</title>
    <script>
        function sendMessageToNative() {
            window.webkit.messageHandlers.nativeHandler.postMessage("Hello from JavaScript!");
        }
    </script>
</head>
<body>
    <button onclick="sendMessageToNative()">Send Message to Native</button>
</body>
</html>

常见问题及解决方案

1. JavaScript 调用原生代码失败

原因:可能是由于 WKScriptMessageHandler 没有正确注册或者消息名称不匹配。

解决方案

  • 确保在 WKWebViewConfiguration 中正确添加了 WKUserContentController 并注册了处理程序。
  • 检查 JavaScript 中的消息名称是否与原生代码中注册的名称一致。

2. 原生代码调用 JavaScript 无响应

原因:可能是由于 evaluateJavaScript 方法在网页未完全加载时被调用。

解决方案

  • 确保在 webView(_:didFinish:) 回调中调用 evaluateJavaScript 方法。
  • 可以添加一些日志来确认网页是否已经完全加载。

通过以上内容,你应该能够全面了解 JavaScript 调用 iOS WebView 的相关知识,并能够解决常见的交互问题。

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

相关·内容

  • IOS WebView控件详解

    概述 WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和WKWebView,UIWebView是iOS2之后开始使用,WKWebView是在iOS8开始使用,...// 实现自动定位JS代码, htmlLocationID为定位的位置(由JS开发人员给出),实现自动定位代码,应该在网页加载完成之后再调用 NSString *javascriptStr = [NSString...:(WKNavigation *)navigation; WKUIDelegate常用代理 /* 输入框,页面中有调用JS的 prompt 方法就会调用该方法 */ - (void)webView:(WKWebView...JS的 confirm 方法就会调用该方法 */ - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage...JS的 alert 方法就会调用该方法 */ - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage

    4.9K80

    iOS的WebView——WKWebView

    前言 在iOS8中,苹果推出了WKWebView。WKWebView有一个突出特点,就是内存占用少。 但作为一个全新的WebView,API相比于之前的UIWebView肯定会有所不同。...Webview的使用,通常包含以下几个部分:浏览器的基本设置,浏览器的各种回调,浏览器中js如何调用原生方法。...调用原生方法 拦截url 此方法的本质是,js会尝试加载某个URL,客户端在加载前拦截这个URL,通过解析这个URL识别它的内容,调用相应的原生方法,并阻上浏览器加载这个URL。...contentController苹果官方提供的js调用原生方法的类。它的使用方法是: .......postMessage(需要传递的数据) 原生调用js方法 [self.webView evaluateJavaScript:@"function('action')" completionHandler

    3.6K20

    webview调用小程序支付流程

    https+http(https为了兼顾小程序) 后端:lnmp 前端:vue-cli+element-ui开发的spa(路由模式为history) 小程序:pages/index/index.js...(默认入口文件,用于获取openid并跳转),webview页面(嵌套了spa),wxpay页面(发起小程序支付),webvieworders页面(支付成功后跳转) 步骤 index.js在onload...里使用wx.login获取到code参数,并携带该参数向后台服务器请求openid 携带后台返回的openid通过小程序路由跳转至webview页面,webview页面的js在onload里通过options...参数获取到携带的openid后通过webview发送至spa应用中 spa入口接收到openid后保存至cookie 在支付页面获取该openid并向后台(调用微信统一下单接口并返回后续wxpayment...方法所需参数的地址)发起请求,拿到服务器返回的jsParameters后携带该参数通过小程序提供的wx.miniProgram.navigateTo方法跳转回小程序支付页面(逻辑自己写),支付页面接收到该参数后解析成js

    3.2K60

    iOS下JS与OC互相调用(四)--JavaScriptCore

    :self.webView]; HTML的内容也大致一样,不过JS的调用有些区别,更简单了。...2.2 添加JS要调用的原生OC方法。 在HMTL加载成功的回调方法- (void)webViewDidFinishLoad:(UIWebView *)webView中添加要调用的原生OC方法。...奇怪的是竟然可以更新部分UI,例如给view设置背景色,调用webView执行js等,但是弹出原生alertView就会在控制台报子线程操作UI的错误信息。...2.3 OC调用JS方法 OC调用JS方法就有多种方式了。首先介绍使用JavaScriptCore框架的方式。...WKWebView中如何实现OC与JS交互可以看前面这篇文章:iOS下JS与OC互相调用(三)--MessageHandler UIWebView利用JavaScriptCore来实现交互的示例工程:JS_OC_JavaScriptCore

    2.9K10

    iOS下JS与原生OC互相调用(总结)

    iOS开发免不了要与UIWebView打交道,然后就要涉及到JS与原生OC交互,今天总结一下JS与原生OC交互的两种方式。...关于这种方式调用OC方法,唐巧早期有篇文章有过介绍: 关于UIWebView和PhoneGap的总结 方式二 在iOS 7之后,apple添加了一个新的库JavaScriptCore,用来做JS交互,...iOS下JS与OC互相调用(一)--UIWebView 拦截URL iOS下JS与OC互相调用(二)--WKWebView 拦截URL iOS下JS与OC互相调用(三)--MessageHandler...iOS下JS与OC互相调用(四)--JavaScriptCore iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge iOS下JS与OC互相调用...(六)--WKWebView + WebViewJavascriptBridge iOS下JS与OC互相调用(七)--Cordova 基础 iOS下JS与OC互相调用(八)--Cordova详解+实战

    5K30

    iOS使用WebView查看各类文档

    现在人们已经习惯于使用手机来查看文档了,除了使用各个应用来打开office文档,iOS自身的WebView也支持打开查看大部分类型的office文档,当然他本身是用来打开HTML文件的,但也不妨碍对这个强大的功能加以利用嘛...文档的类型有很多种,要使用WebView打开各个类型的文档,就要告诉WebView,我们要打开的文件是什么类型的,这里用到了一个叫做MIMEType的东西,用来记录我们要打开的文件格式,并告知WebView...并显示它: //创建WebView并设置位置 UIWebView webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 60, 320, 520...添加到视图中 [self.view addSubview:webView]; 这样就可以通过WebView将各种格式的文档显示出来了。...这是一个快速开发显示文档的例子,不用根据每种文档格式来做对应的设置,调用自带的类,都很方便。但是要作为正式使用仍然缺了很多,所以要走的路还很长。

    87830
    领券