给HTML5用js代码传值和拼ID的方法进行传值
一:通过js传值(ObjC代码调用javascript函数 )
[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