6 votes

Le schéma d'URL personnalisé de WKWebView ne fonctionne pas avec https ? (contenu mixte bloqué)

J'ai un WKWebView pour charger un site web qui a un schéma d'url personnalisé (mycustomurl://) implémenté avec WKURLScheme, que le site web appellera en utilisant GET. Tout fonctionne comme prévu lorsque le site Web se trouve à http://, mais s'interrompt lorsque je passe à https:// avec l'erreur suivante :

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

Le rappel de WKURLScheme n'a jamais été effectué, je soupçonne donc Safari ou un pouvoir supérieur de l'avoir bloqué :/.

J'ai déjà passé au peigne fin les discussions sur l'ATS, mais rien n'a fonctionné. J'ai vu quelques discussions comme celui-ci qui a mentionné que c'est parce que Safari bloque les contenus mixtes et lorsque j'ai essayé directement sur Safari, j'ai obtenu le même résultat (blocage).

Il ne semble pas y avoir de solution à ce problème ? Il semble que nous ne puissions pas désactiver la restriction de contenu mixte de Safari. Dans ce cas, comment utiliser et mettre en œuvre un schéma d'URL personnalisé, car https devrait toujours être un meilleur choix que http ?

J'ai remarqué que la plupart des tutoriels sur les schémas d'URL personnalisés ont http au lieu de https...

7voto

Shirkrin Points 2211

Je ne suis pas sûr que cette réponse soit toujours d'actualité, mais une solution efficace consiste à utiliser un fichier personnalisé WKUrlSchemeHandler pour charger la page https initiale.

J'ai récemment été confronté à un problème similaire (j'essayais de me connecter à un serveur WebSocket sur un appareil à partir d'une page https) et la seule façon que j'ai trouvée pour que cela fonctionne tout en gardant l'application sécurisée par https était la solution de contournement suivante qui n'est pas très agréable :

  • enregistrez vos données personnalisées WKUrlSchemeHandler para mycustomurl://
  • enregistrer un deuxième personnalisé WKUrlSchemeHandler Disons que myapp-remote://
  • à l'intérieur de webView:startURLSchemeTask: :
    • récupérer l'url de la requête à partir de la urlSchemeTask.Request
    • remplacer myapp-remote:// con https://
    • créer un NSURLDataRequest avec le https-url
    • renvoie la réponse et les données extraites à l'utilisateur. urlSchemeTask

Avec cette configuration, vous pouvez récupérer votre page https en utilisant myapp-remote:// comme schéma pour le chargement initial, en conservant la sécurité TLS ainsi que la validation et en ayant également des mycustomurl:// références que votre WKWebView ne bloque pas.

Mon implémentation est en C# pour Xamarin mais je peux la fournir pour plus de clarté si c'est nécessaire.

0voto

aiquantong Points 41

Selon le bureau d'apple Demo : https://developer.apple.com/videos/play/wwdc2017/220/

1, ajouter le code

+(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, la contentRuleList comme valeur, et compiler dans le wkwebview

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

compiler dans le 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,en 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> font le travail comme la pomme l'a dit.

<script> ne fonctionnent jamais, j'essaie encore et encore ............

Avec l'erreur en safari

[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.

Je suppose que la politique de sécurité du contenu entre en conflit avec le WKSchemeHandler dans WKWebView, la politique de sécurité du contenu bloque le processus de chargement des ressources statiques avant le WKSchemeHandler.

Ici il est étrange que pourquoi il a bloqué <img> mais pas <script> une fois que vous avez ajouté contentRuleList dans le WKWebView dont le site web loadRequest https://XXXXX .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X