Как проверить работоспособность IOS из JavaScript внутри WKWebView на iPadOS 13 - PullRequest
0 голосов
/ 21 октября 2019

Когда я использую XCode 11.1 для тестирования моего гибридного приложения с использованием WKWebView в симуляторе «iPhone 8» и проверки агента пользователя с помощью Safari 13, я получаю следующую строку:

"Mozilla/5.0 (iPhone; CPU iPhone OS 13_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" 

Однако при тестированииВ приложении в симуляторе iPad Pro (11 дюймов) я обнаружил, что для userAgent задана следующая строка:

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)"

Обратите внимание, что в этой строке нет подстроки iPad", ни используемая версия IOS, ни тот факт, что это мобильное приложение.

Поскольку мое приложение проверяет userAgent, чтобы определить, работает ли оно под IOS, на iPhone это работает нормально, но представляетпроблема в том, как теперь запустить этот тест на iPad, работающих под управлением iPadOS 13. Обратите внимание, что это не имеет ничего общего с отображением веб-представления, оно связано с тем, устанавливать ли связь между JavaScript и Objective C или нет. .

Мое приложение отлично работало на всех iPad, работающих под управлением IOS 12, так как пользовательский агент - это то, что я ожидал:

"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16B92"

Как мне теперь определить frвнутри Javascript, работает ли мой код на iPad с iPadOS 13 или более поздней версии?

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Есть несколько способов, которыми я мог бы решить эту проблему.

  1. Не тестировать вообще - просто использовать valuJavascript после загрузки, чтобы сообщить веб-представлению, что это был IOS.

  2. Обнаружение iPad с помощью Objective C / swift и регистрация пользовательской строки пользовательского агента в настройках пользователя по умолчанию, содержащих строку «iPad: перед созданием веб-представления

    // get original UserAgent string by using temporal webView
    WKWebView *tmp = [[WKWebView alloc] init];
    NSString *originalUA = [tmp stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
    
    // create custom UserAgent string
    NSString *customUA = [NSString stringWithFormat:@"%@ %@", originalUA, @" iPad"];
    
    // set custom UserAgent as default
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:customUA , @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
    

Однако, возможно, по неправильным причинам я решил использовать решение из Отсутствует iPad планшет Веб-трафик

следующим образом

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 ;
0 голосов
/ 21 октября 2019

Это не ошибка любого рода. Это действительно хорошая функция, впервые появившаяся в iOS 13. По умолчанию iPad представляет собой настольный браузер, а не мобильный браузер.

...