JavaScriptを介してiPad / iPhone WebViewを検出する


91

ウェブサイトがipad safari内またはアプリケーションWebView内で実行されている場合、javascriptを介して異なる方法はありますか?


これはiOSデバイス専用ですか?
Nicolas S

回答:


79

これは、の組み合わせを使用window.navigator.userAgentしてwindow.navigator.standalone。iOS Webアプリに関連する4つの状態すべてを区別できます。サファリ(ブラウザー)、スタンドアロン(フルスクリーン)、uiwebview、iOSではありません。

デモ: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
};

chromeはSafariuserAgentにあります。webcal://.icsファイルに必要なプロトコルに関して異なる動作をする
neaumusic

@svladaより詳しい情報を提供できますか?デバイスとそのiOSバージョンは何でしたか?
sonlexqt

78

ユーザーエージェント

UIWebViewで実行

Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/98176

iPadのSafariで実行する

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

Mac OS XのSafariで実行する

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

Mac OS X上のChromeでの実行

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

Mac OS X上のFireFoxでの実行

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);

本当に。そもそもなぜ両方のユーザーエージェントを自分で見たのかわかりません。あなたの答えをありがとう:)
sod

4
iPhone 5s / iOS 7では動作しません。両方UIWebViewとSafariがSafariユーザーエージェントにあるためです
Razor

@Razorそうですね。テストVersionとは対照的に、Safari最新のiOSに私のために働きました。
unceus 14

1
@unceusどういう意味か正確に説明してくださいVersion。あなたは置き換えてくださいSafariVersionしてvar is_uiwebview行?
Henrik Petterson、2016年

@HenrikPettersonユーザーエージェント文字列に関して、上記の最初の2つのユーザーエージェント文字列(UIWebViewとiPad上のSafari)を比較すると、UIWebView文字列には「バージョン」が含まれますが、iPadには含まれません。正規表現を変更することでの目標は不明確であり、それを作成するためのヘルプを探しているようです。
unceus 2016年

10

そのまま使用できると思いますUser-Agent


更新

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

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

違いは、サファリの人が言うことです Safari/6531.22.7


解決

var isSafari = navigator.userAgent.match(/Safari/i) != null;

ええ、でも、ユーザーエージェントでUIWebViewを検出するための特定の文字列や何かがあるかどうか、何か考えはありますか?これまでのところ、何も見つかりませんでした...
Adam Tal

これはiOSデバイス専用ですか?
Nicolas S

Nicolasの数値は現時点では異なります。これは、 SafariとUIWebView(および「スタンドアロン」、つまりホーム画面のWebアプリ)が異なるエンジンを使用しているためです。これはiOS 5で変更されました
Ben

数字を意味するのでSafari/.....はなく、UIWebViewにそれ自体が欠落していることを意味します
Nicolas S

@Nicolas:申し訳ありませんが、注意を払っていませんでした。これがiOS5の場合であるかどうかを誰かが確認できたのでしょうか?
Ben

7

うん:

// 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);

11
これは、WebViewだけでなくSafariブラウザにも一致します。
Petr Peller

@ThinkingStuff - -あなたは、Mac OS(デスクトップブラウザ)とiPadのSafariブラウザとの間に、私のヘルプdiiferentiate助けてもらえstackoverflow.com/questions/58344491/...
newdeveloper

5

これらのソリューションをすべて試しましたが、私の場合
はうまくいきませんでした。Webview内でTelegramを検出するつもりでした。Safariが電話スタイルのテキストを「tel:」接頭辞の付いたリンクに変更していることに気付いたので、これを使用してこのコードを記述しました。テストできます: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>

1
ユーザーや他の開発者が電話検出を無効にすることができるので、あなたはそのようなトリックに頼るべきではありません。
–БодровАндрей2018

@БодровАндрей私はあなたに同意します、しかしそれが私が見つけることができる唯一の方法でした、私は将来的にそのために異なるユーザーエージェントをアップルが提供することを望みます
Amir Khorsandi '19

これはiOS 13でサポートされていないことに注意してくださいnavigator.platform === 'MacIntel'。デスクトップモードが使用されている場合、これは、デフォルトでデスクトップモードを使用するため、特にiPadOS 13 Mobile Safariに影響します。
robocat

@robocatあなたは正しいです。それはiOS 13 iPadで壊れており、私は今のところ解決策なしで立ち往生しています。あなたはここに関連する質問のヘルプ私を喜ばせることができstackoverflow.com/questions/58344491/...
newdeveloper

2

Neoneyeのソリューションは機能しなくなり(コメントを参照)、簡略化できます。一方、UAで「Safari」のみをテストすると、iOSハンドヘルドデバイスよりもはるかに多くのアドレスが指定されます。

これは私が使用しているテストです:

var is_ios = /(iPhone|iPod|iPad).*AppleWebKit.*Safari/i.test(navigator.userAgent);

2

このアプローチはiOS 10以前のバージョンでは機能しないことに注意してください。

2018年の春には、提案された方法がどれも機能しなかったため、新しいアプローチを思いつきました(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

iPadデバイス用のコードを拡張することもできます。これでうまくいくはずです。

テレグラム、Facebook、VK Webビューでうまく機能しました。


iPhone Xの場合は375/812、また新しい:iPhone Xs Max / Xrの場合は414/896
Oleg Dater 2018年

1

Working 15.02.19

iOSでWebビューを検出する別のソリューションは、のサポート/存在を確認することですnavigator.mediaDevices

if (navigator.mediaDevices) {
    alert('has mediaDevices');
} else {
    alert('has no mediaDevices');
}

私の場合、すべてのWebviewをキャッチする必要はありませんでしたが、カメラ/マイク入力をサポートしていないもの(注意:Webviewではアラートはトリガーされないため、デバッグのためにdomで何かを変更してください)


0

このコードは、ホーム画面に追加されたアイコンからアクセスされているかどうかを確認します。

if (window.navigator.standalone == true) {
//not in safari
}

しかし、UIWebViewでどのように反応するのかはわかりません。他に考えられる唯一の解決策は、ユーザーエージェントを取得- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationTypeするか、アクセスしているページのクエリ文字列を使用して、ページがWebビューからアクセスされていることを識別するためにページが使用するものに置き換えることです。


おかげで、私はそのコードを使用していましたが、さらに制御が必要です。スタンドアロンモードのみを検出するようで、残りはSafariと見なされます。
Adam Tal

0

Modernizrを使用して、このようにindexeddbをチェックすることをお勧めします。ユーザーエージェントの構成(デバイス、OS、ブラウザーなど)でそれをクロスチェックすることもできますが、純粋な機能の検出がより推奨されるようです。


計画のように聞こえますが、どの機能をテストしますか?indexeddbは、ie、chrome、firefoxなどの一部です
SSED

0

前回これが必要になったとき(WebViewの目的でのみ)、次のチェックを使用しました。

function isIOS() {
     return !/safari/.test( window.navigator.userAgent.toLowerCase()) || navigator.platform === 'iOS' || navigator.platform === 'iPhone';
}

これは、iOS13デスクトップモード(プラットフォームがiPadまたはiPhoneに設定されなくなった)、およびiPod touch(プラットフォームは「iPod」または「iPod touch」の場合があります)では機能しません。
robocat

0

iPhoneまたはiPadを検出する簡単なソリューションを見つけました。これは私にとってはうまくいきます。

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
    }

0

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)

-2

クライアント側のJavascriptで使用できるものは特にないと思いますが、元のUIWebViewが実行できることを制御できる場合は、それが生成するユーザーエージェント文字列を試してみて、それをテストすることを検討してください。代わりにクライアント側のJavascript?私が知っている少しハックですが、ちょっと…この質問は、ユーザーエージェントを微調整する上でいくつかの指針を与えるかもしれません:

UIWebView(iPhone SDK)でユーザーエージェントを変更する


ありがとう、ベン。残念ながら、私はアプリのUIWebViewユーザーエージェントを制御できません。
Adam Tal

-7

@ Sod、まあ、答えはありませんが、なぜ確認したいのか確信が持てません。ブラウザエンジンのサファリ(Browser)とアプリケーションのどちらがWebkitと同じかだけなので、はいアプリケーションは次のようなブラウザエンジン機能を設定できます、アプリケーションがJSまたはDisplay Imageなどを実行したいかどうか…

ブラウザでサポートされているFlashかどうか、ブラウザが画像を表示するかどうか、またはおそらく画面サイズを確認する必要があるかどうか、特定のプロパティを確認する必要があると思います。


コメントでこれについて議論できます。とにかくwevbviewを確認するための多くの例がある
Yozi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.