iOS_WKWebView_Interaction entre nativo y JS_Puede obtener el valor de retorno nativo inmediatamente

  1. WKWebViewEl sistema viene con API
    referencia: https://blog.csdn.net/baihuaxiu123/article/details/51286109
  2. Utilice un marco de terceros WebViewJavascriptBridge, hay una introducción de uso detallada en el
    enlace WebViewJavascriptBridge
  3. Los métodos de interacción anteriores son asincrónicos y el JSvalor de retorno nativo no se puede obtener de inmediato. Ahora introduzca cómo obtener el valor de retorno nativo
    3.1 inmediatamente y siga el protocolo correspondiente
        _webView.UIDelegate = self;

3.2. Implementar el contenido del acuerdo

- (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, JSllamar al método nativo

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

Supongo que te gusta

Origin blog.csdn.net/FlyingKuiKui/article/details/98619845
Recomendado
Clasificación