首页 > 其他分享 >iOS的JS和OC代码互相调用

iOS的JS和OC代码互相调用

时间:2023-05-21 23:07:27浏览次数:62  
标签:调用 iOS OC JS NSString webView rect


1.JS调用OC代码

步骤1:以下是html页面,test1函数,并没有在页面中声明,而是在OC的UIWebView中绑定的


<html>
<head>
    <script>
        //test2(p)函数是准备 OC调用JS函数用的
        function test2(p){
            alert(p);
        }
    </script>
</head>
<body>
    <input type="button" value="点击-> test1()" οnclick="test1()" />
</body>
</html>


步骤2:控制器中的OC代码


#import "ViewController.h"
#import <JavaScriptCore/JavaScriptCore.h>

@interface ViewController ()<UIWebViewDelegate>
@property (nonatomic, strong) UIWebView *webView;
@end

@implementation ViewController

- (UIWebView *)webView
{
    if (!_webView) {
        CGRect rect = self.view.bounds;
        rect.size.height = rect.size.height * 0.8;
        rect.origin.y = rect.size.height;
        _webView = [[UIWebView alloc] initWithFrame:rect];
        _webView.delegate = self;
        [self.view addSubview:_webView];
    }
    return _webView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"static" ofType:@".html"];
    NSString *htmlString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    [self.webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:path]];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    //JS调用OC代码
    context[@"test1"] = ^{
        //由于JS参数是不固定的,所以取出来的就是个数组
        
        NSLog(@"JS已经成功调用OC的block了");
        NSArray *a = [JSContext currentArguments];
        for (NSString *s in a) {
            NSLog(@"s = %@", s);
        }
    };
    
    
    
    
    //OC调用JS函数
    [context evaluateScript:@"test2(\"OC调用JS函数\");"];
    
    
}

@end


在UIWebView加载完页面后的事件中,加入了JS的方法,使得当页面点击按钮事件时,OC的context[@"test1"]方法被调用了

通过evaluateScript:方法可以调用页面中的JS函数





2.使用一种特殊的方式来调用,遵守JSExport协议

例如:定义一个协议,有三个方法,由遵守类去实现,并且通过JS调用

新建一个类

头文件


#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>

@protocol ZRContextExportProtocol <JSExport>

//无参数方法
- (void)testNoParameter;

//有一个参数的方法
- (void)testOneParameter:(NSString *)params;

//有两个参数的方法
- (void)testTwo:(NSString *)params WithAddress:(NSString *)addr;

@end


@interface ZRContextExport : NSObject<ZRContextExportProtocol>

@end


源文件


#import "ZRContextExport.h"

@implementation ZRContextExport

- (void)testNoParameter
{
    NSLog(@"无参数,无返回值的OC函数");
}

- (void)testOneParameter:(NSString *)params
{
    NSLog(@"一个参数,无返回值得OC函数, params=%@", params);
}

- (void)testTwo:(NSString *)params WithAddress:(NSString *)addr 
{
    NSLog(@"有参,有返回值的的OC函数, params=%@, addr=%@", params, addr); 
}

@end


OC调用


#import "ViewController.h"
#import <JavaScriptCore/JavaScriptCore.h>
#import "ZRContextExport.h"

@interface ViewController ()<UIWebViewDelegate>
@property (nonatomic, strong) UIWebView *webView;
@end

@implementation ViewController

- (UIWebView *)webView
{
    if (!_webView) {
        CGRect rect = self.view.bounds;
        rect.size.height = rect.size.height * 0.8;
        rect.origin.y = rect.size.height;
        _webView = [[UIWebView alloc] initWithFrame:rect];
        _webView.delegate = self;
        [self.view addSubview:_webView];
    }
    return _webView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"static" ofType:@".html"];
    NSString *htmlString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    [self.webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:path]];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    
    //实例化ZRContextExport类,将该对象注入到JS中
    ZRContextExport *contextExport = [[ZRContextExport alloc] init];
    context[@"ZRContextObject"] = contextExport;
    
    //调用一个函数
    [context evaluateScript:@"ZRContextObject.testNoParameter()"];
    
    //注意这的OC函数名问题
    [context evaluateScript:@"ZRContextObject.testTwoWithAddress('第三个函数测试','北京市');"];
}

@end


JS调用


<html>
<head>
    <script>
         //调用的第二个函数
         function test1(){
             ZRContextObject.testOneParameter("第二个函数");
             ZRContextObject.testTwoWithAddress("第三个函数", "北京市");
         }
    </script>
</head>
<body>
    <input type="button" value="点击-> test1()" οnclick="test1()" />
</body>
</html>


好了,以上就是两种JS和OC的互相调用具体代码的实现,有问题的小伙伴儿可以在下面的额评论框提问,LZ一上线,就会回答的


标签:调用,iOS,OC,JS,NSString,webView,rect
From: https://blog.51cto.com/u_14062833/6320509

相关文章

  • Development cannot be enabled while your device is locked.
    问题:Developmentcannotbeenabledwhileyourdeviceislocked.分析原因:由于第一次连接MAC时,在iOS设备上点击了"不信任"选项,所以XCode8不能访问手机,所以才出现这个问题解决方法:英文好的同学,可以看到原文章http://stackoverflow.com/questions/26791477/xcode-device-locked-whe......
  • Reflection反射在iOS下使用Objective-C 具体如何使用
       反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调......
  • iOS的KeyChain(钥匙串)的使用
    iOS的KeyChain(钥匙串)的使用Keychain钥匙串存储账号和密码,还可以多个应用之间分享此账号和密码,只需要配置一项,如下一张图片-1.iOS的keychain提供一种安全保存信息的方式,-2.可以保存密码等数据,而且keychain中的数据不会因为你删除app而丢失,-3.你可以在重新......
  • iOS应用程序之间数据共享
    iOS应用程序间共享数据我们知道由于iOS有安全沙盒机制,应用之间是不能直接访问,但是Apple友好的提供了四种访问机制它们分别是:1.粘贴板      UIPasteboard2.自定义URLScheme   3.AppGroups4.钥匙串以下,就详细的说说它们的原理和具体怎么使用。......
  • iOS上的Popover
    ZRPopoverViewZRPopoverViewisapopoverviewthatpopUIViewwithalistofbuttonbycustomisingeventsandcontents.#1.IfyoulikeinvokethiseventsbyblocksothatChooseNo.1.#2.IfyoulikeinvokethiseventsbydelegatesothatChooseNo.2.Effect......
  • iOS应用通过地址(URL)安装
    目标:iOS应用通过URL地址来安装准备:1.bundleidentifier2.应用图标3.下载地址  完整的下载地址是itms-services://?action=download-manifest&url=https://www.yourdomain.cn/download/2.1.0-10637/test.116d7.56d82df.20170122.test.domain.cn.ipa.plist其中,配置test.116d7.56d8......
  • 14-Filter&Listener&Ajax&Axios&JSON
    1,Filter1.1Filter概述Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。Servlet我们之前都已经学习过了,Filter和Listener我们今天都会进行学习。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。如下图所示,浏览器可以访问服务器上的所有......
  • PaddleOCR+OpenCV实现文字识别步骤
    本期将介绍并演示PaddleOCR+Python+OpenCV实现车牌识别、身份证信息识别和车票信息识别的步骤与效果。介绍百度深度学习框架PaddlePaddle开源的OCR项目PaddleOCR近期霸榜github。使用测试后发现识别效果很好,对于简单的应用(车票车牌身份证等),直接用项目提供的模型即可使用。特殊应......
  • C# socket的基本理解
    博客园中看到的比较准确的socket理解个人学习用途博客部分内容摘抄自网络......
  • SpringIOC个人笔记
    上一章讲解了SpringBoot中的AutoConfiguration自动装配,而这一章就来讲讲自动装配时会用到的Spring三大特性之一的IOC控制反转。​ 使用过Spring的人都熟知,SpringIOC容器可以在对象生成或初始化时就直接将数据注入到对象中,如果对象A的属性是另一个对象B,还可以将这个对象B的引......