Có cách nào để phân biệt thông qua javascript nếu trang web chạy bên trong ipad safari hoặc bên trong ứng dụng WebView không?
Có cách nào để phân biệt thông qua javascript nếu trang web chạy bên trong ipad safari hoặc bên trong ứng dụng WebView không?
Câu trả lời:
Điều này sử dụng kết hợp của window.navigator.userAgent
và window.navigator.standalone
. Nó có thể phân biệt giữa tất cả bốn trạng thái liên quan đến ứng dụng web iOS: safari (trình duyệt), độc lập (toàn màn hình), uiwebview và không phải iOS.
Demo: http://jsfiddle.net/ThinkingStiff/6qrbn/
var standalone = window.navigator.standalone,
userAgent = window.navigator.userAgent.toLowerCase(),
safari = /safari/.test( userAgent ),
ios = /iphone|ipod|ipad/.test( userAgent );
if( ios ) {
if ( !standalone && safari ) {
//browser
} else if ( standalone && !safari ) {
//standalone
} else if ( !standalone && !safari ) {
//uiwebview
};
} else {
//not iOS
};
Safari
trong userAgent. nó thường chạy khác liên quan đến yêu cầu với webcal://
giao thức cho các tập tin .ics
Chạy trong UIWebView
Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/98176
Chạy trong Safari trên iPad
Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3
Chạy trong Safari trên Mac OS X
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.5 Safari/534.55.3
Chạy trong Chrome trên Mac OS X
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19
Chạy trong FireFox trên Mac OS X
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0
var is_uiwebview = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent);
var is_safari_or_uiwebview = /(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent);
UIWebView
và Safari có Safari
trong user agent của họ
Version
trái ngược Safari
với tôi đã làm việc trong iOS mới nhất.
Version
? Bạn có thay thế Safari
bằng Version
trong var is_uiwebview
dòng?
Tôi nghĩ rằng bạn có thể chỉ cần sử dụng User-Agent
.
CẬP NHẬT
Trang được duyệt bằng iPhone Safari
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7
Tôi sẽ thử trong giây lát với UIWebView
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Mobile/8B117
Sự khác biệt là Safari nói Safari/6531.22.7
Giải pháp
var isSafari = navigator.userAgent.match(/Safari/i) != null;
Safari/.....
bản thân là mất tích trong UIWebView
Vâng:
// is this an IPad ?
var isiPad = (navigator.userAgent.match(/iPad/i) != null);
// is this an iPhone ?
var isiPhone = (navigator.userAgent.match(/iPhone/i) != null);
// is this an iPod ?
var isiPod = (navigator.userAgent.match(/iPod/i) != null);
Tôi đã thử tất cả các giải pháp này nhưng không hiệu quả trong trường hợp của tôi,
tôi sẽ phát hiện Telegram bên trong Webview. Tôi nhận thấy Safari đang thay đổi văn bản kiểu điện thoại thành một liên kết có tiền tố "tel:", vì vậy tôi đã sử dụng điều này để viết mã này, bạn có thể kiểm tra nó: jsfiddle
<!DOCTYPE html>
<html>
<head></head>
<body>
<ul id="phone" style="opacity:0">
<li>111-111-1111</li>
</ul>
</body>
</html>
<script>
var html = document.getElementById("phone").innerHTML;
if (navigator.platform.substr(0,2) === 'iP') {
if (html.indexOf('tel:') == -1)
alert('not safari browser');
else
alert('safari browser');
}
else
alert('not iOS');
</script>
navigator.platform === 'MacIntel'
. Điều này đặc biệt ảnh hưởng đến iPadOS 13 Mobile Safari vì nó sử dụng Chế độ máy tính để bàn theo mặc định.
Giải pháp của Neoneye không hoạt động nữa (xem nhận xét) và có thể được đơn giản hóa. Mặt khác, chỉ thử nghiệm "Safari" trong UA phản ánh nhiều hơn các thiết bị cầm tay ios.
Đây là bài kiểm tra tôi đang sử dụng:
var is_ios = /(iPhone|iPod|iPad).*AppleWebKit.*Safari/i.test(navigator.userAgent);
Lưu ý rằng phương pháp này không hoạt động đối với iOS 10 và các phiên bản cũ hơn.
Vào mùa xuân năm 2018, không có phương pháp nào được đề xuất phù hợp với tôi vì vậy tôi đã đưa ra một cách tiếp cận mới (không dựa trên userAgent):
const hasValidDocumentElementRatio =
[ 320 / 454 // 5, SE
, 375 / 553 // 6, 7, 8
, 414 / 622 // 6, 7, 8 Plus
, 375 / 812 // X
, 414 / 896 // Xs, Xr
].some(ratio =>
ratio === document.documentElement.clientWidth /
document.documentElement.clientHeight
)
const hasSafariInUA = /Safari/.test(navigator.userAgent)
const isiOSSafari = hasSafariInUA && hasValidDocumentElementRatio // <- this one is set to false for webviews
https://gist.github.com/BorisChumichev/7c0ea033daf33da73306a396ffa174d1
Chúng tôi hoan nghênh bạn mở rộng mã cho các thiết bị iPad, tôi nghĩ nó sẽ làm được điều này.
Hoạt động tốt với Telegram, Facebook, VK webviews.
Working 15.02.19
Một giải pháp khác để phát hiện các lần xem web trên iOS là kiểm tra sự hỗ trợ / tồn tại của navigator.mediaDevices
.
if (navigator.mediaDevices) {
alert('has mediaDevices');
} else {
alert('has no mediaDevices');
}
Trong trường hợp của tôi, tôi không cần phải bắt tất cả các lần xem web, nhưng những lần xem không hỗ trợ đầu vào máy ảnh / micrô (Lời nhắc: Cảnh báo không kích hoạt trong Chế độ xem web, vì vậy hãy đảm bảo thay đổi một cái gì đó trong dom cho mục đích gỡ lỗi)
Tôi biết mã này sẽ kiểm tra xem nó có đang được truy cập từ một biểu tượng được thêm vào màn hình chính hay không:
if (window.navigator.standalone == true) {
//not in safari
}
nhưng tôi không chắc nó sẽ phản ứng như thế nào trong UIWebView. Giải pháp khác duy nhất mà tôi có thể nghĩ đến là sử dụng tác nhân người dùng hoặc sử dụng - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
và thay thế chuỗi truy vấn của trang bạn đang truy cập bằng một thứ mà trang sử dụng để xác định rằng nó đang được truy cập từ chế độ xem web.
Lần trước tôi cần cái này (CHỈ cho mục đích WebView), tôi đã sử dụng kiểm tra này:
function isIOS() {
return !/safari/.test( window.navigator.userAgent.toLowerCase()) || navigator.platform === 'iOS' || navigator.platform === 'iPhone';
}
Tôi đã tìm thấy một giải pháp đơn giản để phát hiện iPhone hoặc iPad. Điều này phù hợp với tôi.
var is_iPad = navigator.userAgent.match(/iPad/i) != null;
var is_iPhone = navigator.userAgent.match(/iPhone/i) != null;
if(is_iPad || is_iPhone == true){
//perform your action
}
Thử với iOS 13
function mobileDetect() {
var agent = window.navigator.userAgent;
var d = document;
var e = d.documentElement;
var g = d.getElementsByTagName('body')[0];
var deviceWidth = window.innerWidth || e.clientWidth || g.clientWidth;
// Chrome
IsChromeApp = window.chrome && chrome.app && chrome.app.runtime;
// iPhone
IsIPhone = agent.match(/iPhone/i) != null;
// iPad up to IOS12
IsIPad = (agent.match(/iPad/i) != null) || ((agent.match(/iPhone/i) != null) && (deviceWidth > 750)); // iPadPro when run with no launch screen can have error in userAgent reporting as an iPhone rather than an iPad. iPadPro width portrait 768, iPhone6 plus 414x736 but would probably always report 414 on app startup
if (IsIPad) IsIPhone = false;
// iPad from IOS13
var macApp = agent.match(/Macintosh/i) != null;
if (macApp) {
// need to distinguish between Macbook and iPad
var canvas = document.createElement("canvas");
if (canvas != null) {
var context = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
if (context) {
var info = context.getExtension("WEBGL_debug_renderer_info");
if (info) {
var renderer = context.getParameter(info.UNMASKED_RENDERER_WEBGL);
if (renderer.indexOf("Apple") != -1) IsIPad = true;
}
;
}
;
}
;
}
;
// IOS
IsIOSApp = IsIPad || IsIPhone;
// Android
IsAndroid = agent.match(/Android/i) != null;
IsAndroidPhone = IsAndroid && deviceWidth <= 960;
IsAndroidTablet = IsAndroid && !IsAndroidPhone;
message = ""
if (IsIPhone) {
message = "Device is IsIPhone"
}
else if (IsIPad) {
message = "Device is ipad"
} else if (IsAndroidTablet || IsAndroidPhone || IsAndroid) {
message = "Device is Android"
} else {
message = "Device is Mac || Windows Desktop"
}
return {
message: message,
isTrue: IsIOSApp || IsAndroid || IsAndroidTablet || IsAndroidPhone
}
}
const checkMobile = mobileDetect()
alert(checkMobile.message + " =====> " + checkMobile.isTrue)
Tôi không nghĩ rằng có bất kỳ thứ gì cụ thể nào bạn có thể sử dụng trong Javascript phía máy khách, nhưng nếu bạn có quyền kiểm soát những gì UIWebView gốc có thể làm, bạn có thể muốn xem xét chơi với chuỗi tác nhân người dùng mà nó tạo và thử nghiệm điều đó trong Javascript phía máy khách thay thế? Tôi biết một chút lỗi, nhưng này… Câu hỏi này có thể cung cấp một số gợi ý về cách điều chỉnh tác nhân người dùng:
@ Sod, Tôi không có câu trả lời, nhưng tôi không thuyết phục tại sao bạn muốn kiểm tra, Vì, trình duyệt engine cho dù safari (Trình duyệt) hoặc Ứng dụng của nó sẽ giống như chỉ Webkit của nó, Có Ứng dụng có thể định cấu hình các khả năng của Browser engine như , cho dù ứng dụng muốn chạy JS hay Display Image, v.v.
Tôi tin rằng, bạn phải kiểm tra một số thuộc tính nhất định xem Flash được hỗ trợ bởi Trình duyệt hay trình duyệt có hiển thị hình ảnh hay không, hoặc có thể bạn muốn kiểm tra kích thước màn hình,