>

实现代理方法澳门博发娱乐官网,只要写一份网

- 编辑:澳门博发娱乐官网 -

实现代理方法澳门博发娱乐官网,只要写一份网

-  closePopup { if  { NSURL *url = wvPopUp.request.URL; NSString *surl = url.absoluteString; NSUInteger pos = [surl rangeOfString:@"?"].location; NSString *paras = @""; if (pos != NSNotFound && pos < [surl length]-1) { paras = [surl substringFromIndex:pos + 1]; } NSString *js = [NSString stringWithFormat: @"onClosePopo;",paras ]; __unused NSString *jsOverrides = [_browser stringByEvaluatingJavaScriptFromString:js]; [wvPopUp removeFromSuperview]; wvPopUp = nil; } if(btnClosePopup){ [btnClosePopup removeFromSuperview]; btnClosePopup = nil; } if(vwPopUpContainer){ [vwPopUpContainer removeFromSuperview]; vwPopUpContainer = nil; }}

iOS7之前,Objective-C调用JavaScript代码

iOS7从前,Objective-C调用JavaScript的办法只有一种,便是经过UIWebView对象的stringByEvaluatingJavaScriptFromString:方法。

  • stringByEvaluatingJavaScriptFromString:方法只好在主线程执行
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
        [self.webView stringByEvaluatingJavaScriptFromString:@"var javascript = 1 + 2"];
});  
  • 通过stringByEvaluatingJavaScriptFromString:主意能够省略地调用系统提供的JavaScript方法
- (void)webViewDidFinishLoad:(UIWebView *)webView{
    NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
    NSLog(@"%@", title);
}

在头里的一篇小说《iOS开发——从UIWebView说起》中,介绍了UIWebView的正规用法以及注意事项,那篇文章将深远介绍一些办事中恐怕须要的高档次和品级用法。

二、原理

  在iOS中,本地调用Javascript语言,是透过UIWebView中的实例方法stringByEvaluatingJavaScriptFromString:来促成的,该情势通过字符串对象的样式传播JS代码。

[webView stringByEvaluatingJavaScriptFromString:@"Math.random();"];

   而JS调用本地的代码,则并不曾现存的API,而是供给直接地通过一些方式来贯彻。大家选取UIWebView的代办方法,当UIWebView发起的具有网络恳求,都得以经过delegate函数在Native层得到照看。那样,大家就能够在UIWebView内发起三个自定义的互联网央求,比方:'wvjbscheme://__BRIDGE_LOADED__'。于是在UIWebView的delegate函数中,大家拦截url,只要发觉是大家自定义的url,就不开展内容的加载,转而实施相应的调用逻辑。

一、综述

  现在数不清的使用都会在各样阳台上发表,所以重重顺序猿们都从头采纳Hybrid App的设计格局。正是在app上停放网页,只要写一份网页代码,就足以跑在不一致的系统上。在iOS中,app多是经过WebView来加载网页,由于效果供给等原因,代码中少不得要和跟网页交互。

- webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ NSString* requestURL = request.URL.absoluteString; if ([requestURL rangeOfString:@"back://"].location == 0) { [self closePopup]; return NO; } else if ([requestURL hasPrefix: @"open://"]){ NSString *newUrl = [requestURL stringByReplacingOccurrencesOfString:@"open://" withString:@""]; NSURLRequest *newRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:newUrl]]; UIWebView *wv = [self popUpWebview]; [wv loadRequest:newRequest]; return NO; } return YES; }

JavaScriptCore中布满的二种类型

  • JSContext:代表JS的实践意况,通过evaluateScript:办法就足以施行JS方法。
  • JSValue:封装了JS与ObjC中对应的模型,以及调用JS的API等。
  • JSExport:三个会谈,通过遵循此契约,能够定义我们和好的磋商,在商议中扬言的API都会在JS中内情毕露出来,能被JS调用。
  • JSManagedValue:管理数据和章程的类。
  • JSVirtualMachine:管理线程相关,使用比较少。
应用注意
  • NSU兰德RLProtocol是一个抽象类,要想使用必需子类化它,並且,最佳在用完事后能 unregister,防止无终止的拦截判定,影响app性能。

  • Protocols 的遍历是反向的,假若顾客端同期登记了三个NSUPAJEROLProtocol,那么首先会走到结尾四个登记的 Protocol 里,直到第三个。

四、小结

  近日因为品种须要,正在边学边做Hybrid App,刚好用到那一个第三方,就写了篇文分享出去,希望能帮到刚刚动手的人,以上实例的demo地址 ^_^;

引入一些读书:

JSBridge——Web与Native交互之iOS篇:

Hybrid App 开采格局:

WebViewJavascriptBridge:

 

WebViewJavascriptBridge的采取,wkwebviewjs交互oc 一、 综述 未来广大的施用都会在种种平台上公布,所以重重顺序猿们都开头...

三、WebViewJavascriptBridge的使用

1、WebViewJavascriptBridge简介

  WebViewJavascriptBridge援助到iOS6此前的版本的,用于帮忙native的iOS与javascript交互,接下去讲讲WebViewJavascriptBridge的基本原理及相应怎么着去接纳,包涵iOS端的使用和JS端的运用。

  首先,看看WebViewJavascriptBridge.m中Webview代理拦截的代码:

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener
{
    if (webView != _webView) { return; }

    NSURL *url = [request URL];
    if ([_base isCorrectProcotocolScheme:url]) {
        if ([_base isBridgeLoadedURL:url]) {
            [_base injectJavascriptFile];
        } else if ([_base isQueueMessageURL:url]) {
            NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]];
            [_base flushMessageQueue:messageQueueString];
        } else {
            [_base logUnkownMessage:url];
        }
        [listener ignore];
    } else if (_webViewDelegate && [_webViewDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:request:frame:decisionListener:)]) {
        [_webViewDelegate webView:webView decidePolicyForNavigationAction:actionInformation request:request frame:frame decisionListener:listener];
    } else {
        [listener use];
    }
}

   WebViewJavascriptBridge是经过webview的代理拦截scheme,然后注入相应的JS,在拦截后,通过先经过-isBridgeLoadedUTucsonL:方法剖断UPRADOL是或不是是须要bridge的U普拉多L,假如,则通过injectJavascriptFile方法注入JS;不然判定UOdysseyL是或不是是队列音信,借使,则执行查询命令JS并刷新信息队列;假若都不包容,URAV4L被辨认为未知的信息。

 

2、WebViewJavascriptBridge的使用

  首先,要在JS中连着那一个框架,这段代码是不变的

    /**
     *  此为js接入框架的函数
     */
    function setupWebViewJavascriptBridge(callback) {
        if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
        if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
        window.WVJBCallbacks = [callback];
        var WVJBIframe = document.createElement('iframe');
        WVJBIframe.style.display = 'none';
        WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
        document.documentElement.appendChild(WVJBIframe);
        setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
    }

 

  然后OC要调用到的JS函数要在下边函数中央银行使bridge.registerHandler来注册,况兼JS需求调用的OC方法也要在上面包车型大巴函数中用bridge.callHandler调用

/**
 *  OC调用的JS函数需在此处注册,调用OC方法也需要在此处调用
 */
    setupWebViewJavascriptBridge(function(bridge) {
        var uniqueId = 1
        function log(message, data) {
            var log = document.getElementById('log')
            var el = document.createElement('div')
            el.className = 'logLine'
            el.innerHTML = uniqueId++ + '. ' + message + ':<br/>' + JSON.stringify(data)
            if (log.children.length) { log.insertBefore(el, log.children[0]) }
            else { log.appendChild(el) }
        }

        //注册一个给OC调用的函数,不带参数
        bridge.registerHandler('WebViewDidLoad',function() {
            log("WebViewDidLoad")
        })

        //注册一一个给OC调用的函数,接受OC传来的一个参数和一个回调处理
        bridge.registerHandler('OC_Call_JS', function(data, responseCallback) {
            log('oc调用js -', data)
            var responseData = { 'Javascript response':'oc调用JS成功!' }
            log('js被调用后响应-', responseData)
            responseCallback(responseData)
        })

        document.body.appendChild(document.createElement('br'))

        var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button'))
        callbackButton.innerHTML = 'JS_Call_ObjC'
        callbackButton.onclick = function(e) {
            e.preventDefault()
            log('JS call OC')
            //此处调用OC方法
            bridge.callHandler('JS_Call_ObjC', {'foo': 'bar'}, function(response) {
                log('JS call OC sucess and get OC rsp', response)
            })
        }
    })

  要求静心的是:在setupWebViewJavascriptBridge(function(bridge) {}函数体内的代码无法有荒唐,不然会招致不任何回调,不打字与印刷日志(JS的是脚本语言,跑到错的地点就不跑了)。

 

  OC部分,首先张开框架的日志系统,然后关联webView

[WebViewJavascriptBridge enableLogging];

    _bridge = [WebViewJavascriptBridge bridgeForWebView:webView];

   JS供给调用的OC方法,要在OC代码中登记

[_bridge registerHandler:@"JS_Call_ObjC" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"JS调用OC: %@", data);
        responseCallback(@"OC被调用后响应:调用成功!");
    }];

   而想要调用JS中注册过的函数,在急需的地点用实例方法callHandler调用就能够了

    id data = @{ @"OC调用JS": @"Hi there, JS!" };
    [_bridge callHandler:@"OC_Call_JS" data:data responseCallback:^(id response) {
        NSLog(@"testJavascriptHandler responded: %@", response);
    }];

 

_browser.delegate = self;

iOS与JS交互的两种办法

  • JavaScriptCore:iOS7自此出现的,学习花费不高,是适配iOS7的首荐。
  • 堵住商业事务:拦截左券要求互相联袂研究为商量鲜明一套法则,在互动中要依照该法规。拦截公约无需引进任何框架,适合八个阳台应用。左券能够这么定义:schemes://model/action?{参数1}={数值1}&{参数2}={数值2}&...
  • 其三方框架WebViewJavaScriptBridge:基于拦截公约进行的卷入,学费相对JavaScriptCore较高,使用不及JavaScriptCore方便。
  • WKWebView:iOS8之后出现的。
native获取webview信息

常见的做法是,native实行h5页面中提供的js方法获得相关音信。那就涉嫌到native施行js语句的操作,既然介绍UIWebView,这里首要从它的角度去说怎么调用js吧。
上一篇作品中牵线了UIWebView的实例方法:

- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

script为要实施的js语句,再次回到值即获取的结果,那些结果是string类型的,一般还要经过有关的转换管理。

上边列举部分常用的webview新闻获取形式。

  • 收回长按webView上的链接弹出actionSheet
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout = 'none';"];
  • 依附剧情获取webview中度
NSString *fitHeight = [webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"];
  • 收获webview页面内容
NSString *docStr=[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.textContent"];
  • 除去有些标签内容
[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('some-tag-id’).remove();"];
  • 赢妥贴前页面包车型地铁title:
NSString *title = [webview stringByEvaluatingJavaScriptFromString:@"document.title"];
  • 收获当前页面包车型客车url
NSString *url = [webview stringByEvaluatingJavaScriptFromString:@"document.location.href"];
  • 得各情状变量
[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
  • 取缔弹出美食指南
[webView valueForKeyPath:@" document.documentElement.style.webkitTouchCallout = "none";"];
  • 不准选中
[webView valueForKeyPath:@"document.documentElement.style.webkitUserSelect = "none";"];

一、综述

  今后不胜枚举的选取都会在多种阳台上宣布,所以众多程序员们都从头选取Hybrid App的设计格局。就是在app上停放网页,只要写一份网页代码,就足以跑在区别的种类上。在iOS中,app多是通过WebView来加载网页,由于效果需要等原因,代码中少不得要和跟网页交互。

二、原理

  在iOS中,当地调用Javascript语言,是因而UIWebView中的实例方法stringByEvaluatingJavaScriptFromString:来完成的,该方法通过字符串对象的格局传播JS代码。

[webView stringByEvaluatingJavaScriptFromString:@"Math.random();"];

   而JS调用本地的代码,则并不曾现有的API,而是供给直接地通过一些形式来促成。我们使用UIWebView的代办方法,当UIWebView发起的保有互联网乞请,都得以透过delegate函数在Native层获得文告。那样,大家就足以在UIWebView内发起三个自定义的网络央浼,比方:'wvjbscheme://__BRIDGE_LOADED__'。于是在UIWebView的delegate函数中,我们拦截url,只要发掘是我们自定义的url,就不实行内容的加载,转而实践相应的调用逻辑。

本文由胜博发-编程发布,转载请注明来源:实现代理方法澳门博发娱乐官网,只要写一份网