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

js调用oc并获得返回值

在JavaScript(JS)与Objective-C(OC)的交互中,通常是在iOS应用开发中使用WebView(如WKWebView)时遇到的场景。JS调用OC并获得返回值的过程一般通过以下方式实现:

基础概念

  1. JS与OC交互:在iOS中,WebView提供了JS与OC之间通信的桥梁。JS可以通过特定的调用方式触发OC中的方法,并且可以接收OC返回的数据。

实现方式

  1. WKWebView配置
    • 使用WKWebViewConfiguration来配置WebView。
    • 设置WKScriptMessageHandler来处理从JS发送过来的消息。
  • JS调用OC
    • JS通过window.webkit.messageHandlers.<handlerName>.postMessage(<message>)来调用OC中的方法。
    • <handlerName>是你在OC中设置的处理器名称。
    • <message>是传递给OC的消息,可以是字符串、数字或JSON对象。
  • OC处理JS调用并返回值
    • 在OC中实现WKScriptMessageHandler协议的userContentController:didReceiveScriptMessage:方法来接收JS的消息。
    • 处理完消息后,可以通过设置回调或者使用其他机制将结果返回给JS。

示例代码

OC端

代码语言:txt
复制
// ViewController.m
#import "ViewController.h"
#import <WebKit/WebKit.h>

@interface ViewController () <WKScriptMessageHandler>
@property (nonatomic, strong) WKWebView *webView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    WKUserContentController *userContentController = [[WKUserContentController alloc] init];
    [userContentController addScriptMessageHandler:self name:@"nativeHandler"];
    configuration.userContentController = userContentController;
    
    self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
    [self.view addSubview:self.webView];
    
    NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
    NSString *htmlString = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
    [self.webView loadHTMLString:htmlString baseURL:[NSBundle mainBundle].resourceURL];
}

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    if ([message.name isEqualToString:@"nativeHandler"]) {
        NSDictionary *body = message.body;
        NSString *action = body[@"action"];
        if ([action isEqualToString:@"getInfo"]) {
            NSDictionary *response = @{@"result": @"Hello from OC!"};
            NSError *error;
            NSData *jsonData = [NSJSONSerialization dataWithJSONObject:response options:0 error:&error];
            NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
            [self.webView evaluateJavaScript:[NSString stringWithFormat:@"receiveInfoFromOC('%@')", jsonString] completionHandler:nil];
        }
    }
}

@end

JS端

代码语言:txt
复制
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>JS调用OC示例</title>
    <script>
        function callNative() {
            window.webkit.messageHandlers.nativeHandler.postMessage({action: "getInfo"});
        }

        function receiveInfoFromOC(info) {
            alert(info.result);
        }
    </script>
</head>
<body>
    <button onclick="callNative()">调用OC方法</button>
</body>
</html>

优势

  • 灵活性:JS和OC可以互相调用,实现复杂的交互逻辑。
  • 动态性:可以在运行时动态地调用OC方法,不需要重新编译应用。

应用场景

  • 混合开发:在混合应用开发中,可以使用JS来处理前端逻辑,而OC处理后端逻辑。
  • 动态内容更新:可以在不刷新页面的情况下,通过JS调用OC来更新页面内容。

注意事项

  • 安全性:在JS和OC交互时,需要注意数据的安全性和有效性,防止注入攻击。
  • 性能:频繁的JS和OC交互可能会影响应用的性能,应合理使用。

通过上述方式,JS可以调用OC的方法并接收返回值,实现前后端的无缝对接。

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

相关·内容

  • JS中函数的本质,定义、调用,以及函数的参数和返回值

    ,而不是等到1秒之后 函数可以作为返回值使用: function fn(){ return function(){ console.log("fn中的fn"); } } //调用...里层可以访问外层的函数,外层不能访问里层的函数 代码块中定义的函数: 由于js中没有块级作用域,所以依然是处于全局作用域中 都会出现预解析中函数被提前声明 if(true){ function fn1...: 构造函数命名时一般首字母大写 调用时用new+函数名,返回值是一个对象 function Person(){ } var obj=new Person(); js中内置的构造函数,常见的有: Object...() new Object() Array() new Array() 通过new关键字来调用 用构造函数的方式定义对象和数组,并添加内容 var person=new Object(); person.name...return: 表示函数结束 将值返回 什么可以做返回值: 直接return ,返回值是undefined 数字 字符串 :alert() 输出的都是字符串,会默认调用.toString() 方法 布尔值

    17.6K20

    JSPatch 实现原理详解

    ()) view.setAlpha(0.5) 引入 JSPatch 后,可以通过以上 JS 代码创建了一个 UIView 实例,并设置背景颜色和透明度,涵盖了 require 引入类,JS 调用接口,消息传递...通过调用 JSContext 定义的方法把数据传给 OC,OC 通过返回值传会给 JS。...5.类型转换 JS 把要调用的类名/方法名/对象传给 OC 后,OC 调用类/对象相应的方法是通过 NSInvocation 实现,要能顺利调用到方法并取得返回值,要做两件事: a.取得要调用的 OC...b.根据返回值类型取出返回值,包装为对象传回给 JS。...另外 OC 为类新增方法需要知道各个参数和返回值的类型,需要在 JS 定一种方式把这些类型传给 OC 才能完成新增方法,比较麻烦。

    3.6K80
    领券