ios js调用swift_ios js调用原生方法获取返回值 swift - CSDN
  • JavaScript调用Swift原生方法 1、创建公开给JavaScript调用的方法类 2、导入JavaScriptCore库 3、关联JSContext 4、以 JSExport 协议关联 NativeObject对象的方法 5、实现JSMethodExport协议方法 ...

    JavaScript调用Swift原生方法

    1、创建公开给JavaScript调用的方法类

    2、导入JavaScriptCore库

    3、关联JSContext

    4、以 JSExport 协议关联 NativeObject对象的方法

    5、实现JSMethodExport协议方法

    // 获取JSContext Key
    public let JavaScriptContext_Key = "documentView.webView.mainFrame.javaScriptContext"
    
    import UIKit
    import JavaScriptCore
    
    class JSMethodExportViewController: UIViewController {
    
        @IBOutlet weak var webView: UIWebView!
        
        var context: JSContext?
        
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
            webView.delegate = self
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        
        deinit {
            
            URLCache.shared.removeAllCachedResponses()
            
            // 防止销毁时未移除导致闪退
            NotificationCenter.default.removeObserver(self)
            
            if webView == nil {
                return
            }
            
            webView.stopLoading()
            webView.delegate = nil
            webView.loadRequest(URLRequest(url: "about:blank".URL! as URL))
            
        }
    }
    
    extension JSMethodExportViewController: UIWebViewDelegate, JSMethodExport {
        
        func webViewDidStartLoad(_ webView: UIWebView) {
            
            // 建立关联关系
            context = webView.value(forKeyPath: JavaScriptContext_Key) as? JSContext
                
            // 以 JSExport 协议关联 native 的方法
            context?.setObject(self, forKeyedSubscript: "NativeObject" as (NSCopying & NSObjectProtocol)!)
            context?.evaluateScript("NativeObject.isiOS=true;")
            
            context?.exceptionHandler = { (context, exception) in
                print(context, exception)
            }
        }
    }
    
    @objc protocol JSMethodExport: JSExport {
        
        /**
         获取城市定位
         */
        func getCity()
        
        /**
         传递城市信息
         
         - parameter cityId:   城市Id
         - parameter cityName: 城市名字
         */
        func postCity(_ cityId: Int, cityName: String)
        
        /**
         返回上一页
         */
        func finishView()
        
        
        func popTwoView()
        
        /**
         跳转商家地图
         
         - parameter lat:     <#lat description#>
         - parameter lng:     <#lng description#>
         - parameter name:    商家名称
         - parameter address: 地址
         */
        func locationMap(_ params: [AnyObject])
        
        func tolocationMap(_ params: [AnyObject])
        
        /**
         调用获取Token
         */
        func getToken()
        
        /**
         跳转设置
         */
        func setting()
        
        /**
         分享App给朋友
         */
        func shareApp()
        
        /**
         分享商铺给朋友(企业id)
         
         - parameter id: 企业Id
         */
        func shareShop(_ id: Int)
        
        /**
         跳转到编辑轮播图
         */
        func editCarousel()
        
        
        /**
         跳转到编辑企业
         
         - parameter id: 企业Id
         */
        func editCompany(_ id: Int)
        
        
        /**
         跳转到编辑商品
         
         - parameter productId: 商品Id
         */
        func editGoods(_ productId: Int)
        
        /**
         跳转发布商品
         */
        func publishGoods()
    }
    
    extension WebViewController {
        
        // MARK: - UIWebViewDelegate
        
        func webViewDidFinishLoad(_ webView: UIWebView) {
            
            context = webView.value(forKeyPath: JavaScriptContext_Key) as? JSContext
            
            // 以 JSExport 协议关联 native 的方法
            context?.setObject(self, forKeyedSubscript: "NativeObject" as (NSCopying & NSObjectProtocol)!)
        }
        
        
        
        // MARK: - JSMethodExport
        
        /**
         跳转到搜索页
         */
        override func locationSearch() {
            
            let instance = WebViewController.webInstance()
            instance.viewType = WebViewController.ViewType.SearchProduct
            
            // 主线程
            DispatchQueue.main.async(execute: {  [weak self] () -> Void in    
                self?.navigationController?.pushViewController(instance, animated: true)
            })
        }
        
        /**
         跳转到搜索结果页
         
         - parameter text: 关键字
         */
        override func locationResult(_ text: String) {
            let instance = WebViewController.webInstance()
            instance.viewType = WebViewController.ViewType.SearchProductResult
            if let text = text.addingPercentEscapes(using: String.Encoding.utf8) {
                instance.parameter = "?text=\(text)"
            }
            
            // 主线程
            DispatchQueue.main.async(execute: {  [weak self] () -> Void in
                self?.navigationController?.pushViewController(instance, animated: true)
            })
        }
        
        /**
         跳转城市选择页
         */
        override func locationCity() {
            // 跳转选择城市
            let instance = CityManagerViewController.cityManagerInstance()
            // 主线程
            DispatchQueue.main.async(execute: { [weak self] () -> Void in
                self?.navigationController?.pushViewController(instance, animated: true)
            })
        }
        
        /**
         跳转到头条详情
         
         - parameter newsId: 资讯Id
         */
        override func locationNewsDetaile(_ newsId: Int) {
            
            let instance = WebViewController.webInstance()
            instance.viewType = WebViewController.ViewType.NewsDetail
            instance.parameter = "?id=\(newsId)"
            
            // 主线程
            DispatchQueue.main.async(execute: {  [weak self] () -> Void in
                self?.navigationController?.pushViewController(instance, animated: true)
            })
        }
        
        /**
         跳转到企业详情
         
         - parameter enterpriseId: 企业Id
         */
        override func locationCompanyDetaile(_ enterpriseId: Int) {
            
            // 跳转企业详情
            let instance = DetailViewController.detailInstance()
            instance.isProductDetail = false
            instance.enterpriseId = enterpriseId
            
            // 主线程
            DispatchQueue.main.async(execute: {  [weak self] () -> Void in
                self?.navigationController?.pushViewController(instance, animated: true)
            })
        }
        
        /**
         调用获取商品Id列表
         */
        override func getProductIdList() {
            
            // 传递商品列表
            var productIds = [Int]()
            // 最近浏览
            if viewType == .RecentlyViewed {
                productIds = DataManager.sharedInstance.recentlyViewedProductIds
            }
            
            context?.evaluateScript("pTool.getProductIdList(\(productIds))")
        }
        
        /**
         清空浏览记录
         */
        override func clearHistory() {
            
            DataManager.cleanRecentlyViewed()
        }
        
        /**
         跳转搜索企业页
         */
        override func locationSearchCompany() {
            
            let instance = WebViewController.webInstance()
            instance.viewType = WebViewController.ViewType.SearchEnterprise
            
            // 主线程
            DispatchQueue.main.async(execute: {  [weak self] () -> Void in
                self?.navigationController?.pushViewController(instance, animated: true)
            })
        }
        
        /**
         跳转企业搜索结果页
         
         - parameter text: 关键字
         */
        override func locationCompanyResult(_ text: String) {
            let instance = WebViewController.webInstance()
            instance.viewType = WebViewController.ViewType.SearchEnterpriseResult
            if let text = text.addingPercentEscapes(using: String.Encoding.utf8) {
                instance.parameter = "?text=\(text)"
            }
            
            // 主线程
            DispatchQueue.main.async(execute: {  [weak self] () -> Void in
                self?.navigationController?.pushViewController(instance, animated: true)
            })
        }
        
    }
    
    展开全文
  • 最近项目需求,需要用到JavaScriptCore和WebKit,但是网上的资源有限,而且比较杂,都是一个博客复制...js调用swift controller的代码: import UIKit import WebKit class JSCallSwiftController: UIViewController {

    最近项目需求,需要用到JavaScriptCore和WebKit,但是网上的资源有限,而且比较杂,都是一个博客复制另外一个博客,都没有去实际敲代码验证,下面给大家分享一下我的学习过程。

    js调用swift

    controller的代码:

    import UIKit
    import WebKit
    
    class JSCallSwiftController: UIViewController {
        var webView = WKWebView()
        override func viewDidLoad() {
            super.viewDidLoad()
            setWebView()
        }
        func setWebView() {
            webView.frame = view.frame
            let config = WKWebViewConfiguration()
            
            //偏好设置
            config.preferences = WKPreferences()
            //字体
            config.preferences.minimumFontSize = 10
            //设置js跳转
            config.preferences.javaScriptEnabled = true
            //不自动打开窗口
            config.preferences.javaScriptCanOpenWindowsAutomatically = false
            //web内容处理池
            config.processPool = WKProcessPool()
            //js和webview内容交互
            config.userContentController = WKUserContentController()
            //注入js对象名称为appmodel,当js通过appmodel来调用
            //可以在wkscriptMessagehandler的代理中接收到
            config.userContentController.add(self, name: "AppModel")
            
            //webView
            webView = WKWebView(frame: view.bounds, configuration: config)
            view.addSubview(webView)
            let url = Bundle.main.url(forResource: "JSCallOC", withExtension: "html")
            webView.load(URLRequest(url:url!))
        }
    }
    
    extension JSCallSwiftController: WKNavigationDelegate {
        
    }
    
    extension JSCallSwiftController: WKScriptMessageHandler {
        func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            print(message.body)
        }
    }

    html里面要写入的代码:

    function log(n) {
            window.webkit.messageHandlers.AppModel.postMessage({body:n})
        }
    这样就很简单的实现了js调用swift的方法;

    如果转载请注明转于:AirZilong的博客

    展开全文
  • 1.首先创建一个代理方法继承JSExport里面实现的方法是js需要调用swift的方法@objc protocol JavaScriptSwiftDelegate: JSExport { func method(str:String) //带参数的 func method2()//不带参数 } 2.创建一个...

    1.首先创建一个代理方法继承JSExport

    里面实现的方法是js需要调用swift的方法

    @objc protocol JavaScriptSwiftDelegate: JSExport {
        func method(str:String) //带参数的
        func method2()//不带参数
    }
    

    2.创建一个model继承NSObject 并遵守上面的协议 实现协议要求的方法

    在model里面声明两个block便于参数的传出

    @objc class SwiftJavaScriptModel: NSObject, JavaScriptSwiftDelegate {
        weak var jsContext: JSContext?
        typealias customeBlock = (str: String )->Void
        typealias customeBlock2 = ()->Void
        var block:customeBlock?
        var block2:customeBlock2?
    
        func method(str: String) {
          block(str:str)
        }
        func method2(){
           block2()
        }
    }
    

    3.让swift 的webView实现UIWebViewDelegate,

    yourweb.delegate = self
    

    4.实现webVeiw的代理方法 在webViewDidFinishLoad的代理方法里进行交互

    let context=webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as? JSContext
     let model = SwiftJavaScriptModel()
     model.controller = self
     model.jsContext = context
     model.block = {
        //实现对应的操作 调用swift的方法
    }
     self.jsContext = context
     //下面的方法是把model 注入js里面  native是js里面方法的前缀 比如js里面的方法是
     //native.method()
     self.jsContext?.setObject(model, forKeyedSubscript: "native")
     let url = NSBundle.mainBundle().URLForResource("html路径", withExtension: "html")
     self.jsContext.evaluateScript(try?String.init(contentsOfURL: url!))
    
    展开全文
  • Apple在北京时间2014年6月3日凌晨发布了iOS8。这次更新在界面上看上去几乎没有修改,不过对于开发者,iOS8...本资源使用SWIFT实现了JS调用本地代码的2中方式,第二种方式是iOS8的新增SDK 本资源在XCode 6 beta 5中开发
  • 1.在Plugins文件夹中创建一个swift文件 说明:1.父类选CDVPlugin 2.在弹出的提示框中选择创建桥接文件 import Foundation @objc(XXSwiftPlugin) class XXSwiftPlugin: CDVPlugin { @objc func getContent...

    1.在Plugins文件夹中创建一个swift文件

    说明:1.父类选CDVPlugin
    2.在弹出的提示框中选择创建桥接文件

    import Foundation
    
    
    @objc(XXSwiftPlugin) class XXSwiftPlugin: CDVPlugin {
        
        
        @objc func getContent(command:CDVInvokedUrlCommand){
            var pluginResult:CDVPluginResult?
            
            let password = command.argument(at: 0) as? String;
            
            //CDVCommandStatus_OK
            pluginResult = CDVPluginResult(status: CDVCommandStatus_ERROR, messageAs: "综合处理后的结果是:swift_"+password!);
            
            self.commandDelegate.send(pluginResult, callbackId: command.callbackId);
    
        }
    
    }
    
    

    在这里插入图片描述

    2.在桥接文件中引入#import <Cordova/CDV.h>

    #import <Cordova/CDV.h>
    

    在这里插入图片描述

    3.在config.xml文件中加入

     <feature name="XXSwiftPlugin">
            <param name="ios-package" value="XXSwiftPlugin" />
        </feature>
    

    在这里插入图片描述

    4.在js文件中调用swift方法

    $(".toIos").on("click",function(){
        console.log("跳转到ios");
        var password = $(".toIos").html();
    
        function success(message){
            //CDVPluginResult(status: 后面的参数选CDVCommandStatus_OK会回调这个方法
            console.log("成功");
            console.log(message);
        }
    //message的值是:综合处理后的结果是:swift_跳到ios界面
        function fault(message){
             //CDVPluginResult(status: 后面的参数选CDVCommandStatus_ERROR会回调这个方法
            console.log("失败");
            console.log(message);
        }
    
        //这里参数的方法名要写getContentWithCommand,因为swift转oc的过程中会加WithCommand
        Cordova.exec(success,fault,"XXSwiftPlugin","getContentWithCommand",[password]);
    
    
    })
    

    在这里插入图片描述

    5.相关截图

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    参考博客:
    链接:
    Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)

    链接: 使用Swift开发Cordova插件遇到的问题

    展开全文
  • iOSJs交互是常见的需求,可对于新手或者所谓的高手而言,其实并不是那么简单明了。这里只介绍iOS7.0后出来的JavaScriptCore framework。关于JavaScriptCore本教程中所涉及到的几种类型: JSContext, JSContext是...
  • 写在前面 随着 App 开发日趋成熟,不少设计模式和开发流程都被应用其中,也跟着日趋成熟。其中一条相信很多人都听说过,不少项目也是这样做的: 用 H5 页面适配代替 Native App 原生开发语音开发的页面 ...
  • 在上一篇中我们介绍了Swift下WKWebView的基本使用方法,下面总结一下iOSjs交互的实现,最终的页面效果如下图所示: 其中,js有关代码如下: function navButtonAction(name,age){ document....
  • 此资源为 swiftJavaScript 之间方法的相互调用,相互传值。
  • 此代码为swiftJavaScript之间方法的相互调用及传值,调用方法分两种,传值方法分两种。 点击打开链接
  • WKWebView是苹果在iOS8新引进的框架,在做WKWebView的js交互的时候:一、WKWebView调用JS使用WKWebView的evaluateJavaScript 方法:举个例子如果js中有个name 方法调用js方法很简单只要webView.evaluateJavaScript(&...
  • 不多说,直接上代码: import UIKit import WebKit class SwiftCallJSController: UIViewController { var context = JSContext() var webView = WKWebView() override func viewDidLoad() { ...
  • 一、前言 在这个提倡敏捷开发和H5横行的年代,原生App内嵌入一些H5页面已经成为一种流行的...苹果也顺应了潮流,在iOS7中提供了JavaScriptCore框架用来与网页中的JS进行交互。还有Facebook推出的React Native,也给
  • 下载地址https://pan.baidu.com/s/1cJvEsY 转载于:https://www.cnblogs.com/liutaoboke/p/5882118.html
  • iOS: JS和Native交互的两种方法 背景: UIWebView: iOS 用来展示 web 端内容的控件。 1. 核心方法: - (NSString*)stringByEvaluatingJavaScriptFromString:(NSString *)script; script 就是 JS 代码,返回结果...
  • Android和IOS js和原生调用的注入的js代码
  • Apple Swift编程语言入门教程 作者: 日期: gashero 2014-06-03 目录 1 简介2 Swift入门3 简单值4 控制流5 函数与闭包6 对象与类7 枚举与结构 1 简
  • 文章目录1、首先创建`wkWebView`和`progressView`2、然后创建`WKWebViewConfiguration`可以进行自定义配置`WKWebView`3、紧接着开始创建`...、显示监听网页加载进度6、接收H5传值并处理7、`swift`原生完成之后...
  • 以太坊智能合约有各种各样的用例,但到目前为止,从你的iOS应用程序中调用它们非常困难。不过如果使用以太坊iOS开发套件和EtherKit,这种情况会改善很多,你可以立即开始使用。在本教程结束时,你将能够调用其ABI...
  • ios在外语中是打招呼的意思Swift开发iOS应用开发苹果最近宣布了一个改变iOS应用既往开发的一个大变化,一种取代Objective-C称为Swift的完全不同的编程语言。我正在努力学习这门新语言,而且我决定将按照我的学习进程...
1 2 3 4 5 ... 20
收藏数 4,737
精华内容 1,894
关键字:

ios js调用swift