and*_*111 19 javascript mobile-safari uiwebview ios wkwebview
如何使用javascript可靠地检测到在WKWebView中加载页面?我希望能够检测到这些情况:
有一个关于UIWebView的一个类似的问题在这里.但它已经很老了,我不确定它是否仍适用于WKWebView.
hex*_*lys 30
使用WKWebView与UIWebView应用程序测试后,接受的答案无效
正如文章所提到的,唯一的HTML5功能差异是IndexedDB支持.所以我会寻求更可靠的模式:
if (navigator.platform.substr(0,2) === 'iP'){
//iOS (iPhone, iPod or iPad)
var lte9 = /constructor/i.test(window.HTMLElement);
var nav = window.navigator, ua = nav.userAgent, idb = !!window.indexedDB;
if (ua.indexOf('Safari') !== -1 && ua.indexOf('Version') !== -1 && !nav.standalone){
//Safari (WKWebView/Nitro since 6+)
} else if ((!idb && lte9) || !window.statusbar.visible) {
//UIWebView
} else if ((window.webkit && window.webkit.messageHandlers) || !lte9 || idb){
//WKWebView
}
}
Run Code Online (Sandbox Code Playgroud)
您可能会问:为什么不使用UserAgent?这是因为Android浏览器将其用作设置!所以,我们永远不要相信任何UA.仅浏览器功能和属性检查.
另外我注意到QuickTime
插件总是作为旧的Safari和UIWebView中的其他浏览器的一部分加载.但是WKWebView中不再存在该插件.因此,您可以使用QuickTime
插件存在作为额外检查.
9/23/16编辑:我调整了Safari 10的代码,不再允许唯一的idb检查是可靠的,如@xmnboy所述.要丢弃Safari 10,它会检查旧的webkit引擎错误,该错误仅适用于Safari 9.2; 我window.statusbar.visible
在iOS 9和10之间进行了一些比较测试之后使用了一个可靠的指示信号.(请检查)
鉴于Apple在iOS 10中对UIWebView的行为进行了更改,这是一个新答案,该答案结合了@ Justin-Michael的原始响应和@hexalys的后续收藏。
var isWKWebView = false ;
if( navigator.platform.substr(0,2) === 'iP' ) { // iOS detected
if( window.webkit && window.webkit.messageHandlers ) {
isWKWebView = true ;
}
}
Run Code Online (Sandbox Code Playgroud)
事实证明,贾斯汀的答案确实是更好的功能检测机制,因为它适用于iOS 9和iOS 10。
不知道当我们进入iOS 11时会发生什么。:-)
资格:如果您使用的是官方的Cordova WKWebView插件来构建您的Webview应用程序,则此测试将起作用,因为该插件确实初始化了该addScriptMessageHandler
方法,如@hexalys在本文评论中所述。当存在WKWebView插件时,Cordova正在使用该机制来定义到本机桥的新JS。
搜索addScriptMessageHandler
在该插件回购,看到的最后的ios-wkwebview-exec.js
文件在回购的一些实施细则(或搜索字符串window.webkit.messageHandlers
在该文件)。
Jus*_*ael -2
更新:这不再有效,请参阅上面评价较高的答案!
您可以检查window.webkit.messageHandlers
WKWebKit 是否存在用于接收来自 JavaScript 的消息。如果它存在,那么您就在一个WKWebView
.
与简单的用户代理检查相结合应该可以解决问题:
var iOS = (navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? true : false);
var isWKWebView = false;
if (window.webkit && window.webkit.messageHandlers) {
isWKWebView = true;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13646 次 |
最近记录: |