美文网首页
【iOS】网页和OC交互

【iOS】网页和OC交互

作者: 修炼一颗真心 | 来源:发表于2016-12-08 18:02 被阅读0次

    引言:

    一般app内部都存在网页,有的是只需要展示即可,但很多都得实现对网页的操作,所以实现网页和OC交互就显得很重要。本文简单介绍了几种网页和OC交互的方法。

    1.通过WebView的代理来截取网页中按钮的方法来调用本地原生的代码(点击网页中的按钮调用本地的方法)。

    代码:

        web = [[UIWebView alloc]initWithFrame:CGRectMake(0,20,kScreenWidth, kScreenHeight-20)];
        web.backgroundColor = [UIColor whiteColor];
        web.delegate = self;
        [self.view addSubview:web];
        //self.webUrl 所要请求的地址
         NSURL*url = [NSURL URLWithString:self.webUrl];
         NSURLRequest*request = [NSURLRequest requestWithURL:url];
         [web loadRequest:request];
    
    
    #pragma mark ---WebViewDelegate
    
     - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
      NSString *url = request.URL.absoluteString;
        
        NSLog(@"~~~~~ %@",url);
    
    //baixun 
        NSString *scheme = @"baixun://";
        
        if ([url hasPrefix:scheme])
        {
            NSString *actionName = [url substringFromIndex:scheme.length];
    //将截取到的字符串转化成方法  
          [self performSelector:NSSelectorFromString(actionName) withObject:nil];
            
            return NO;
        }
        return YES;
    }
    
    //网页上按钮方法
    -(void)backuptoindex
    {
    //本地代码实现效果
    }
    
    HTML操作
    需要将href="" 改成href="baixun://backuptoindex"..
    即可截取到
    类似下图
    
    屏幕快照 2016-12-08 下午5.54.44.png
    3 JS里面通过对象调用方法

    参考:http://blog.csdn.net/lwjok2007/article/details/47058795#comments

    JSExport
    凡是添加了JSExport协议的协议,所规定的方法,变量等 就会对JS开放,我们可以通过JS调用到,
    若JS没有参数或者一个参数
    JS方法iosObject.iospay(ordId);
    OC对应的方法-(void)iospay:(NSString*)message;

    若js是多个参数的话,我们代理方法所有变量前的名字连起来要和JS的方法名字一样
    JS方法testobject.TestTowParameterSecondParameter('参数A','参数B') ;
    OC对应的方法//他有两个参数 那么我们的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成两段作为代理方法名(此处我们拆分为 TestTowParameter 和 SecondParameter ) 那么我们的代理方法就是 -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;

    创建一个类继承NSObject 并且规定一个协议

    #import <Foundation/Foundation.h>  
    #import <JavaScriptCore/JavaScriptCore.h>  
      
    //首先创建一个实现了JSExport协议的协议  
    @protocol TestJSObjectProtocol <JSExport>  
      
    //此处我们测试几种参数的情况  
    -(void)TestNOParameter;  
    -(void)TestOneParameter:(NSString *)message;  
    -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;  
      
    @end  
      
    //让我们创建的类实现上边的协议  
    @interface TestJSObject : NSObject<TestJSObjectProtocol>  
      
    @end  
    

    类的实现方法(.m文件)

    #import "TestJSObject.h"  
      
    @implementation TestJSObject  
      
    //一下方法都是只是打了个log 等会看log 以及参数能对上就说明js调用了此处的iOS 原生方法  
    -(void)TestNOParameter  
    {  
        NSLog(@"this is ios TestNOParameter");  
    }  
    -(void)TestOneParameter:(NSString *)message  
    {  
        NSLog(@"this is ios TestOneParameter=%@",message);  
    }  
    -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2  
    {  
       NSLog(@"this is ios TestTowParameter=%@  Second=%@",message1,message2);  
    }  
    @end  
    

    在webview加载完成后调用

    -(void)webViewDidFinishLoad:(UIWebView *)webView  
    {  
        //网页加载完成调用此方法  
          
        //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)  
        JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
          
        //第二种情况,js是通过对象调用的,我们假设js里面有一个对象 testobject 在调用方法  
        //首先创建我们新建类的对象,将他赋值给js的对象  
          
        TestJSObject *testJO=[TestJSObject new];  
        context[@"testobject"]=testJO;  
          
        //同样我们也用刚才的方式模拟一下js调用方法  
        NSString *jsStr1=@"testobject.TestNOParameter()";  
        [context evaluateScript:jsStr1];  
        NSString *jsStr2=@"testobject.TestOneParameter('参数1')";  
        [context evaluateScript:jsStr2];  
        NSString *jsStr3=@"testobject.TestTowParameterSecondParameter('参数A','参数B')";  
        [context evaluateScript:jsStr3];  
          
    }  
    

    网页端只需在按钮方法中调用此函数和传参数即可
    如图 要区分开此方法 使用对象调用


    9F09EB7E-F849-4CB4-85EF-C00D4EC484AC.png

    结语:

    网页和原生app混编可以很大的提升效率,缩短开发周期。所以网页和原生代码交互就显得重要,此文主要是本人个人的一些理解和想法,如有错误还望斧正。

    相关文章

      网友评论

          本文标题:【iOS】网页和OC交互

          本文链接:https://www.haomeiwen.com/subject/gdysmttx.html