Пользовательская схема URL-адресов WKWebView не работает с https? (смешанный контент заблокирован)

У меня есть WKWebView для загрузки веб-сайта с пользовательской схемой URL-адресов (mycustomurl://), реализованной с помощью WKURLScheme, которую веб-сайт будет вызывать с помощью GET. Все работает должным образом, когда веб-сайт находится в http://, но ломается, когда я переключаюсь на https:// со следующей ошибкой:

[blocked] The page at https:// (url snipped) was not allowed to display insecure content from mycustomurl://(url snipped). 

Обратный вызов WKURLScheme никогда не срабатывал, поэтому я подозреваю, что Safari или более высокая мощность заблокировали его:/

Я уже прочесывал ТАК обсуждения на ATS, ничего из этого не сработало. Я видел некоторые обсуждения, такие как этот, в котором это упоминалось, потому что Safari блокирует смешанный контент, и когда я попробовал это непосредственно в Safari, результат был тот же (заблокировано).

Кажется, здесь нет решения? Кажется, мы не можем отключить ограничение смешанного контента в Safari. Тогда как следует использовать и реализовывать настраиваемую схему URL, потому что https всегда должен быть лучшим выбором, чем http?

Я заметил, что в большинстве учебных пособий по пользовательским схемам URL используется http вместо https...


person bkaooo    schedule 13.04.2018    source источник
comment
Возможно, это то, что вы могли бы попробовать явно разрешить в -(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler? Попробуйте реализовать его и посмотрите, сможете ли вы вызвать decisionHandler(WKNavigationActionPolicyAllow);   -  person wottle    schedule 16.04.2018
comment
Я думаю о том, как, возможно, загрузить небезопасный ресурс локально в приложение, а затем заставить веб-просмотр загрузить ресурс оттуда, используя что-то вроде [_webView loadFileURL:fileURL allowingReadAccessToURL:baseURL] Хотя не знаю, как реализовать, скажите мне, имеет ли это смысл, и если кто-то может помочь мне хэш это решение   -  person illis69    schedule 28.06.2018
comment
Вы нашли решение этой проблемы?   -  person Tako    schedule 08.03.2019
comment
@Tako - для полезного обходного пути см. Мой ответ   -  person Shirkrin    schedule 14.08.2019


Ответы (2)


Не уверен, что этот ответ все еще актуален, но фактическим рабочим решением является использование пользовательского WKUrlSchemeHandler для загрузки исходной https-страницы.

Недавно я столкнулся с аналогичной проблемой (попытка подключиться к серверу WebSocket на устройстве с https-страницы), и единственный способ, который я нашел, чтобы заставить это работать, сохраняя при этом защиту приложения с помощью https, был следующим не очень хорошим обходным путем:

  • зарегистрируйте свой собственный WKUrlSchemeHandler для mycustomurl://
  • зарегистрируйте второй пользовательский WKUrlSchemeHandler, скажем, myapp-remote://
  • inside webView:startURLSchemeTask::
    • retrieve the request url from the urlSchemeTask.Request
    • заменить myapp-remote:// на https://
    • создайте NSURLDataRequest с https-url
    • вернуть ответ и полученные данные в urlSchemeTask

С помощью этой настройки вы можете получить свою https-страницу, используя myapp-remote:// в качестве схемы для начальной загрузки, сохраняя безопасность TLS, а также проверку, а также иметь рабочие ссылки mycustomurl://, которые ваш WKWebView не будет блокировать.

Моя реализация находится на C# для Xamarin, но я могу предоставить ее для ясности, если это необходимо.

person Shirkrin    schedule 13.08.2019

Согласно демонстрации Apple Office: https://developer.apple.com/videos/play/wwdc2017/220/

1, добавьте код

+(NSDictionary *)cacheDicSchema {
    return @{@"mwweb-local":@"http",
             @"mwweb-locals":@"https"};
}

-(void)hk_setPreferences:(WKPreferences *)perferences {
    [self hk_setPreferences:perferences];

    if (@available(iOS 11.0, *)) {
        for (NSString *key in [[[self class] cacheDicSchema] allKeys]) {
            [self setURLSchemeHandler:[[WeakSchemeHandler alloc] init]  forURLScheme:key];
        }
    }
}

2, contentRuleList в качестве значения и компилируется в wkwebview

[
 {
 "trigger":
    { "url-filter" : ".*"
    },
 "action": {
    "type" : "make-https"
    }
 }
 }
]

скомпилировать в WKWebView

   if (@available(iOS 11.0, *)) {
        [[WKContentRuleListStore defaultStore]
         compileContentRuleListForIdentifier:@"MWWKWebViewContentRules" encodedContentRuleList:contentRuleList
         completionHandler:^(WKContentRuleList *contentRuleList, NSError *error) {
             if (error == nil) {
                 [config.userContentController addContentRuleList:contentRuleList];
             }else{
                MWHYLog(@"compileContentRuleListForIdentifier Error == %@",[error description]);
             }
         }];

}

3, в html

 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta nemo name="basepath" content="/c_mboss/smartcloud">

    <script nonce="abc">
        var domDoc = document.documentElement;
        var domMeta = document.querySelector('meta[name="viewport"]');
        var dpr = window.devicePixelRatio || 1;
        //        var dpr = 1;
        var scale = 1 / dpr;
        var rem = domDoc.clientWidth * dpr / 7.5;
        var content = 'width=' + domDoc.clientWidth * dpr +
            ', initial-scale=' + scale +
            ', maximum-scale=' + scale +
            ', minimum-scale=' + scale +
            ', user-scalable=no';

        domMeta.setAttribute('content', content);
        domDoc.style.fontSize = rem + 'px';
      </script>
    <title>XXX</title>
    <link href="https://webresource.mwee.cn/c_mboss/smartcloud/v_20180515163218/css/dist/main.min.css" rel="stylesheet">
</head>

<body>
    <div id="appview"></div>
    <input id="umengId" value="1264335506" style="display:none;" />

    <img> src="mwweb-locals://XXXXX/index/kdxz.png"/>

    <script type="text/javascript" src="mwweb-locals://XXXXX/js/mmm.js"></script>
    <script type="text/javascript" src="mwweb-locals://XXXXX/js/app.js"></script>
</body>
</html>

<img> работай, как сказало яблоко.

<script> никогда не получается, пробую снова и снова ............

С ошибкой в ​​сафари

[Warning] The page at https://10.88.3.95:3334/c_mboss/smartcloud/index/index was allowed to display insecure content from mwweb-locals://XXXXX/index/kdxz.png. (index, line 44)

[Warning] [blocked] The page at https://10.88.3.95:3334/c_mboss/smartcloud/index/index was not allowed to run insecure content from mwweb-locals://XXXXX/js/mmm.js.

[Warning] [blocked] The page at https://10.88.3.95:3334/c_mboss/smartcloud/index/index was not allowed to run insecure content from mwweb-locals://XXXXX/js/app.js.

Я предполагаю, что политика безопасности контента конфликтует с WKSchemeHandler в WKWebView, политика безопасности контента заблокирует процесс загрузки статических ресурсов до WKSchemeHandler.

Здесь странно, почему он заблокировал <img>, но не <script>, как только вы добавили contentRuleList в WKWebView, который загружает веб-сайт loadRequest https://XXXXX.

person aiquantong    schedule 26.07.2018