iOS 常见的JS与iOS交互的需求与解决方案

来源:互联网 发布:淘宝网触屏版官网 编辑:程序博客网 时间:2024/06/07 01:41

更新时间: 2017.3.15

1.网页上获取登录id信息
直接在网页地址后面拼接上用户信息
例如: http://host/mine.asp?phoneid=18739929333
2.获取网页上的所有图片链接
注入获取图片标签链接的JS方法 —> iOS调用JS方法获取到所有img标签下的链接(字符串形式)—> 分割字符串获取结果数组

    // 获取main    NSString *js_result = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByClassName(\"main\")"];    //这里是js,主要目的实现对url的获取    static  NSString * const jsGetImages =    @"function getImages(){\    var objs = document.getElementsByTagName(\"img\");\    var imgScr = '';\    for(var i=0;i<objs.length;i++){\    imgScr = imgScr + objs[i].src + '+';\    };\    return imgScr;\    };"; // 获取img标签    [webView stringByEvaluatingJavaScriptFromString:jsGetImages];//注入js方法    // img 标签    NSString *urlResurlt = [webView stringByEvaluatingJavaScriptFromString:@"getImages()"];    NSMutableArray *mUrlArray = [NSMutableArray arrayWithArray:[urlResurlt componentsSeparatedByString:@"+"]];    if (mUrlArray.count >= 2) {        [mUrlArray removeLastObject];    }    // mUrlArray is the result url array

3.JS调用iOS方法
获取JS调用时机—> 调用iOS方法
以 JavaScriptCore环境为例:
首先你需要在 - (void)webViewDidFinishLoad:(UIWebView *)webView
方法中获取到网页中的JS上下文, 然后再知道JS里面定义的函数有哪些的前提下定义OC命令回调:
Ex: 我这里网页中有JS函数:

      function scanClick() {          scan();      } 

对应完成加载的代理方法中我可以写:

- (void)webViewDidFinishLoad:(UIWebView *)webView{    // 获取到网页中的JS上下文    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];    // 定义对应JS方法被调用的时候需要进行的操作    context[@"scan"] = ^() {        NSLog(@"扫一扫啦");    };}

4.当检测到要访问某个网址的时候禁止访问或者做其他业务处理
webView代理方法中有一个决定web是否正常加载的方法:

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

在内部可以获取到将要访问的网址, 判断该网址, 如果符合条件就返回NO或者执行其他操作:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{    if ([[[request URL] absoluteString] isEqualToString:@"http://www.baidu.com"]) {        // return NO means webView will not start load request        return NO;        // or do something else        // ...    }    return YES;}
0 0
原创粉丝点击