iOS 原生控件和HTML5的交互

其实在写这篇文章的时候也不是特别的明白,还是有点模糊的,但是我写出来梳理一下思路,也可以为别人提供一下借鉴。

在iOS 开发中用到网页就必须知道UIWebView。下面先介绍一下UIWebView

    UIWebView *webView = [[UIWebViewalloc]initWithFrame:[UIScreenmainScreen].bounds];

    webView.backgroundColor = [UIColorwhiteColor];

    webView.delegate =self;

    [webView loadRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:@"https://www.baidu.com"]]];

    [self.viewaddSubview:webView];

遵守UIWebView的代理 UIWebViewDelegate  代理里有四个方法:

// 每次加载网页都会调用

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

  NSString *strUrl = request.URL.absoluteString;// 在这个方法里可以获取每次刷新网页的绝对字符串,可以根据字符串进行你需要的操作。


}

// 网页开始加载

- (void)webViewDidStartLoad:(UIWebView *)webView;

// 网页加载完成

- (void)webViewDidFinishLoad:(UIWebView *)webView;

// 网页加载错误

- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullableNSError *)error;

// ---------------------- 开始代码实现监听网页内容 ------------------------

在@interface 接口文件里添加属性

@property (nonatomic,strong)JSContext *context;

在头文件导入  #import <JavaScriptCore/JavaScriptCore.h>


// 在网页加载完成的代理方法里实现

-(void)webViewDidFinishLoad:(UIWebView *)webView{


    // htmltitle导航栏的 title

    self.title = [webViewstringByEvaluatingJavaScriptFromString:@"document.title"];


   //监听整个js里面的内容

    self.context = [webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];


    //打印异常

    self.context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue){


        NSLog(@"%@",exceptionValue);

    

    };


    // block的形式要避免循环引用 object

    __blocktypeof(self) loginview =self;

    self.context[@"starupLogin"] = ^(NSString *str){// @"starupLogin" 这是网页和iOS端开发约定的字段,一旦发现就触发方法

        [[NSOperationQueuemainQueue] addOperationWithBlock:^{


        [loginview login]; // 在 - (void)login{} 方法里实现调用原生控件的登录操作。

        }];

    };

    

}


// 在上面实现网页和原生控件的交互,但是在实际的开发中我们会遇到点击网页控件会刷新网页,在我们返回的时候可能需要返回网页刷新后的上一页,这个时候我们就不能仅仅操作原生控件返回了,因为webView还是同一个,只是网页刷新了。在这里 OC语言给我们封装好了方法我们只用直接调用就可以了。

        if (webView.canGoBack) { 

            [webViewgoBack];

        }else{

            

            [self.navigationControllerpopViewControllerAnimated:YES]; 

        }


//  canGoBack 是否可以返回,如果返回YES则可以返回,如果返回NO则不可以返回;调用[webView goBack]方法返回网页的上一次刷新。

// canGoForward 是否可以前进,如果返回YES则可以前进,如果返回NO则不可以前进;调用[webView goForward]方法进入到上次返回的页面。


在网页里一般都会有缓存 [NSURLCachesharedURLCache] removeAllCachedResponses]; 此方法可以清除网页的缓存。

以上就是我开发应用,用到的网页和原生控件交互的总结,希望能对你有所启发!





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值