iOS_WKWebView_原生与JS的交互_可以立刻获取原生返回值

  1. WKWebView系统自带API
    参考:https://blog.csdn.net/baihuaxiu123/article/details/51286109
  2. 使用第三方框架WebViewJavascriptBridge,链接内有详细的使用介绍
    WebViewJavascriptBridge
  3. 以上交互方式都是异步的,JS无法立刻获取原生返回值。现在介绍如何立刻获取原生返回值
    3.1、遵循对应的协议
        _webView.UIDelegate = self;

3.2、实现协议的内容

- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler {
    NSError *err = nil;
    NSData *dataFromString = [prompt dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *payload = [NSJSONSerialization JSONObjectWithData:dataFromString options:NSJSONReadingMutableContainers error:&err];
    if (!err){
        NSString *type = [payload objectForKey:@"type"];
        if (type && [type isEqualToString:@"JSbridge"]){
            completionHandler([self getReturnValueWithPayload:payload]);
        }
    }
}
// 自定义方法
- (NSString *)getReturnValueWithPayload:(NSDictionary *)payload{
    NSString *returnValue = @"";
    NSString *functionName = [payload objectForKey:@"functionName"];
    NSDictionary *args = [payload objectForKey:@"arguments"]; // JS传入的值
    if ([functionName isEqualToString:@"getUserData"]) {
        NSDictionary *dictionary = @{@"userCode":@"1231231231" };
        returnValue = [self toJsonWithDictionary:dictionary];
    }
    return returnValue;
}
// 字典转化为JSON字符串
- (NSString *)toJsonWithDictionary:(NSDictionary *)dict{
    if (dict == nil || dict.allKeys.count == 0) {
        return @"";
    }else{
        NSError *parseError = nil;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&parseError];
        return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
}

3.3、 JS调用原生方法

// 声明
function getNativeDataFunction(functionName,parm = {}){
    var payload = {"type": "JSbridge", "functionName": functionName, "arguments": parm};
    return prompt(JSON.stringify(payload));
}
// 调用 nativeData即接收的返回值<JSON字符串>
var  nativeData =  getNativeDataFunction("getUserData");

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在iOS中,可以通过WKWebView与JavaScript进行交互。以下是一些常见的方法: 1. 使用JavaScriptCore框架:在iOS 7及以上版本中,可以使用JavaScriptCore框架来实现WKWebView与JS交互。具体实现步骤如下: (1)在iOS中创建一个JSContext实例,通过该实例可以操作JS环境。 (2)将JSContext实例设置到WKWebView的配置对象中。 (3)在JS中调用iOS方法时,可以通过window.webkit.messageHandlers对象进行调用,例如window.webkit.messageHandlers.methodName.postMessage(params)。 (4)在iOS中,可以通过WKScriptMessageHandler代理方法来接收JS传递的消息,并进行处理。 2. 使用WKScriptMessageHandler协议:在iOS 8及以上版本中,可以通过WKScriptMessageHandler协议来实现WKWebView与JS交互。具体实现步骤如下: (1)在WKWebView的配置对象中设置WKUserContentController的代理对象,并添加需要监听的JS方法名。 (2)在JS中调用iOS方法时,可以通过window.webkit.messageHandlers对象进行调用,例如window.webkit.messageHandlers.methodName.postMessage(params)。 (3)在iOS中,可以通过WKScriptMessageHandler代理方法来接收JS传递的消息,并进行处理。 无论使用哪种方法,都需要注意JS和iOS之间传递的数据类型和格式。通常,JS传递的是字符串类型的数据,在iOS中需要进行解析和转换。同时,为了避免安全问题,需要对JS传递的数据进行校验和过滤。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值