`

swift -> WKWebView 或 UIWebView 和 JS 进行交互

阅读更多

参考: https://00red.com/blog/2016/03/22/teacher-swift-uiwebview-javascript/

 

 

一, JS 触发 SWIFT 

swift 代码

import UIKit
import JavaScriptCore

class ViewController: UIViewController,UIWebViewDelegate {

    
    var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let path = Bundle.main.path(forResource: "test", ofType: "html")
        let url = NSURL(fileURLWithPath: path!)
        let request = NSURLRequest(url: url as URL)
        webView = UIWebView(frame: self.view.frame)        
        webView.loadRequest(request as URLRequest)
        self.view.addSubview(webView);
        //
        let jsContext = self.webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as? JSContext
        jsContext?.setObject(JavaScriptMethod(), forKeyedSubscript: "callSwift" as (NSCopying & NSObjectProtocol)!)
        
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
  
}

//必须加前面的@objc
@objc protocol JavaScriptMethodProtocol: JSExport {
    //参数前面必须写上_下划线
    func postContent(_ value: String, _ number: String)
    func postContent2(_ value: String)
}

class JavaScriptMethod : NSObject, JavaScriptMethodProtocol {
    
    func postContent(_ value: String, _ number: String) {
        //方法名postContent
        print("dd"+value);
    }
    func postContent2(_ value: String){
        print("str:"+value);
    }
    
    
}

 

test.html

<html>
    <meta charset="utf-8" />
    <body>
        <BR><BR>
        <button onclick='callSwift.postContent("我是value1", 2)'>Call Swift</button>
        <button onclick='callSwift.postContent2("我是一个字符串啊")'>Call Swift2</button>
    </body>
    
</html>

 

html 和SWIFT 文件在同一个目录

 

2 : 第二种通过 消息 通知的 形式 

先是swift 

 

import UIKit
import Foundation
import JavaScriptCore
import WebKit;

class Page1: UIViewController,WKScriptMessageHandler{
 
    override func viewDidLoad() {
        super.viewDidLoad()
        let conf = WKWebViewConfiguration()
        conf.userContentController.add(self as! WKScriptMessageHandler, name: "NOTIFY")
        let web  = WKWebView(frame: self.view.frame, configuration: conf)

        self.view.addSubview(web)
        let url:String = "http://192.168.2.188/9/2.php"
        web.load(NSURLRequest(url: NSURL(string: url) as! URL) as URLRequest);
        
        
    }
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "NOTIFY" {
            if let dic = message.body as? NSDictionary {
                print(dic["link"])
                print(dic["image"])
            }
        }
    }
}
 

 

然后 php 文件里的JS 通过如下JS 代码触发

var data = {};
data.link = "aaa";
data.image = "iiiii";
webkit.messageHandlers.NOTIFY.postMessage(data);

 

 

二、swift 触发 js

 

在上面的html  中增加 JS 代码

    <script type="text/javascript">
        function doFun(str){
            alert(str);
        }
    </script>

 

在上面的swift 中增加代码

self.webView.stringByEvaluatingJavaScript(from: "doFun('你执行了DOFUN')")

 

其中 执行JS 代码 需要等HTML 加载完,可通过代理监控事件判断 

 

另: 如果存在 300毫秒点击延迟可 改用 WKWebView 并 在html 的meta 中设置 user-scalable=0 

 

 

 ** swift 通过执行 js 返回 执行 结果 ,比如 通过JS 的方法 获取页面的title 

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
   
        //要执行的js 语句
        let script:String = "document.title";
        webView.evaluateJavaScript(script, completionHandler: { (result, error) in
            if result != nil {
                print("通过evaluateJavaScript获取的结果:"+(result as! String));
                //结果就是打印出了该站的title 不过是通过js 的方法
            } else {
                print(error ?? "Error")
            }
        })
        
    }

 

 相关参考: 根据某个标签的属性值获取另外一个属性值

http://mft.iteye.com/admin/blogs/2378327

 

分享到:
评论

相关推荐

    swift-针对WKWebView进行的封装支持和H5交互包括调用js方法等

    本知识点主要聚焦于如何使用Swift对WKWebView进行封装,以及如何实现与H5页面的交互,包括调用JavaScript(JS)方法。 首先,WKWebView是WebKit框架的一部分,它取代了旧的UIWebView,提供了更好的性能和更低的内存...

    swift-基于WKWebView控件上跨平台框架

    5. **JavaScript互操作性**:WKWebView通过WKUserContentController允许JavaScript代码与Objective-C或Swift代码进行交互,便于实现富交互功能。 6. **Cookies同步共享**:对于跨平台需求,WKWebView可以完美解决...

    swift-LYWebViewController基于WKWebView和UIWebView封装

    基于WKWebView封装,支持&gt;=iOS8系统,包含功能:页面加载进度条、上方导航、底部toolbar,转场动效、分享、打开appstore下载弹窗、和js交互 国际化、兼容iPad、preview(&gt;=iOS9)、用chrome、safari打开网页、清缓存...

    swift-使用WKWebView的一个带下载的web浏览界面

    总之,使用Swift和WKWebView构建一个带下载功能的Web浏览界面是一个综合性的任务,涉及到网络请求、文件操作、用户交互等多个方面。通过深入理解WKWebView及其相关API,你可以创建出高性能且功能丰富的Web应用。在...

    UIWebView和js交互

    本教程将深入探讨UIWebView与JavaScript的交互机制,帮助开发者更好地理解和运用这一功能。 1. UIWebView的基本使用: UIWebView可以通过代码或Storyboard添加到项目中。创建实例后,可以通过`loadRequest:`方法...

    oc中UIWebView交互 JS交互

    二、JavaScript交互基础 1. stringByEvaluatingJavaScriptFromString方法:这是UIWebView的核心方法,通过该方法,我们可以向网页中的JavaScript发送命令并获取返回的结果。例如,我们可以在JavaScript中定义一个...

    Swift-WKWebView(本地数据) 源码

    总结,Swift-WKWebView是Swift开发中不可或缺的组件,它提供了强大的网页展示和交互能力。通过理解其基本用法、本地数据加载、JavaScript通信以及网络请求处理,开发者可以构建出功能丰富的混合型iOS和macOS应用程序...

    ios-JS wkWebView交互.zip

    这个"ios-JS wkWebView交互.zip"文件似乎包含了一个示例,展示了如何在WKWebView中实现JavaScript与Swift的交互,特别是在用户界面操作如调用相机、相册,图像处理和数据传递方面。 首先,让我们深入理解WKWebView...

    iOS WKWebView和UIWebView高度自适应

    总之,实现iOS应用中的WKWebView和UIWebView高度自适应主要依赖于JavaScript与原生代码的交互。UIWebView通过`webViewDidFinishLoad:`代理方法,而WKWebView则利用`WKUserContentController`和`...

    UIWebView和js交互demo1

    综上所述,"UIWebView和js交互demo1"项目主要展示了如何在iOS应用中利用UIWebView或WKWebView进行OC与JS的交互,这在实现复杂的混合式应用或者增强原生应用的Web功能时非常有用。通过这种交互方式,开发者可以充分...

    Swift-WKWebView(网络连接) 源码

    WKWebView不仅提供了比旧版UIWebView更高效、更现代的渲染性能,还支持更多的API功能,使得开发者能更好地控制网页加载和交互过程。在这里,我们将深入探讨Swift-WKWebView的核心知识点,以及如何在实际开发中运用它...

    iOS WKWebView和UIWebView自适应高度

    在iOS应用开发中,UIWebView和WKWebView是两种常见的用于展示网页内容的控件。它们允许开发者在原生应用中嵌入HTML、CSS和JavaScript代码,实现丰富的交互体验。本篇文章将深入探讨如何在iOS应用中,特别是针对...

    IOS原生与h5交互--WKWEBVIEW

    在iOS开发中,当涉及到应用内嵌入网页内容或者实现原生应用与Web内容的交互时,`WKWebView`是...在`jstest`这个项目中,你可能会找到更多的示例代码和具体实践,帮助你更深入地理解`WKWebView`和JavaScript的交互方式。

    swift-wkwebview

    - **交互**:WKWebView提供了`WKUserContentController`,用于JavaScript和Objective-C/Swift之间的通信,实现网页内容与原生代码的交互。 5. **浏览进度条** 在使用WKWebView时,可以监听`WKNavigation`代理方法...

    swift5.0 wkwebview封装 WKWeView.zip

    8. **WKWebView 封装库**:在实际项目中,开发者通常会创建一个自定义的WKWebView类,封装常用功能,如加载网页、设置用户代理、处理JavaScript交互等,以提供统一的调用接口,简化使用。 在“WKWeView”这个文件中...

    UIWebView与 javascript的交互二

    WKWebView同样支持JavaScript与原生代码的交互,但API有所不同,需要使用`WKWebViewConfiguration`和`WKUserContentController`来实现。 总结,UIWebView与JavaScript的交互是iOS开发中的重要技能,允许开发者结合...

    swift-iOS原生webView与JS交互工具

    在iOS应用开发中,有时我们需要在原生Swift代码和网页内容之间进行交互,这通常涉及到WebView的使用。Swift-iOS原生webView与JS交互工具,如`SFWebViewBridge`,就是为了实现这一目标而设计的。它允许开发者在Swift...

    swift-swift版本的简易WKWebview浏览器带加载进度条

    相比UIWebView,WKWebView有更好的性能和JavaScript执行效率,同时对现代Web标准支持更全面。在本项目中,WKWebView用于展示网页内容,提供了一个更流畅的用户体验。 2. **加载进度条**: 为了提供更好的用户体验,...

    swift-JS-OC交互相互传递参数里面差不多都换成中文了

    `WKWebView`允许在Swift应用中内嵌网页内容,并提供了与JavaScript交互的能力。通过实现`WKScriptMessageHandler`协议,我们可以监听和响应JavaScript发送的消息。例如,当JavaScript调用`window.webkit.message...

    ios-WKWebView 的加载 、js交互的使用.zip

    在iOS开发中,WKWebView是苹果提供的一种用于展示网页内容的组件,它是UIWebView的替代品,具有更好的性能和安全性。本教程将深入探讨WKWebView的加载机制以及如何实现JavaScript与Objective-C/Swift的交互。 一、...

Global site tag (gtag.js) - Google Analytics