• [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]


    原理:

    1.JS调用OC

    每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许。

    因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等。

    // 网页中的每一个请求都会被触发
    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

    2.OC调用JS:通过webview执行js函数实现

    [webView stringByEvaluatingJavaScriptFromString:@"postStr();"];

    HTML:

    <html>
    <head>
            <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8"/>
            <title>HTML中用JS调用OC方法</title>
            <script>
                function getInfo(name)
                {
                    window.location = "/getInfo/"+name;
                }
    
                function postStr(){
                       return "I am script";
                  }
            </script>
    </head>
    <body>
        <h1 onclick="getInfo('openMyAlbum')">打开相册</h1>
        <br>
        <h1 onclick="getInfo('openMyCamera')">打开相机</h1>
    </body>
    </html>

    OC:

    #import "ViewController.h"
    
    @interface ViewController (){
        UIWebView *webView;
        UIActivityIndicatorView *activityIndicator;
    }
    
    @end
    
    @implementation ViewController
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.view  setBackgroundColor:[UIColor lightGrayColor]];
        webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,22, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)-66)];
        NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://dong14.sinaapp.com/testhtml.html"]];
        [self.view addSubview: webView];
        [webView loadRequest:request];
        [webView setDelegate:self];
        // Do any additional setup after loading the view, typically from a nib.
        
        UIButton *clkbtn=[[UIButton alloc]initWithFrame:CGRectMake(0, CGRectGetHeight(self.view.bounds)-44, 88, 44)];
        [clkbtn setTitle:@"调用JS" forState:UIControlStateNormal];
        [clkbtn setBackgroundColor:[UIColor redColor]];
        [clkbtn addTarget:self action:@selector(jsclk) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:clkbtn];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    // 网页中的每一个请求都会被触发
    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        
        // 每次跳转时候判断URL
        if([request.mainDocumentURL.relativePath isEqualToString:@"/getInfo/openMyAlbum"])
        {
            NSLog(@"openMyAlbum");
            [self openMyAlbum];
            return NO;
        }
        
        // 每次跳转时候判断URL
        if([request.mainDocumentURL.relativePath isEqualToString:@"/getInfo/openMyCamera"])
        {
            NSLog(@"openMyCamera");
            [self openMyCamera];
            return NO;
        }
        
        return YES;
    }
    
    -(void)openMyAlbum
    {
        UIImagePickerController *vc = [[UIImagePickerController alloc]init];
        vc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [self presentViewController:vc animated:YES completion:nil];
    }
    
    -(void)openMyCamera
    {
        UIImagePickerController *vc = [[UIImagePickerController alloc]init];
        vc.sourceType = UIImagePickerControllerSourceTypeCamera;
        [self presentViewController:vc animated:YES completion:nil];
    }
    
    -(void)jsclk{
        NSString *str = [webView stringByEvaluatingJavaScriptFromString:@"postStr();"];
        NSLog(@"JS返回值:%@",str);
    }
    
    - (void) webViewDidStartLoad:(UIWebView *)webView
    {
        //创建UIActivityIndicatorView背底半透明View
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 2,  CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)-66)];
        [view setTag:108];
        [view setBackgroundColor:[UIColor blackColor]];
        [view setAlpha:0.5];
        [self.view addSubview:view];
        
        activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
        [activityIndicator setCenter:view.center];
        [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite];
        [view addSubview:activityIndicator];
        
        [activityIndicator startAnimating];
        NSLog(@"webViewDidStartLoad");
    }
    - (void) webViewDidFinishLoad:(UIWebView *)webView
    {
        [activityIndicator stopAnimating];
        UIView *view = (UIView*)[self.view viewWithTag:108];
        [view removeFromSuperview];
        NSLog(@"webViewDidFinishLoad");
        
    }
    - (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
    {
        [activityIndicator stopAnimating];
        UIView *view = (UIView*)[self.view viewWithTag:108];
        [view removeFromSuperview];
        NSLog(@"didFailLoadWithError:%@", error);
    }

    github:https://github.com/rayshen/OChybridTest

  • 相关阅读:
    MIUI6&7桌面角标开源代码简介
    竞品技术三瞥安装包的大小
    java synchronized详解
    挖掘微信Web版通信的全过程
    ios app的真机调试与发布配置
    Adapter优化方案的探索
    Gradle学习目录总结
    Eclipse混淆文件导入Android Studio Gradle编译报input jar file is specified twice
    Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
    对于android拦截短信的一些疑问
  • 原文地址:https://www.cnblogs.com/rayshen/p/4560728.html
Copyright © 2020-2023  润新知