iOS中html传数据给原生
16lz
2021-01-22
我喜欢简单,所以就简单地说。
html是一个规则,包含的东西有点多,我只说一种,就是点击web也上的一个含有url的按钮或者超链接,这个url里带有数据,然后本地解析出来这些数据。
首先要准备一个html文件,或者是从后台请求的html文件。还要准备一个js文件,如果嫌麻烦,可以不用。我的处理方法是在原生里面简单的注入了一句js。
<body> <br /> <a href="test://login?name=lizhongyuan&password=123456">点击链接</a> </body>
在html里面加上这一句,如果公司有懂html的,让他帮着写,不复杂。
_webviewTest = [[UIWebView alloc]initWithFrame:CGRectMake(0, 64, WIDTH, HEIGHT-64)]; _webviewTest.delegate = self; [self.view addSubview:_webviewTest];
原生里面就是add一个uiwebview。
NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; NSString *path = [[NSBundle mainBundle] pathForResource:@"testhtml" ofType:@"html"]; NSString *html = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; [_webviewTest loadHTMLString:html baseURL:baseURL];
我这里是在本地加载这个html,当然如果你是从网络获取的,直接加载就可以了。目的就是把这个web页面展示出来。如果你的html或者css或者js没有展示出来或者没有执行,自行查资料。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = [request URL]; if([[url scheme] isEqualToString:@"test"]) { //处理JavaScript和Objective-C交互 if([[url host] isEqualToString:@"login"]) { //获取URL上面的参数 NSDictionary *params = [self dictionaryFromQuery:url.absoluteString usingEncoding:NSUTF8StringEncoding]; // BOOL status = [self login:[params objectForKey:@"name"] password:[params objectForKey:@"password"]]; NSLog(@"%@",params); if(/* DISABLES CODE */ (1)) { //调用JS回调 [webView stringByEvaluatingJavaScriptFromString:@"alert('登录成功!')"]; } else { [webView stringByEvaluatingJavaScriptFromString:@"alert('登录失败!')"]; } } return NO; } return YES; }
这个方法是加载html以后响应html里面的点击事件。这里就会获得href,剩下的就是解析这个href。
- (NSDictionary*)dictionaryFromQuery:(NSString*)query usingEncoding:(NSStringEncoding)encoding { NSCharacterSet* delimiterSet = [NSCharacterSet characterSetWithCharactersInString:@"?&;"]; NSMutableDictionary* pairs = [NSMutableDictionary dictionary]; NSScanner* scanner = [[NSScanner alloc] initWithString:query]; while (![scanner isAtEnd]) { NSString* pairString = nil; [scanner scanUpToCharactersFromSet:delimiterSet intoString:&pairString]; [scanner scanCharactersFromSet:delimiterSet intoString:NULL]; NSArray* kvPair = [pairString componentsSeparatedByString:@"="]; if (kvPair.count == 2) { NSString* key = [[kvPair objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:encoding]; NSString* value = [[kvPair objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:encoding]; [pairs setObject:value forKey:key]; } } return [NSDictionary dictionaryWithDictionary:pairs]; }
这个方法是切割字符串,把“?”“&”“;”分割的字符串拿出来,然后把用等号配对的两个值,以KVO的模式组成键值对,最后存进字典,返回字典。
if(/* DISABLES CODE */ (1)) { //调用JS回调 [webView stringByEvaluatingJavaScriptFromString:@"alert('登录成功!')"]; } else { [webView stringByEvaluatingJavaScriptFromString:@"alert('登录失败!')"]; }
这句是执行JS,并没有卵用,后面我在研究研究这里怎么搞。
更多相关文章
- 如何使用Angular.js从json文件中使用id获取特定数据
- 如何从一个节点生成exe文件。js应用?
- zTree.js 异步加载地区例子
- 在批处理文件中使用JSMin
- 使用HTML文件中的React调用.js文件中的Javascript函数
- 在JavaScript中进行文件处理,第四部分:对象URLs
- [转]在网页中加入声音文件,并且用JavaScript对其进行播放控制
- 加载外部站点并更改其可视化
- 基于缓冲区数据创建文件