【4858.com】解析Android中webview和js之间的互动,网页开发适配指南

By admin in 4858.com on 2019年4月13日

好像是macOS拾.10之后,以及iOS捌随后,新现身的WKWebview组件就不慢的替代了Webview及UIWebView。后者的确存在部分不可能消除的bug,诸如架构导致的快慢迟滞和内部存款和储蓄器泄漏。
但不恐怕防止的题材接2连叁某些,比如有个别客户端软件,依然须求合营老版本的系统,那时候,很不想利用,但也只好依然把Webview塞到温馨的代码中。
互连网是个喜新厌旧的世界,网上查找,大致唯有两类。一是WKWebview的文档,二是iOS类的文书档案。想要的macOS上边Webview的资料缈如黄鹤。
透过部分只言片语的素材带领和大气的试行,终于达成了工作。所以决定来烧烧冷灶,写出来记录一下。

经过学习,你将会学习以下多少个方面包车型客车内容:

微信iOS客户端将于201七年5月1最近稳步升高为WKWebview内核,须要网页开发者提前做好网站的万分检查和适配。

一.android中采纳webview调用网页上的js代码。 Android
中得以由此webview来完结和js的相互,在程序中调用js代码,只须要将webview控件的支撑js的个性设置为true,,然后通过loadUrl就能够直接举行调用,如下所示:
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl(“javascript:test()”);

1.添加Webview

最简单易行添加webview的秘诀正是间接在Interface
Builder中把Webview拖入到窗口同时用鼠标拖动到钦命地方和钦定大小,随后在程序中加上对应的变量:

    @IBOutlet weak var webView: WebView!

若果非得动态程序实现,能够动用window.contentView?.addSubview(webView)把webview控件插入到界面中。

  • **【4858.com】解析Android中webview和js之间的互动,网页开发适配指南。怎样是WKWebView以及它和UIWebView的界别是何等 **
  • **认识SafariServices.framework框架,捎带认识UIActivity **
  • 回看UIWebView在公司工程中的使用
  • WKKit 和 WKWebView简介,特性认识API
  • UIWebView 和WKWebview 以及JSCore JS和OC的互相调用
  • NSURLProtocal的使用
  • WKWebView的1些坑

背景

WKWebView 是苹果在iOS
第88中学引入的新组件,指标是提供三个现代的协理最新Webkit功效的网页浏览控件,摆脱过去
UIWebView的老、旧、笨,尤其是内部存储器占用量巨大的难点。它应用与Safari中平等的Nitro JavaScript内燃机,大大升高了页面js执行进度。

二. 网页上调用android中java代码的法子 在网页中调用java代码,必要在webview控件中添加javascriptInterface。如下所示:

贰.载入网页

  1. 能够一直导向到有些网页,也足以先在本地运维四个静态页面文件,后续1些工作得以在该地静态网页中用js处理。那种办法是相比较多用的,因为程序运营速度会深感快的很多。

        let path = Bundle.main.path(forResource: "somepage", ofType: "html")
        let url = NSURL.fileURL(withPath: path!)
        let request = URLRequest(url: url);
        self.webView.mainFrame.load(request);
  1. 把somepage.html添加到项目,并在品种设置中Build Phases->Copy
    Bundle
    Resources中添加上文件somepage.html,那样结尾生成app文件的时候,somepage.html文件才会被打包到个中。
  2. 借使创建的项目应用沙箱(sandbox)格局,以往的运用,假若想上App
    Store,壹般是胁制须要使用沙箱的,要求在系统装置的Capabilities中允许incoming
    network/output
    networking。不然本地网页没难点,之后的其余网址都非常的小概访问。
  3. 新本子的macOS及iOS都强制必须采纳https网页访问,假使供给扶助老的http网页,还索要在Info.plist中加进壹行:App
    Transport Security Settings,类型为字典项,在那之中扩大一项:Allow
    Arbitrary Loads,值为YES。
    形成上述4项,网页已经得以访问了。

作品结构目录

切换情势

iOS微信6.五.三本子早先援助开发者手动切换WKWebview和UIWebview,使开发者可提前对WKWebview实行适配。

 

手动切换入口:

在微信会话列表页点击右上角“加号按钮”,选用菜单中的”添加朋友”,在抬高情侣界面包车型大巴追寻框中输入字符串:“:switchweb”,再点击键盘右下角搜索按钮。切换到功后会提醒当前选取的基本是UIWebview或是WKWebview。

 

校验切换格局:

因此命令成功切换成WKWebview后,可通过以下方法求证当前网页使用的是或不是是WKWebview内核。 

微信内随意入口进去任意网页,在网页加载成功后向下拉动页面(或点击网页右上角菜单按钮),使之展现出地址栏,本地址栏以
“此网页由” 开首即为当前应用WKWebview,若以“网页由”则是行使的UIWebview。

 

页面怎么判定当前应用的webview内核:

在页面中可经过微信注入的window.__wxjs_is_wkwebview变量判断当前应用的webview内核。
iOS微信六.5.叁会同之后的本子 window.__wxjs_is_wkwebview
为true时是运用WKWebview,为 false可能 “undefine”时是 UIWebview 。

前者适配关怀的宗旨

适配的基本点标准:若不可能分别是WKWebview的新特色新作为或许微信内部逻辑导致原本页面现身难题时,可采用测试页面分别在Safari和微信中的WKWebview内核分别测试,用以快捷定位难点发生的原故。

复制代码 代码如下:

3.从swift调用js

比方在网页中有如下内容:

<script>
function callFromSwift(msg){
    document.getElementById('msgbox').innerHTML=msg;
    return("msg return from js");
}
</script>
<div id='msgbox'></div>

内部定义了二个函数callFromSwift,当被调用的时候,在底下预约义的div中显得传入的字符串,并且重临1个字符串“msg
return from js”。
在swift中调用网页中的callFromSwift函数并赢得其再次回到值能够那样做:

        let s=webView.windowScriptObject.evaluateWebScript("callFromSwift('Hello, JavaScript')")
        NSLog(s as! String) //s是js函数的返回结果,可以是多种类型,本例要求是string
1.背景

适配指南

切换为WKWebview后,微信中的Webview行为和Safari中保持中度一致,唯1的分别是微信Webview中会注入微信JSBridge相关的本子。所以适配的关键要求关爱以下多少个方面: 

1:页面效果是或不是平常 

2:页面显示器适配是还是不是平常三:页面行为是或不是健康(例如用户在浏览页面时点击重返按钮重返上二个页面时的页面逻辑是或不是正常) 

四:页面使用的语法是还是不是相配。 

伍:JSSAPI是还是不是健康完美的做事。 

陆:重点关心Cookie和LocalStorage等相关的逻辑是或不是正规。 

七:若服务器有设置返回Cache-Control缓存有效时间,则要求检查有关逻辑是还是不是健康。

 

正规情况下,你的页面是不要求做特别的适配,但若你的页面有涉嫌到以下多少个受影响的逻辑,则需求基于适配建议进行适配和认可。

 

JSAPI相关适配

一:将不再扶助cache 

变更:在WKWebview大校暂不扶助cache jsapi。 

适配建议:全部应用此api的开发者可去掉页面相关逻辑。

 

2:页面通过LocalID预览图片 

变迁:不再帮助通过动用chooseImage api重回的localld以如:”img
src=wxLocalResource://5011465九二〇一一32”的不二诀要预览图片。 

适配提议:

  1. 在iOS微信陆.五.三版本及其后的版本中,使用新增的jsapi:getLocalImgData
    得到LocalID对应的图片base6肆编码后再在前者页面中显得。

贰.
倘使引进了页面有引进JSSDK,则直接将JSSDK升级为一.二.0流行版本即可帮忙页面自动适配。(方今JSSDk线上版本是
1.0.0 和 1.壹.0,更新版本为一.2.0
,  )

 

三:有使用JSSDK,并且利用了wx.config进行权力授权需关心jsapi调用的败诉难题 

变动:WKWebview的里边贯彻转移使我们对微信内的页面jsapi权限管理做了自然逻辑上的调动,有十分小莫不会发出原先授权符合规律的jsapi获取权力不平日,从而致使调用jsapi退步。 

适配建议:

一. iOS微信陆.五.一,WKWebview在此版本中已知有以下难点:页面使用HTML5的History
API pushState; popstate;    
 replaceState等决定页面导航(典型的如单运用页面),同时使用JSSDK的wx.config为jsapi授权,此时大概率会产出jsapi因为无权力而调用失利的题材。
在陆.伍.第11中学页面若只怕的景观下,可使用Anchor
hash技术替换History技术来缓解此难点。

二. iOS微信陆.5.二及其之后版本,将不会设有上述难点,但不可能百分之百承认有利用到
history或hash技术转移页面导航地址的页面完全未有此类题材,依旧供给开发者注意关切此类难点。

 

Cookie和LocalStorage设置相关

一:退出微信账号后,将会清空全体Cookie和LocalStorage。

 

贰:页面效果重视Cookie,或有涉及到Cookie的相关逻辑 

扭转:WKWebview内部达成转移,会潜移默化当下页面Cookie相关的逻辑,例如跨域存取Cookie和页面包车型客车能源或图片存款和储蓄服务器注重校验Cookie来回到数据等景况。

题材求证:在造访三个页面A时,假设页面A引用了另贰个页面B的资源(页面A和B为不一致的域名),那时页面B就以为是第一方页面。若在页面B中装置Cookie,就会命中WKWebview下阻止第2方跨域设置Cookie的安全策略,导致难点应运而生。

适配建议:

在WKWebview中是默认阻止跨域的第一方设置Cookie。全数通过Cookie传递的新闻,可通过业务后台存款和储蓄需求传递的音讯,然后给页面贰个仓库储存消息相呼应的access_token加密码,然后通过Url中进入自身工作的access_token举行页面间新闻传送。

如若页面包车型客车能源或图表存款和储蓄的服务器注重校验Cookie来回到数据的事态,在切换成WKWebview后,在微信内长按保存,可能点击预览大图时,将不会完好的带上所设置的库克ie,会促成图片保存战败或预览失利。除了此种景况,开发者不用操心别的景况下Cookie丢失的标题,全数请求都会带上完整的Cookie。

 

页面录制小窗播放

转移:iOS微信6.伍.三及其之后的本子中,Webview暗中同意帮忙小窗播放。 

开发者须求尤其注意小窗播放须要前端同时适配iOS10和iOS拾以下的低版本 

适配提议:须求完全依照以下代码设置video标签才可同时包容差异的iOS版本

<video webkit-playsinline playsinline> </video>

 

WKWebview页面行为与Safari完全一致,会促成页面正视UIWebview页面行为的逻辑失效或尤其:(可遵照业务自个儿逻辑,完结测试页面后各自在Safari和微信WKWebview中申明)

1:Safari或微信WKWebview中
页面A跳转到页面B再重返页面A后不会另行履行Script和Ajax(也不会触发页面reload)。 

2:Safari或微信WKWebview中,在页面弹出输入键盘后,会接触jQuery的resize事件,而在UIWebView下不会。 

三:Safari或微信WKWebview中, window unload
事件在唯有刷新才能接触,退出页面或然跳转到其余页面都爱莫能助触及。 

四:Safari或微信WKWebview中,极少数景况下1些特殊完成的页面点击事件会失效。

如若有关联或许境遇上述难题,以兼容Safari行为为准。

mWebView.addJavascriptInterface(new Object() {
            public void clickOnAndroid() {
                mHandler.post(new Runnable() {
                    public void run() {
                        Toast.makeText(Test.this, “测试调用java”,
Toast.LENGTH_LONG).show();
                    }
                });
            }
        }, “demo”);

4.从js调用swift

眼前的叁片段都比较易于,跟WKWebview也南平小异。从JS到swift的调用要复杂的多了。
第二在先导化的时候,要加上一句:

        webView!.frameLoadDelegate=self;

对应的,要在类注解的职位加上三个继承:WebFrameLoadDelegate,随后参与代码:

    //为js对象声明一个接口
    func webView(_ webView: WebView!, didClearWindowObject windowObject: WebScriptObject!, for frame: WebFrame!) {
        self.webView.windowScriptObject.setValue(self, forKey: "swiftHost")
    }
    //这个是基本框架,声明了本类中有两个函数会开放给js对象,并供其调用
    //这里示例了两个,一个是callFromJS1,另一个是quit
    //注意swift中的函数名跟js中的函数名可以不一样,
    //#selector中指明的是swift中声明的函数名,因为selector是object-c中的机制,
    //所以后面在声明真正函数的时候,前面必须加@objc的标志
    //在后面return "xxx"的部分,返回的字符串js中会使用的名字,
    //本例中,swift中函数名跟js中函数名使用了相同的名字,我认为这是好习惯
    override class func webScriptName(for aSelector: Selector) -> String?
    {
        //NSLog("%@",aSelector.description)
        if aSelector == #selector(callFromJS1)
        {
            return "callFromJS1"
        }
        else
        if aSelector == #selector(quit)
        {
            return "quit"
        }
        else
        {
            return nil
        }
    }
    //这个函数顾名思义,应当是不允许在js中调用的,对所有的来值都返回false表示全部允许调用
    override class func isSelectorExcluded(fromWebScript aSelector: Selector) -> Bool
    {
        //NSLog("%@",aSelector.description)
        return false
    }
    //具体的函数
    @objc
    func callFromJS1(message:String)
    {
        NSLog(message)
    }
    @objc
    func quit()
    {
        NSLog("call for quit")
        NSApp.terminate(self);
    }

前多少个函数是大旨的框架,在那之中第三个辛勤一些,随后实际上中国人民解放军海军事工业程大学业作的函数没有啥越发。
进而来看看js的局地:

    <a href='javascript:testCallSwift();'>testCallSwift</a><p>
    <a href='javascript:needQuit();'>Quit</a><p>
    <script>
        function testCallSwift(){
            //注意调用方式,window是js的对象
            //swiftHost是swift的接口
            //其后则是声明的swift函数
            window.swiftHost.callFromJS1("hello swift");
        }
        function needQuit(){
            window.swiftHost.quit();
        }
    </script>
二.移动端呈现web方案

— 二.1 Safari— 二.2 SFSafariViewController— 贰.3UIWebView,回想在小卖部工程中的使用— 二.叁 UIWebView 接口说明

任何标题

1:页面自定义重载标准措施依旧函数时,必要保险不会与微信注入Webview中的JSBridge相关方法争持,不然会导致页面在微信中的行为充裕。

贰:强烈提出不要在不恐怕保险页面缓存策略和逻辑与服务器逻辑完全保持1致的景况下冒然设置html页面文件(除了html类型的页面,页面引用的此外能源或脚本依照自个儿业务合理设置即可)相关的Cache-Control属性。 

优异案例: 

假定第1回访问页面A.html
服务器30二跳转到A1.html?uid=11一安装Cache-Control:
max-age=60,此A一.html的uid参数是服务器设置的111(此时A一.html已经被客户端缓存)。
第一次访问页面A.html
,服务器同样302跳转到A1.html?uid=22二,不过此时的A一.html页面包车型地铁uid参数是22二,
客户端带参数完整链接询问服务器缓存是还是不是可用,
服务器再次回到缓存可用304,可是客户端缓存的A一.html完整链接带的uid参数是11一,所以地点找不到多少,此时加载页面就会战败。

在网页中,只需求像调用js方法同样,进行调用就能够
<div id=’b’><a
onclick=”window.demo.clickOnAndroid()”>b.c</a></div>

5.截获webview每1次访问

跟上边类似,要再追加三个代理:

//初始化的时候增加:
        webView!.policyDelegate=self;

同时注解类的时候多1个一连:WebPolicyDelegate。随后代码中得以兑现2个接口:

    func webView(_ webView: WebView!,
                 decidePolicyForNavigationAction actionInformation: [AnyHashable : Any]!,
                 request: URLRequest!,
                 frame: WebFrame!,
                 decisionListener listener: WebPolicyDecisionListener!) {
        NSLog("nav to %@",request.url!.absoluteString)  //这里是将要转向的网址
        listener.use()  //允许访问这个网址
        //listener.ignore()   //不允许访问这个网址则调用这个
    }

也有些程序中为了简化从js调用swift的工作量,会用链接的方法,在链接地址中盛传一些指令,就足以用这一个函数截获网站并且处理,被拍卖的网站平常接纳listener.ignore()来禁止本次浏览器转向,免得影响当下页面。

3.WKKit& WKWebView

— 三.一WKKit框架介绍,WKWebView API介绍—
三.二OC怎么给JS注入对象及JS咋样给IOS发送数据—
3.3JS调用alert、confirm、prompt时,不行使JS原生提醒,而是接纳iOS原生来完结—
三.4如何监听web内容加载进程、是还是不是加载成功— 3.五哪些处理去跨域难题—
三.6JS和OC的并行调用— 3.柒WKWebview API难题

三. Java代码调用js并传参 首先供给带参数的js函数,如function
test(str),然后只需在调用js时传出参数即可,如下所示:
mWebView.loadUrl(“javascript:test(‘aa’)”);

6.响应js中的警告窗

一般的webview都以不容许js中的alert警告窗的,一方面是为了应用程序全部的功能;另1方面,webview作为2个空中,自身从不UI的控制权,所以类似的做事,是要有应用程序本身完成警告框窗口的。完结警告窗还是要给类扩张1个集成WebUIDelegate,并在起始化中追加:

        webView!.uiDelegate=self;

//随后可以实现一个接口:
    func webView(_ sender: WebView!,
                 runJavaScriptAlertPanelWithMessage message: String!,
                 initiatedBy frame: WebFrame!){
        NSLog("msg of alert: %@",message)
    }

万一不满足于只是获取警示消息,要和谐在这些函数中央银行使cocoa的警戒窗来显示相关的音信。

1.背景

自iOS问世以来,iOS
和web总是亲切。究竟,当iOS诞生的时候,网址已经有一伍年的历史了(第贰个网址的创导甚至足以追溯到1九玖1年,而iOS在200柒年才面世,而那时候还未有AppStore,未有使用分发商场)OPPO出现的时候就早已有诸多的web内容了,那样iOS必须提供1种艺术来显示web内容。—-翻译1位苹果工程师的1段话

肆.Js中调用java函数并传参 先是壹样需求带参数的函数方式,但需注意此处的参数须要final类型,即获得今后不可修改,假如要求修改在那之中的值,能够先安装中间变量,然后开始展览改动。如下所示:

7.其它

仍可以完毕从js中做客swift中的变量成效。使用isKeyExcludedFromWebScriptwebScriptNameForKey函数,作者用得少,假若急需,参考上边定义函数的方法,查壹查官方文书档案本身来试试啊。

2.移动端体现web方案

在iOS
九中,大家有例外的渲染网页内容的取舍,依照具体供给,开发人士能够评估不相同的挑叁拣四,采用三个符合他们越来越好。让大家看看贰个开发职员能够利用的例外的缓解方案。

让我们看看近期在移动端都有哪些方案:

  • Safari
  • SFSafariViewController
  • UIWebView
  • WKWebview

对在此以前两种大家都已驾驭依然控制,大家先简单的验证一下,大家的主体依旧WKWebview上。

复制代码 代码如下:

参考资料:

Swift & JavaScript
integration

2.1Safari

我们日常用

 NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"]; [[UIApplication sharedApplication] openURL:url];

那种回顾的艺术用苹果自带的safari浏览器打开二个网页,从iOS九起初从二个app打开另2个app就好像内嵌app一样,能够回到原来的app.
纵然那是三个细微的方案,可是对于跳转到别的app,大家要么有点情愿的,因为,我们只想让用户停留在大家的app里。

mWebView.addJavascriptInterface(new Object() {
            public void clickOnAndroid(final int i) {
                mHandler.post(new Runnable() {
                    public void run() {
                                int j = i;
                                j++;
Toast.makeText(Test.this, “测试调用java” + String.valueOf(j),
Toast.LENGTH_LONG).show();
                    }
                });
            }
        }, “demo”);

2.2SFSafariViewController

咱俩不得不说safari确实很有力,在iOS九,苹果公司给我们提供了一个SafariServices.framework
,这一个框架很简短,就多少个文本1.SFSafariViewController2.SSReadingList(用户safari阅读列表)三.SFContentBlockerState(safari内容拦击)不用理解

那里只是简短明白下SFSafariViewController,这些控制器的API,非常粗略。用SFSafariViewController
那种办法得以加载web内容,而且是内置在我们app里的浏览器,不过那一个控制器有个致命的症结正是不能够自定义,苹果集团并未开放出不少API,有壹部分个体的API能够取得进行自定义,不过大家不可能应用,略显窘迫,笔者想就此苹果集团不开放很多api的说辞,应该注重依旧以原生app和safari为主流的原委吗。

接下来在html页面中,利用如下代码<div id=’b’><a
onclick=”window.demo.clickOnAndroid(贰)”>b.c</a></div>,
即可兑现调用

2.3UIWebView

废话不多说,我们把重大放在最终WkWebview上,再认识WKWebview在此以前,大家有不可或缺再容易回想下UIwebView的运用,以及大家工程里对UIwebview的使用.UIWebview是UIKit框架里的1个视图类,
继承UIView,
整个接口文件也惟有拾0行,里面有2个scrollview的天性,这几个都以大家大致的认识。我们感兴趣能够掌握下UIwebView的里边贯彻,后边稍微提一下。

1.商家对UIWebview的简练利用1.1用webView打电话代码如下

 NSString *phoneNum = nil; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0){ phoneNum = [NSString stringWithFormat:@"telprompt://%@",self.phoneNumber]; } else { phoneNum = [NSString stringWithFormat:@"tel://%@",self.phoneNumber];// 电话号码 } if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNum]]; } else { UIWebView *callPhoneWebVw = [[UIWebView alloc] initWithFrame:CGRectZero]; self.callwebView = callPhoneWebVw; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:phoneNum]]; [_callwebView loadRequest:request]; }

一.二 封装了 PZLWJSBridgeView
,控件继承UIWebview在家居和知识详情模块,都有用到这几个类一.叁LLLwebviewcontroller大家都领悟,我们最多的是采纳那几个类,加载wap页面,大家在此处差不离看下这么些控制器是怎么利用的。其实选拔也是蛮简单的,具体步骤如下:1.3.一创造UIwebview壹.3.②创设假的进度条,之所以是假的,是因为webview不帮忙加载进度壹.叁.三然后正是一对享用工作上的逻辑了(简单调用js代码获取js数据)一.三.四每便请求的时候有添加cookie的操作,然后dealloc的时候删除
cookie(UIwebview并不帮衬cookie操作)一.三.5加载U普拉多L过滤,PZLWURAV4LRequestFilter:
NSULANDLProtocol,咱供销合作社对于那几个接二连三自NSU陆风X8LProtocol的公文也打成了静态库,感兴趣的同室能够去github上找一下,
github有落实德姆o。可是那些U途锐L过滤,在WKWebView上不援救。大家简要学习一下那些在大家公司封装成静态库的落实进程吧

我们用UIWebview无非正是多个代理和调用javascript代码,而且只是取得html的剧情。像那样
:

[self.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('soufunclient').innerHTML"];

看来,UIwebview的选拔很简短,那里对UIWebview头文件做了验证

// Copyright  2007-2015 Apple Inc. All rights reserved.//#import <Foundation/Foundation.h>#import <UIKit/UIView.h>#import <UIKit/UIKitDefines.h>#import <UIKit/UIDataDetectors.h>#import <UIKit/UIScrollView.h>NS_ASSUME_NONNULL_BEGINtypedef NS_ENUM(NSInteger, UIWebViewNavigationType) { UIWebViewNavigationTypeLinkClicked,//用户触发了一个链接 UIWebViewNavigationTypeFormSubmitted,//用户提交了一个表单 UIWebViewNavigationTypeBackForward,//用户触击前进前进或返回按钮 UIWebViewNavigationTypeReload,//用户触击重新加载的按钮 UIWebViewNavigationTypeFormResubmitted,//用户重复提交表单 UIWebViewNavigationTypeOther//发生了其他行为} __TVOS_PROHIBITED;//2. 加载内容关于分页显示几种不同类型typedef NS_ENUM(NSInteger, UIWebPaginationMode) { UIWebPaginationModeUnpaginated, UIWebPaginationModeLeftToRight, UIWebPaginationModeTopToBottom, UIWebPaginationModeBottomToTop, UIWebPaginationModeRightToLeft} __TVOS_PROHIBITED;typedef NS_ENUM(NSInteger, UIWebPaginationBreakingMode) { UIWebPaginationBreakingModePage,//默认设置是这个属性,CSS属性以页样式。 UIWebPaginationBreakingModeColumn//当UIWebPaginationBreakingMode设置这个属性的时候,这个页面内容CSS属性以column-break 代替page-breaking样式。} __TVOS_PROHIBITED;@class UIWebViewInternal;@protocol UIWebViewDelegate;NS_CLASS_AVAILABLE_IOS __TVOS_PROHIBITED @interface UIWebView : UIView <NSCoding, UIScrollViewDelegate> @property (nullable, nonatomic, assign) id <UIWebViewDelegate> delegate;@property (nonatomic, readonly, strong) UIScrollView *scrollView NS_AVAILABLE_IOS;- loadRequest:(NSURLRequest *)request;- loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;- loadData:data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:baseURL;@property (nullable, nonatomic, readonly, strong) NSURLRequest *request;- reload;- stopLoading;- goBack;- goForward;@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;@property (nonatomic, readonly, getter=isLoading) BOOL loading;- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;//是否让内容伸缩至适应屏幕当前尺寸@property (nonatomic) BOOL scalesPageToFit;//这个属性如果设置为YES,当进入到页面视图可以自动检测电话号码,让用户可以单机号码进行拨打,不过现已弃用。@property (nonatomic) BOOL detectsPhoneNumbers NS_DEPRECATED_IOS;//这个属性可以设定使电话号码,网址,电子邮件和符合格式的日期等文字变为连接文字。@property (nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS;//这个属性决定了页面用内嵌HTML5播放视频还是用本地的全屏控制。为了内嵌视频播放,不仅仅需要在这个页面上设置这个属性,还需要在HTML的viedeo元素必须包含webkit-playsinline属性。默认iPhone为NO,iPad为YES。@property (nonatomic) BOOL allowsInlineMediaPlayback NS_AVAILABLE_IOS; // iPhone Safari defaults to NO. iPad Safari defaults to YES//这个属性决定了HTML5视频可以自动播放还是需要用户启动播放。iPhone和iPad默认都是YES。@property (nonatomic) BOOL mediaPlaybackRequiresUserAction NS_AVAILABLE_IOS; // iPhone and iPad Safari both default to YES//这个属性决定了从这个页面是否可以Air Play。iPhone和iPad上都是默认YES。@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay NS_AVAILABLE_IOS; // iPhone and iPad Safari both default to YES//这个值决定了网页内容的渲染是否在把内容全部加到内存中再去处理。如果设置为YES,只有网页内容加载到内存里了才会去渲染。默认为NO@property (nonatomic) BOOL suppressesIncrementalRendering NS_AVAILABLE_IOS; // iPhone and iPad Safari both default to NO//这个属性如果设置为YES,用户必须明确的点击页面上的元素或者相关联的输入页面来显示键盘。如果设置为NO,一个元素的焦点事件就会导致输入视图的显示和自动关联这个元素。@property (nonatomic) BOOL keyboardDisplayRequiresUserAction NS_AVAILABLE_IOS; // default is YES//设置页面分页模型选择。@property (nonatomic) UIWebPaginationMode paginationMode NS_AVAILABLE_IOS;//这个属性决定了CSS属性是采用column-break 还是page-breaking样式。@property (nonatomic) UIWebPaginationBreakingMode paginationBreakingMode NS_AVAILABLE_IOS;//分页的长度@property (nonatomic) CGFloat pageLength NS_AVAILABLE_IOS;//分页之间间距@property (nonatomic) CGFloat gapBetweenPages NS_AVAILABLE_IOS;//分页的个数@property (nonatomic, readonly) NSUInteger pageCount NS_AVAILABLE_IOS;//是否允许画中画播放The default value is YES on devices that support Picture in Picture  mode and NO on all other devices.@property (nonatomic) BOOL allowsPictureInPictureMediaPlayback NS_AVAILABLE_IOS;//3DTouch的预览功能,默认为NO@property (nonatomic) BOOL allowsLinkPreview NS_AVAILABLE_IOS; // default is NO@end__TVOS_PROHIBITED @protocol UIWebViewDelegate <NSObject>@optional- webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;- webViewDidStartLoad:(UIWebView *)webView;- webViewDidFinishLoad:(UIWebView *)webView;- webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;@endNS_ASSUME_NONNULL_END

当今笔者告诉您,
终于实行大家要讲的主旨了,糟糕意思,未来才起来,不过也会飞快甘休的。

你可能感兴趣的稿子:

  • android
    WebView加载html5介绍
  • Android中贯彻Webview顶部带进度条的法门
  • android中webview控件和javascript交互实例
  • Android WebView使用形式详解
    附js交互调用方法
  • android
    webview中利用Java调用JavaScript方法并拿走再次回到值
  • Android中Webview打开网页的还要发送HTTP头消息方式
  • 在Android系统中使用WebViewClient处理跳转U中华VL的措施
  • Android开发之WebView组件的利用解析
  • Android中
    webView调用JS出错的化解办法
  • Android混合开发教程之WebView的选取方法计算
3 WKKit && WKWebview
3.1WKKit框架介绍,WKWebView API介绍

WKWebview在WKKit那些框架里,
苹果将UIWebViewDelegate和UIWebView重构成了1四个类与二个体协会议官方链接

WebKit provides a set of classes to display web content in windows,
and implements browser features such as following links when clicked
by the user, managing a back-forward list, and managing a history of
pages recently visited. WebKit greatly simplifies the complicated
process of loading webpages—that is, asynchronously requesting web
content from an HTTP server where the response may arrive
incrementally, in random order, or partially due to network errors.
WebKit also simplifies the process of displaying that content which
can contain various MIME types, and compound frame elements each with
their own set of scroll bars.

在Overview的时候,苹果官方文书档案有这么的1段描述。并且还有三个晋升

Concurrency NoteThe WebKit framework is not thread-safe. If you call
functions or methods in this framework, you must do so exclusively on
the main program thread.

不是线程安全的。同样的WebKit框架在MAC app和 iOS APP里是分歧的,
大家能够见到在macAPP里,这几个框架是十分的大的, 里面还含有了子框架,
而且那几个框架揭破的头文件也很多,有CSS,DOM等操作的API.

说了那般多,大家稍等一会就只来探望iOS上webkit框架,假使大家刚兴趣能够学学恐怕打听一下MAC上的webkit框架

WWDC2014-206session:The modern Webkit APi1.Same on iOS and OS
X2.Modern3.Streamlined4.Multi-process architecture

4858.com 1Multi-process
architecture

我们第二理解下WKWebView的①对优势:一WKWebview在质量、稳定性上和UIwebview相比较二WKWebView越来越多的援救HTML伍的特色3WKWebView更加快,占用内部存款和储蓄器恐怕唯有UIWebView的1/三
~ 四分之一4WKWebView高达60fps的滚动刷新率和添加的内置手势(Built-in
gestures)五WKWebView具有Safari相同的JavaScript引擎Nitro(JJT多个进度解释施行优化js代码)(FastJavaScript)6WKWebView扩张了加载进程属性柒Easy app-webpage
communication八Responsive scrolling九更省电量
battery以上消息能够在WWDC201四-20陆节-介绍 WebKit modern API 的时候提到。

** po [self.webView recursiveDescription]<UIWebView: 0x14d14130; frame = (0 0; 320 504); layer = <CALayer: 0x12cca690>> | <_UIWebViewScrollView: 0x6c55400; frame = (0 0; 320 504); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0x12c7adf0>; layer = <CALayer: 0x10a4f9c0>; contentOffset: {0, 0}; contentSize: {320, 504}> | | <UIWebBrowserView: 0x69fac00; frame = (0 0; 320 504); text = ''; gestureRecognizers = <NSArray: 0x10ac37f0>; layer = <UIWebLayer: 0x12c9f580>> | | | <LegacyTileHostLayer: 0x14d04c30>  | | | | <LegacyTileLayer: 0x10a99700>  | | <UIImageView: 0x14d0ffd0; frame = (3 498.5; 314 2.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x14d100b0>> | | <UIImageView: 0x14c4e3a0; frame = (314.5 3; 2.5 498); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x14ceb340>>** po [self.webView recursiveDescription]**<WKWebView: 0x1612c8720; frame = (0 0; 320 504); layer = <CALayer: 0x16127b9b0>> | <WKScrollView: 0x160977600; baseClass = UIWebScrollView; frame = (0 0; 320 504); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x16488d250>; layer = <CALayer: 0x16488a970>; contentOffset: {0, 0}; contentSize: {0, 0}> | | <WKContentView: 0x160a56000; frame = (0 0; 320 504); gestureRecognizers = <NSArray: 0x164887d20>; layer = <CALayer: 0x16127b650>> | | | <UIView: 0x16129d960; frame = (0 0; 320 504); clipsToBounds = YES; layer = <CALayer: 0x1612c3150>> | | | | <UIView: 0x1612c2fe0; frame = (0 0; 320 504); autoresize = W+H; layer = <CALayer: 0x16128a9f0>> | | <UIView: 0x164887750; frame = ; opaque = NO; layer = <CALayer: 0x16127a070>> | | <UIImageView: 0x16102fa70; frame = (310 498.5; 7 2.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x161227960>> | | <UIImageView: 0x163647e60; frame = (314.5 494; 2.5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x1610ac060>>

4858.com 2UIWebView.png
引用自CocoaChina

UIWebView属于UI基特,封装了WebKit.framework的WebView.WebView组合管理了WebCore.framework的Page,并提供了各类Clients.Page管理了Main
Frame,Main Frame管理了sub
Frame(FrameTree)我们看一下po出来的视图层级完全不1样,可以说两者关系并相当的小,WebView继承自WAKView,WAKView类似于NSView,能够做较少的改动使得Mac和iOS共用一套。由UIWebDocumentView对WebView举办操作并吸收接纳回调事件,当数码发生变化的时候,就会文告UIWebTiledView重新绘制。UIWebTiledView和WAKWindow那八个类首要承担页面包车型大巴绘图,包涵布局绘图排版,交互等,WAKWindow还会做壹些用户操作事件的分摊。UIWebBrowserView首要承担:
form的电动填充 fixed成分的职责调整JavaScript的手势识别,
键盘弹出时的视图滚动处理,防止遮挡,提供接口让UIWebView获取音讯,为展现PDF时添加页号标签

  • — 引在cocoachina1篇小说

只是我在事实上测试的时候,
在真机上出现过接收内部存储器警告。上边两张图纸比较下加载www.fang.com的wap页的时候,以及点击wap的时候内部存款和储蓄器变化的事态。

4858.com 3UIWebView内存变化景况4858.com 4WKWebview内部存款和储蓄器变化景况

从上边多个图片能够见见,刚开首加载网页的时候内部存款和储蓄器使用是大半的,
不过当本身和wap页面交互的时候,内部存款和储蓄器变化对于UIWebview来说是宏伟的,
对于WkWebView来说相对是较小的。

Class:

WKBackForwardList: 在此以前访问过的 web
页面包车型客车列表,能够通过后退和升高动作来拜会到。WKBackForwardListItem:
webview 中后退列表里的某贰个网页。WKFrameInfo:
包蕴四个网页的布局音讯。WKNavigation:
包蕴三个网页的加载进程信息。WKNavigationAction:
包涵大概让网页导航变化的音信,用于判断是不是做出导航变化。WKNavigationResponse:
蕴含或许让网页导航变化的归来内容音讯,用于判断是还是不是做出导航变化。WKPreferences:
总结七个 webview 的偏好设置。WKProcessPool: 表示多个 web
内容加载池。WKUserContentController: 提供利用 JavaScript post
音信和注射 script 的艺术。WKScriptMessage:
包涵网页发出的音信。WKUserScript:
表示能够被网页接受的用户脚本。WKWebViewConfiguration: 开首化 webview
的装置。WKWindowFeatures: 钦赐加载新网页时的窗口属性。

WKUserScript:

What Can User Scripts Do?Incredibly powerful• Modify the document•
Listen for events• Load resources• Communicate back to your
application

Protocal:

WKNavigationDelegate:
提供了追踪主窗口网页加载进度和判断主窗口和子窗口是或不是开展页面加载新页面包车型地铁连锁措施。WKScriptMessageHandler:
提供从网页中收音信的回调方法。WKUIDelegate:
提供用原生控件彰显网页的法子回调。

近来让我们跳到Xcode

/*说明: 1.WKProcessPool@abstract The process pool from which to obtain the view's web content process. @discussion When a web view is initialized, a new web content process will be created for it from the specified pool, or an existing process in that pool will be used. ! A WKProcessPool object represents a pool of web content processes. The process pool associated with a web view is specified by its web view configuration. Each web view is given its own web content process until an implementation-defined process limit is reached; after that, web views with the same process pool end up sharing web content processes. 这个东西好像与cookie有关,一个例子。 2WKUserContentController A WKUserContentController object provides a way for JavaScript to post messages to a web view. The user content controller associated with a web view is specified by its web view configuration. 3 它是用于webview内容交互时选择内容的粒度类型设置。比如说,当使用WKSelectionGranularityDynamic时,而所选择的内容是单个块,这时候granularity可能会是单个字符;当所选择的web内容不限制于某个块时,granularity可能会是单个块。*/#import "LLLWKwebViewViewController.h"//1.第一步导入框架#import <WebKit/WebKit.h>//大家可以看一下,这个Webkit包含了27个文件,我们不能讲的很详细, 只能尽力去说一下@interface LLLWKwebViewViewController ()<WKNavigationDelegate,WKUIDelegate>@property(nonatomic,strong)WKWebView *wkwebview;@end@implementation LLLWKwebViewViewController- viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; // WKWebView *wkView = [[WKWebView alloc]initWithFrame:self.view.bounds]; //3.初始化WKPreferences WKPreferences *preference = [[WKPreferences alloc]init]; preference.minimumFontSize = 0; preference.javaScriptEnabled = YES; preference.javaScriptCanOpenWindowsAutomatically=NO; //4初始化WKUserContentController WKUserContentController *wkuserCVC = [[WKUserContentController alloc]init]; // [wkuserCVC addUserScript:nil]; // [wkuserCVC addScriptMessageHandler:<#(nonnull id<WKScriptMessageHandler>)#> name:<#(nonnull NSString *)#>] //5.WKWebsiteDataStore WKWebsiteDataStore *dataStore = [WKWebsiteDataStore defaultDataStore]; dataStore = [WKWebsiteDataStore nonPersistentDataStore];//适合隐私浏览 NSSet *set = [WKWebsiteDataStore allWebsiteDataTypes]; NSArray *arr = [set allObjects]; // [dataStore fetchDataRecordsOfTypes:(nonnull NSSet<NSString *> *) completionHandler:^(NSArray<WKWebsiteDataRecord *> * _Nonnull) { // }]; // [dataStore removeDataOfTypes:(nonnull NSSet<NSString *> *) forDataRecords:(nonnull NSArray<WKWebsiteDataRecord *> *) completionHandler:^{ //}]; //6WKWebsiteDataRecord // WKWebsiteDataRecord *dataRecord = [[WKWebsiteDataRecord alloc]init]; // dataRecord.dataTypes //2.初始化设置 WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init]; config.processPool = [[WKProcessPool alloc]init]; config.preferences = preference; config.userContentController = wkuserCVC; config.websiteDataStore = dataStore; config.suppressesIncrementalRendering = NO;//ioS9 config.applicationNameForUserAgent = @"USer-agent";//ios9 config.allowsAirPlayForMediaPlayback =YES;//airplay isallowed config.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeAll;//ios10 config.allowsInlineMediaPlayback = NO; config.selectionGranularity = WKSelectionGranularityDynamic; config.allowsPictureInPictureMediaPlayback = NO; config.dataDetectorTypes = UIDataDetectorTypePhoneNumber; config.ignoresViewportScaleLimits = NO; WKWebView*wkView = [[WKWebView alloc]initWithFrame:self.view.bounds configuration:config]; self.wkwebview = wkView; WKBackForwardList *list = wkView.backForwardList; WKBackForwardListItem *backlistItem = list.backItem; WKBackForwardListItem *forwardlistItem = list.forwardItem; WKBackForwardListItem *currentlistItem = list.currentItem; WKBackForwardListItem *nextlistItem = [list itemAtIndex:1]; NSArray *backList = list.backList; NSArray *forwardList = list.forwardList; WKNavigation *navigation = [wkView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.fang.com"]]]; wkView.UIDelegate = self; wkView.navigationDelegate = self; [self.view addSubview:wkView]; }#pragma mark---WKNavigationDelegate/*! @abstract Decides whether to allow or cancel a navigation. @param webView The web view invoking the delegate method. @param navigationAction Descriptive information about the action triggering the navigation request. @param decisionHandler The decision handler to call to allow or cancel the navigation. The argument is one of the constants of the enumerated type WKNavigationActionPolicy. @discussion If you do not implement this method, the web view will load the request or, if appropriate, forward it to another application. *///1.The number 1 called//3.The number 3 called//7.The number 7 called- webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(WKNavigationActionPolicy))decisionHandler{ NSLog(@"%s--navigationAction is %@",__FUNCTION__,navigationAction); decisionHandler(WKNavigationActionPolicyAllow);}/*! @abstract Decides whether to allow or cancel a navigation after its response is known. @param webView The web view invoking the delegate method. @param navigationResponse Descriptive information about the navigation response. @param decisionHandler The decision handler to call to allow or cancel the navigation. The argument is one of the constants of the enumerated type WKNavigationResponsePolicy. @discussion If you do not implement this method, the web view will allow the response, if the web view can show it. *///5.The number 5 called- webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(WKNavigationResponsePolicy))decisionHandler{ NSLog(@"%s--navigationAction is %@",__FUNCTION__,navigationResponse); decisionHandler(WKNavigationResponsePolicyAllow); }/*! @abstract Invoked when a main frame navigation starts. @param webView The web view invoking the delegate method. @param navigation The navigation. #########Called when web content begins to load in a web view. *///2.the number 2 called- webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation{ NSLog(@"%s--navigation is %@",__FUNCTION__,navigation);}/*! @abstract Invoked when a server redirect is received for the main frame. @param webView The web view invoking the delegate method. @param navigation The navigation. *///4.The number 4 called- webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation{ NSLog(@"%s--navigation is %@",__FUNCTION__,navigation);}/*! @abstract Invoked when an error occurs while starting to load data for the main frame. @param webView The web view invoking the delegate method. @param navigation The navigation. @param error The error that occurred. */- webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error{ NSLog(@"%s--navigation is %@ and error is %@",__FUNCTION__,navigation,error);}/*! @abstract Invoked when content starts arriving for the main frame. @param webView The web view invoking the delegate method. @param navigation The navigation. ################Called when the web view begins to receive web content. *///6.The number 6 called- webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation{ NSLog(@"%s--navigation is %@",__FUNCTION__,navigation);}/*! @abstract Invoked when a main frame navigation completes. @param webView The web view invoking the delegate method. @param navigation The navigation. */- webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{ NSLog(@"%s--navigation is %@",__FUNCTION__,navigation);}/*! @abstract Invoked when an error occurs during a committed main frame navigation. @param webView The web view invoking the delegate method. @param navigation The navigation. @param error The error that occurred. */- webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error{ NSLog(@"%s--navigation is %@",__FUNCTION__,navigation);}/*! @abstract Invoked when the web view needs to respond to an authentication challenge. @param webView The web view that received the authentication challenge. @param challenge The authentication challenge. @param completionHandler The completion handler you must invoke to respond to the challenge. The disposition argument is one of the constants of the enumerated type NSURLSessionAuthChallengeDisposition. When disposition is NSURLSessionAuthChallengeUseCredential, the credential argument is the credential to use, or nil to indicate continuing without a credential. @discussion If you do not implement this method, the web view will respond to the authentication challenge with the NSURLSessionAuthChallengeRejectProtectionSpace disposition. */- webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler{ NSLog(@"%s--challenge is %@",__FUNCTION__,challenge); completionHandler(NSURLSessionAuthChallengeUseCredential,nil);}/*! @abstract Invoked when the web view's web content process is terminated. @param webView The web view whose underlying web content process was terminated. */- webViewWebContentProcessDidTerminate:(WKWebView *)webView API_AVAILABLE(macosx, ios{ NSLog(@"%s-",__FUNCTION__);}- didReceiveMemoryWarning { [super didReceiveMemoryWarning];}#pragma mark---WKUIDelegate/*! @abstract Creates a new web view. @param webView The web view invoking the delegate method. @param configuration The configuration to use when creating the new web view. @param navigationAction The navigation action causing the new web view to be created. @param windowFeatures Window features requested by the webpage. @result A new web view or nil. @discussion The web view returned must be created with the specified configuration. WebKit will load the request in the returned web view. If you do not implement this method, the web view will cancel the navigation. */- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{ NSLog(@"%s--configuration is %@ \n and navigationAction is %@\n and windowFeatures is %@",__FUNCTION__,configuration,navigationAction,windowFeatures); return webView;}/*! @abstract Notifies your app that the DOM window object's close() method completed successfully. @param webView The web view invoking the delegate method. @discussion Your app should remove the web view from the view hierarchy and update the UI as needed, such as by closing the containing browser tab or window. */- webViewDidClose:(WKWebView *)webView API_AVAILABLE(macosx, ios{ NSLog(@"%s-",__FUNCTION__);}/*! @abstract Displays a JavaScript alert panel. @param webView The web view invoking the delegate method. @param message The message to display. @param frame Information about the frame whose JavaScript initiated this call. @param completionHandler The completion handler to call after the alert panel has been dismissed. @discussion For user security, your app should call attention to the fact that a specific website controls the content in this panel. A simple forumla for identifying the controlling website is frame.request.URL.host. The panel should have a single OK button. If you do not implement this method, the web view will behave as if the user selected the OK button. */- webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:completionHandler{ NSLog(@"%s and message is %@ and frame is %@",__FUNCTION__,message,frame);}/*! @abstract Displays a JavaScript confirm panel. @param webView The web view invoking the delegate method. @param message The message to display. @param frame Information about the frame whose JavaScript initiated this call. @param completionHandler The completion handler to call after the confirm panel has been dismissed. Pass YES if the user chose OK, NO if the user chose Cancel. @discussion For user security, your app should call attention to the fact that a specific website controls the content in this panel. A simple forumla for identifying the controlling website is frame.request.URL.host. The panel should have two buttons, such as OK and Cancel. If you do not implement this method, the web view will behave as if the user selected the Cancel button. */- webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(BOOL result))completionHandler{ NSLog(@"%s and message is %@ and frame is %@",__FUNCTION__,message,frame);}/*! @abstract Displays a JavaScript text input panel. @param webView The web view invoking the delegate method. @param message The message to display. @param defaultText The initial text to display in the text entry field. @param frame Information about the frame whose JavaScript initiated this call. @param completionHandler The completion handler to call after the text input panel has been dismissed. Pass the entered text if the user chose OK, otherwise nil. @discussion For user security, your app should call attention to the fact that a specific website controls the content in this panel. A simple forumla for identifying the controlling website is frame.request.URL.host. The panel should have two buttons, such as OK and Cancel, and a field in which to enter text. If you do not implement this method, the web view will behave as if the user selected the Cancel button. */- webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(NSString * _Nullable result))completionHandler{ NSLog(@"%s and prompt is %@ and defaulttext is %@ and frame is %@",__FUNCTION__,prompt,defaultText,frame);}/*! @abstract Allows your app to determine whether or not the given element should show a preview. @param webView The web view invoking the delegate method. @param elementInfo The elementInfo for the element the user has started touching. @discussion To disable previews entirely for the given element, return NO. Returning NO will prevent webView:previewingViewControllerForElement:defaultActions: and webView:commitPreviewingViewController: from being invoked. This method will only be invoked for elements that have default preview in WebKit, which is limited to links. In the future, it could be invoked for additional elements. */- webView:(WKWebView *)webView shouldPreviewElement:(WKPreviewElementInfo *)elementInfo API_AVAILABLE){ NSLog(@"%s-%@",__FUNCTION__, elementInfo); return YES;}/*! @abstract Allows your app to provide a custom view controller to show when the given element is peeked. @param webView The web view invoking the delegate method. @param elementInfo The elementInfo for the element the user is peeking. @param defaultActions An array of the actions that WebKit would use as previewActionItems for this element by default. These actions would be used if allowsLinkPreview is YES but these delegate methods have not been implemented, or if this delegate method returns nil. @discussion Returning a view controller will result in that view controller being displayed as a peek preview. To use the defaultActions, your app is responsible for returning whichever of those actions it wants in your view controller's implementation of -previewActionItems. Returning nil will result in WebKit's default preview behavior. webView:commitPreviewingViewController: will only be invoked if a non-nil view controller was returned. */- (nullable UIViewController *)webView:(WKWebView *)webView previewingViewControllerForElement:(WKPreviewElementInfo *)elementInfo defaultActions:(NSArray<id <WKPreviewActionItem>> *)previewActions API_AVAILABLE){ NSLog(@"%s",__FUNCTION__); return nil;}/*! @abstract Allows your app to pop to the view controller it created. @param webView The web view invoking the delegate method. @param previewingViewController The view controller that is being popped. */- webView:(WKWebView *)webView commitPreviewingViewController:(UIViewController *)previewingViewController API_AVAILABLE){ NSLog(@"%s",__FUNCTION__);}@end

一.因而直接流入js代码, 大家能够做过多事务,下面已经关系一 .1Modify the
document一.二 Listen for events一.叁 Load resources一.4Communicate back to
your application

 WKUserContentController *wkuserCVC = [[WKUserContentController alloc]init]; WKUserScript *script = [[WKUserScript alloc]initWithSource:@"js code" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]; [wkuserCVC addUserScript:script];

2.WKUserContentController是用来给JS注入对象的,注入对象后,JS端就能够动用:

window.webkit.messageHandlers.<name>.postMessage(<messageBody>) 

来调用发送数据给iOS端,比如:

window.webkit.messageHandlers.AppModel.postMessage({body: '传数据'});

OC则是流入对象是,设置了三个代理

#pragma mark @protocol WKScriptMessageHandler <NSObject>/*! @abstract Invoked when a script message is received from a webpage. @param userContentController The user content controller invoking the delegate method. @param message The script message received. */- userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ NSLog(@"%s and messgae is %@\n\n\n",__FUNCTION__,message);}

当今我们通过上述代码的求学,基本大体精通了WKwebview
的API的应用,那中间大致共计有二柒多少个类,
还有众多的合计。常用的大家先是领会了,
然后不常用的望族也得以多商讨一下。

OC代码咋是接到代理现在,展现原生的控件,代码如下,那里大家

- webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(NSString * _Nullable result))completionHandler{ NSLog(@"%s\n\n\n prompt:%@ defaultText:%@ frame:%@",__FUNCTION__,prompt,defaultText,frame); UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:@"prompt" message:[NSString stringWithFormat:@"prompt:%@\ndefaultText:%@\nframe:%@",prompt,defaultText,frame] preferredStyle:UIAlertControllerStyleAlert]; [alertVc addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { textField.textColor = [UIColor blueColor]; }]; [alertVc addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { completionHandler([[alertVc.textFields lastObject] text]); }]]; [self presentViewController:alertVc animated:YES completion:^{ }];}

WKWebView
有3特性格estimatedProgress,这一个就是加载进程。大家利用KVO监听这么些属性值的变动,就足以显示加载进度了。

 [self.webview addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];

#pragma mark - WKNavigationDelegate- webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(WKNavigationActionPolicy))decisionHandler { NSString *hostname = navigationAction.request.URL.host.lowercaseString; if (navigationAction.navigationType == WKNavigationTypeLinkActivated && ![hostname containsString:@".baidu.com"]) {// 对于跨域,需要手动跳转 [[UIApplication sharedApplication] openURL:navigationAction.request.URL]; // 不允许web内跳转 decisionHandler(WKNavigationActionPolicyCancel); } else { self.progressView.alpha = 1.0; decisionHandler(WKNavigationActionPolicyAllow); } NSLog(@"%s", __FUNCTION__);}

因为今后WKWebView会忽视暗中认可的网络存款和储蓄, NSU福睿斯LCache,
NSHTTPCookieStorage, NSCredentialStorage。
近日是那样的,WKWebView有协调的历程,同样也有友好的贮存空间用来存款和储蓄cookie和cache,
别的的互联网类如NSU卡宴LConnection是不能访问到的。
同时WKWebView发起的能源请求也是不经过NSU大切诺基LProtocol的,导致不能够自定义请求不可不可以认的,WKWebView确实要好用,应用软件内的展现也很好,但调侃的地点也是蛮多的。

 WKWebsiteDataStore *dataStore = [WKWebsiteDataStore defaultDataStore];// dataStore = [WKWebsiteDataStore nonPersistentDataStore];//适合隐私浏览 NSSet *set = [WKWebsiteDataStore allWebsiteDataTypes]; NSArray *arr = [set allObjects]; // [dataStore fetchDataRecordsOfTypes:(nonnull NSSet<NSString *> *) completionHandler:^(NSArray<WKWebsiteDataRecord *> * _Nonnull) { // }]; [dataStore removeDataOfTypes:set forDataRecords:arr completionHandler:^{ }]; [dataStore removeDataOfTypes:set modifiedSince:[NSDate dateWithTimeIntervalSinceNow:-100] completionHandler:^{ }]; 

先是种:有好多的app直接行使在webview的代理中经过拦截的方式与native进行互相,平常是透过拦截url
scheme判断是或不是是大家须求拦截处理的url及其所对应的要拍卖的效益是如何。任意版本都协理。第二种:iOS7从此出了JavaScriptCore.framework用于与JS交互,不过不协助iOS陆,对于还亟需援救iOS6的app,就不能够设想这几个了。若供给驾驭,看最终的引荐阅读。第二种:WebViewJavascriptBridge开源库使用,本质上,它也是由此webview的代理拦截scheme,然后注入相应的JS。第各样:react-native

对于第三种,其实在上文的讲解中大概穿插了,
那里大致计算下:一.OC调用JS代码

UIWebview:[webView stringByEvaluatingJavaScriptFromString:@"helloWithName"];WKWebview: [self.webView evaluateJavaScript:@"document.getElementById('soufunclient').innerHTML" completionHandler:^(id _Nullable string, NSError * _Nullable error) { shareContent = [NSString stringWithFormat:@"%@",string]; }];//在这里说明一下,上面的方法是同步的,而WKwebView的方法是异步的。

2JS调用OC代码UIWebView:

//具体让js公告native实行形式调用,我们可以让js发生1个特有的呼吁。能够让Native代码可以阻挡到,而且否则用户发现。产业界壹般的落到实处方案是在网页中加载3个隐形的iframe来兑现该功效。通过将iframe的src钦定为多个差异日常的UPAJEROL,落成在-
webView:(UIWebView )webView shouldStartLoadWithRequest:(NSU昂科拉LRequest
)request
navigationType:(UIWebViewNavigationType)navigationType;方案中实行拦截处理。对应的js调用代码如下:

 function loadURL { var iFrame; iFrame = document.createElement; iFrame.setAttribute("src", url); iFrame.setAttribute("style", "display:none;"); iFrame.setAttribute("height", "0px"); iFrame.setAttribute("width", "0px"); iFrame.setAttribute("frameborder", "0"); document.body.appendChild; // 发起请求后这个iFrame就没用了,所以把它从dom上移除掉 iFrame.parentNode.removeChild; iFrame = null; }

WKWebView:对于WkwebView大家地点三.二OC怎么样给JS注入对象及JS怎么着给IOS发送数据已经讲到了。

4858.com ,当然那里的下结论是最简便的。我们有没有想过,大家怎么才能驾驭js里的怎样措施OC可以调用,同样OC里怎么模块,JS也领略能够调用呢,React
Native 是FaceBook开源的, 大家可以自动百度学习,很牛啊。

对此第2种:javascriptcore.framework大家后边分享JSPatch的时候简单讲过,那里我们再从那篇文章不难讲一下js和OC是经过那一个框架相互调用的法门。

对此第二种WebViewJavascriptBridge,第1方框架,挺盛名的,
具体的完毕是通过webview拦截的法子。作者并未有仔细的去看,就不讲了,感兴趣的同班能够斟酌。

对于React Native
,那些达成原理很牛掰,我们温馨能够搜一下规律看看,这些利用JSX编写,就js和html……,这么些东西一贯不学过,笔者也不多说了,有时间或然必要学习一下的,某些商行曾经应用生产了,解决了想热修复一样的效率。

后天JS和OC交互大家大致就讲完了。1UIWebview拦截
,执行js代码二WkWebview注入js对象,OC回调,当然笔者个人觉得在服务器发送响应头也是能够做阻止的,和UIwebview一样,然则尚未发觉网上有如此说的。三便是WebViewJavascriptBridge第二方拦截框架,根本上是对上边的包裹四ReacNative
这几个就隐瞒了,基本正是用的 JSBridge ,运营时

终极大家来读书那两篇作品一.
文章是2个马来人收拾的,是1篇尤其不易的篇章。

进阶

1.行使safari对webview举办调剂

感兴趣的同学也能够学习一下

二.WebView加载HTML图片大小自适应与小说自动换行

编程,Ajax,jquery框架,当然若是你对前者感兴趣能够修行一下

3.WKWebViewでJavaScript(Alert,Confirm,Prompt)の処理

4WBWebViewConsole

5 iOS10ATS问题

6Cookie问题

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有