ios-用JavaScriptCore js调用OC

问题描述

用JavaScriptCore js调用OC
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>失败</title>
    <script type="text/javascript">
        function redirectNative() {
            bluewhale.funTo("FAIL");
        }
    </script>
    <style>
        .msg {
            width: 100%;
            margin-top: 30%;
            font-size: 30px;
            font-weight: lighter;
            text-align: center;
        }

        .btn {
            margin-top: 60%;
            background-color: #1478f0;
            position: relative;
            height: 45px;
            bottom: 20%;
            left: 10%;
            width: 80%;
            font-size: 20px;
            color: white;
            font-weight: lighter;
            border-radius: 5px;
        }
    </style>
</head>
<body>
<div>
    <div class="msg">${message}</div>
</div>
<div><img src=""/></div>
<button class="btn" onclick="redirectNative()">返回</button>
</body>
</html>

解决方案

iOS js oc相互调用(JavaScriptCore)
iOS js oc相互调用(JavaScriptCore)
iOS js oc相互调用(JavaScriptCore)

解决方案二:

  1. 如果你是要调用redirectNative(),哪么简单了
    在 - (void)webViewDidFinishLoad:(UIWebView *)webView方法里:
    JSContext *jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    jsContext[@"redirectNative"] = ^() {
    dispatch_async(dispatch_get_main_queue(), ^{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"js_redirectNative调用OC" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
    [alertView show];
    });
    };

  2. 如果你是想实现 bluewhale.funTo("FA1IL"); 调用OC,哪么就稍微复杂点

    (1)协议
    @protocol TestProtocol

                - (void)funTo:(NSString *)some; //这个方法与你js方法同名,同个数的参数
    
        @end
    
    (2)
    

    @interface TestModel()

        @end
    
        @implementation TestModel
    
        - (void)funTo:(NSString *)some
        {
    

    dispatch_async(dispatch_get_main_queue(), ^{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:some delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
    [alertView show];
    });
    }
    @end

    (3) 还是在- (void)webViewDidFinishLoad:(UIWebView *)webView方法里:
    
        JSContext *jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
        //如果是funTo调用
        TestModel *tm = [TestModel new];
        jsContext[@"bluewhale"] = tm;
    

    你可以根据这些自己在整理封装下

解决方案三:

卧槽,版式乱了点,有点强迫症,你可以根据这些自己再封装下。

  • 如果你是要调用redirectNative(),哪么简单了
    在 - (void)webViewDidFinishLoad:(UIWebView *)webView方法里:

    JSContext *jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    jsContext[@"redirectNative"] = ^() {
        dispatch_async(dispatch_get_main_queue(), ^{
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"js_redirectNative调用OC" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                [alertView show];
        });
    };
    
  • 如果你是想实现 bluewhale.funTo("FA1IL"); 调用OC,哪么就稍微复杂点
    (1)协议
                    @protocol TestProtocol
        - (void)funTo:(NSString *)some; //这个方法与你js方法同名,同个数的参数
                    @end
    
    (2) 模型
                        @interface TestModel()
    
                        @end
    
                        @implementation TestModel
    
                        - (void)funTo:(NSString *)some
                        {
                                    dispatch_async(dispatch_get_main_queue(), ^{
                                                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:some delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                                                [alertView show];
                                    });
                        }
                    @end
    
    (3) 还是在- (void)webViewDidFinishLoad:(UIWebView *)webView方法里:
    
                    JSContext *jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
                        //点击按钮可以看
                        TestModel *tm = [TestModel new];
                        jsContext[@"bluewhale"] = tm;
    
时间: 2024-10-27 18:51:00

ios-用JavaScriptCore js调用OC的相关文章

iOS开发之用javascript调用oc方法而非url_IOS

先来看看如何在项目中的webview上面点击一个按钮,就能达到调用oc代码 上面的这个页面是webview里面嵌套的一个项目的网页,打印订单点击之后(点击事件是一个js方法),需要调用oc里面集成好的蓝牙打印机功能,来完成打印. 所以这里只能用js代码来直接调用oc代码. 1.首先创建一个iOS类,因为这里一般都需要安卓端做一套,iOS端做一套,所以一般这样命名以示区别 .h #import <Foundation/Foundation.h> #import <JavaScriptCor

WKWebView与Js实战(OC版)

前言 上一篇专门讲解了WKWebView相关的所有类.代理的所有API.那么本篇讲些什么呢?当然是实战了! 本篇文章教大家如何使用WKWebView去实现常用的一些API操作.当然,也会有如何与JS交互的实战. 如果还没有阅读过WKWebView精讲(OC版),请先阅读,不然有可能看不懂下面所讲的内容. 效果图 通过本篇文章,至少可以学习到: OC如何给JS注入对象及JS如何给IOS发送数据 JS调用alert.confirm.prompt时,不采用JS原生提示,而是使用iOS原生来实现 如何监

解决方案-JS和OC的交互(凑字数凑字数)

问题描述 JS和OC的交互(凑字数凑字数) 各位大神,你们好. 我现在想达到在JS中调用Objective-C中的方法,来传数据. 效果为只需要在JS页面添加一个对象就可以调用Objective-C的方法,其他的什么都不用. 方案1:使用javascriptcore,但是我发现它是把JS加载进context环境里面运行,而不是把值传到JS页面去,所以这个方法不行.另外,我只看到了OC调用JS方法的例子,没看到其他的例子. 方案2:是使用window对象, //通过此回调,将self传递给JS环境

ios-IOS 如何在C里调用OC对象方法

问题描述 IOS 如何在C里调用OC对象方法 在做一个物联网的东东,接口程序是C语言的,要调用我写的一个类里的蓝牙连接收发方法,然后返回对应的状态值,求教要如何在一个C语言的类里调用OC类的方法,用得xcode6.1 解决方案 在C语言写的代码里,引入OC类需要的类库,然后声明你需要的OC里的类对象就可以了,oc本身就是C的一个超集,是兼容C的

ios-cordova在IOS下Cordova程序调用相机黑屏

问题描述 cordova在IOS下Cordova程序调用相机黑屏 安装CORDOVA CAMERA插件后,拍照时屏幕会变黑,看不到被拍摄的景象.但能正常拍照下来.按home键切换到桌面后重新进入应用就不会黑屏.谁遇到过类似问题?JS调用相机代码: navigator.camera.getPicture(onSuccess onFail { quality: 50 destinationType:navigator.camera.DestinationType.FILE_URI correctOr

IOS游戏开发之五子棋OC版_IOS

先上效果图 - 功能展示 - 初高级棋盘切换效果 实现思路及主要代码详解 1.绘制棋盘 利用Quartz2D绘制棋盘.代码如下 - (void)drawBackground:(CGSize)size{ self.gridWidth = (size.width - 2 * kBoardSpace) / self.gridCount; //1.开启图像上下文 UIGraphicsBeginImageContext(size); //2.获取上下文 CGContextRef ctx = UIGraph

ios开发html js提交文件获取不到文件 受限于ios沙盒机制

问题描述 ios开发html js提交文件获取不到文件 受限于ios沙盒机制 录音文件存于_doc文件夹下,可以播放,但是提交的时候受限于ios的沙盒机制保护,无法访问,如何越过这个机制,或者存于一个不受限的文件夹 解决方案 不明白你说的 提交 是怎么个操作.是要播放吗?还是要上传?

activex-JSP页面用js调用ActiveX使用摄像头

问题描述 JSP页面用js调用ActiveX使用摄像头 这是一个VB程序,调用了一个TesoSeeu.ocx打开摄像头拍照的程序http://pan.baidu.com/s/1sjyyo0H 现在我想在JSP页面上使用这个ocx,可以吗? 求各位大神给一个例子 这个ocx好像是拍照后把数据保存在内存,js没法调用了吧? 解决方案 可以,不过需要预先安装这个控件到客户端计算机,并且在浏览器的安全设置中允许.而且不是所有浏览器都支持ocx,只能用IE或者兼容的浏览器. 解决方案二: 控件有暴露接口给

js组件 jsp问题-jsp通过js调用另一个jsp

问题描述 jsp通过js调用另一个jsp 一个jsp调用通过js调用另一个jsp界面 界面出来了 但是内容无法显示 永远是一个Loading... 解决方案 你怎么调用的,那个页面又是怎么实现的.如果代码不是你写的,谁写的问谁.你完全一窍不通. 解决方案二: 永远是一个Loading... 如果页面确实已经调用成功,而一直显示Loading...,说明你新打开的页面有问题,而不是你的js有问题. 解决方案三: 在JS中调用JSP中的变量一个jsp引入另一个jspjsp button事件调用js