给HTML5用js代码传值和拼ID的方法进行传值

本文介绍了两种在iOS应用中通过UIWebView向HTML5页面传递值的方法:一是通过JavaScript函数调用传值,二是通过拼接URL参数。在第一种方法中,使用`stringByEvaluatingJavaScriptFromString`来执行JS代码,并确保该方法在主线程中执行。第二种方法是直接在URL中附加参数,前端开发者可以解析URL获取参数。同时,文章还展示了监听UIWebView点击事件并执行相应前端方法的实现细节。

HTML5用js代码传值和拼ID的方法进行传值


一:通过js传值(ObjC代码调用javascript函数 )

         //例如给html5 传商品的id

 [myWebViewstringByEvaluatingJavaScriptFromString:@"shopPage"];

 JSContext *context = [myWebView                     valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    context[@"shopPage"] = ^() {

        

        NSLog(@"%d", [self.shopIdintValue]);

        return [self.shopIdintValue];

    };

以上代码直接赋值到项目中shopPage是与前端开发者商议好的函数名称,前端开发者需要调取这个函数进行获取值,根据自己的项目自行更改函数名称即可

    stringByEvaluatingJavaScriptFromString此方法最好放在主线程当中否则在iOS9之下会直接闪退

二:通过拼参数传值

 这种方法对于iOS开发者来说非常简单只需要在给UIWbview网址的时候在网址上附加参数就行了

例如:

    

  myWebView = [[UIWebViewalloc]initWithFrame:CGRectMake(0,0, SCREEN_WIDTH,SCREEN_HEIGHT -64 -  50)];

    [self.viewaddSubview:myWebView];

    [myWebViewloadRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:[NSStringstringWithFormat:@"%@?shopID%@",goodsDetialUrlString,self.shopId]]]];

这样商品的ID也就传递给前端开发者了前端只需要写个方法进行截取就可获取到参数的值


三:监听UIWebview被点击调用的方法


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    NSString * string = [[requestURL]absoluteString];

    

//这个地方是根剧前端返回的字符串自行写对反悔的字符穿截取下边只是我的一个例子

if ([@"rrcc"isEqualToString:request.URL.scheme]) {

        NSRange rangs = [stringrangeOfString:@":"];

        NSString * method = [request.URL.absoluteStringsubstringFromIndex:rangs.location +1];

        

        NSArray * arr = [methodcomponentsSeparatedByString:@"?"];

        NSString * methods = arr.firstObject;

        methods = [methodsstringByReplacingOccurrencesOfString:@"_"withString:@":"];

        NSArray * comarr = [arr.lastObjectcomponentsSeparatedByString:@"&"];

        NSString * com = comarr.firstObject;

        NSString * coms = comarr.lastObject;

        

        NSLog(@"------------%@,,,, %@,     %@", methods, com, coms);

        SEL sel =NSSelectorFromString(methods);

        NSArray * comArray =@[com, coms];

        NSLog(@"%@#", comArray);

//这两个方法只要调用一下会自动寻找前端需要调用的方法进行执行,避免热更新的问题

        if ([selfcanRunToSelector:sel]) {

            [selfrunSelector:sel withObjects:comArray];

        }

        returnNO;

    }

    returnYES;

}

-(BOOL)canRunToSelector:(SEL)aSelector{

    unsigned int methodCount =0;

    Method  *methodList = class_copyMethodList([self class],&methodCount);

    NSString *selectorStr = NSStringFromSelector(aSelector);

    

    BOOL result = NO;

    for (int i = 0; i < methodCount; i++) {

        Method temp = methodList[i];

        const char* selectorName =sel_getName(method_getName(temp));

        NSString *tempSelectorString = [NSString stringWithUTF8String:selectorName];

        if ([tempSelectorString isEqualToString:selectorStr]) {

            result = YES;

            break;

        }

    }

    free(methodList);

    return result;

}


- (id)runSelector:(SEL)aSelector withObjects:(NSArray *)objects {

    NSMethodSignature *methodSignature = [self methodSignatureForSelector:aSelector];

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];

    [invocation setTarget:self];

    [invocation setSelector:aSelector];

    

    NSUInteger i = 1;

    

    if (objects.count) {

        for (id object in objects) {

            id tempObject = object;

            [invocation setArgument:&tempObject atIndex:++i];

        }

    }

    [invocation invoke];

    

    if (methodSignature.methodReturnLength) {

        id value;

        [invocation getReturnValue:&value];

        return value;

    }

    return nil;

}



如上所示的解析出来点击的是哪个方法将前端xu'yao



 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值