130 votes

L'application Cordova ne s'affiche pas correctement sur l'iPhone X (Simulateur)

J'ai testé mon application basée sur Cordova hier sur le simulateur de l'iPhone X dans Xcode 9.0 (9A235) et cela n'avait pas l'air bon. Tout d'abord, au lieu de remplir la totalité de l'écran, il y avait une zone noire au-dessus et en dessous du contenu de l'application. Et pire, entre le contenu de l'application et le noir, il y avait deux barres blanches.

Ajout de cordova-plugin-wkwebview-engine pour que le rendu Cordova utilise WKWebView (et non UIWebView) corrige les barres blanches. Mon application n'a pas migré de UIWebView vers WKWebView en raison de problèmes de performance et de fuite de mémoire lors de l'utilisation de la fonction cordova-plugin-wkwebview-engine qui se produisent lors du chargement d'images téléchargées à partir du contenu hébergé par Inapp Purchase dans un canevas HTML5 (direct file:// L'accès par le Webview n'est pas possible en raison des restrictions de sécurité dans WKWebView, les données de l'image doivent donc être chargées par l'intermédiaire de cordova-plugin-file ).

Ces captures d'écran montrent une application de test dont l'arrière-plan est bleu et qui est réglée sur l'écran d'accueil. <body >. Au-dessus et au-dessous de UIWebView, vous pouvez voir les barres blanches, mais pas avec WKWebView :


(source : <a href="https://cdn.pbrd.co/images/GKeaEPg.png" rel="noreferrer">pbrd.co </a>)


(source : <a href="https://cdn.pbrd.co/images/GKeaWwK.png" rel="noreferrer">pbrd.co </a>)

Les deux Webviews de Cordova présentent des zones noires par rapport à une application native qui remplit la totalité de l'écran :

0 votes

Intéressant avec wkwebview. Dans mon jeu, je ne l'avais pas en pleine largeur, mais aussi décalé du centre. Dans uiwebview, il garde la même taille, mais se centre au moins.

0 votes

J'ai eu ce problème aussi, alors j'ai trouvé une solution de contournement avec juste du CSS. pt.stackoverflow.com/a/263460/55076

0 votes

J'ai aussi ce problème. Il suffit d'ajouter le <meta> à mon fichier cordova index.hml comme d'autres listés ci-dessous ne fonctionne pas. J'utilise Cordova 7x avec cordova-ios 4.5.4. Y a-t-il autre chose que je doive faire ?

260voto

DaveAlden Points 18934

J'ai trouvé la solution pour les barres blanches aquí :

Définir viewport-fit=cover sur la fenêtre de visualisation <meta> c'est-à-dire :

<meta name="viewport" content="initial-scale=1, width=device-width, height=device-height, viewport-fit=cover">

Les barres blanches dans UIWebView disparaissent alors :

La solution pour supprimer les zones noires (fournie par @dpogue dans un commentaire ci-dessous) est d'utiliser Images de LaunchStoryboard con cordova-plugin-splashscreen pour remplacer les anciennes images de lancement, utilisées par Cordova par défaut. Pour ce faire, ajoutez ce qui suit à la plateforme iOS dans le fichier config.xml :

<platform name="ios">    
    <splash src="res/screen/ios/Default@2x~iphone~anyany.png" />
    <splash src="res/screen/ios/Default@2x~iphone~comany.png" />
    <splash src="res/screen/ios/Default@2x~iphone~comcom.png" />
    <splash src="res/screen/ios/Default@3x~iphone~anyany.png" />
    <splash src="res/screen/ios/Default@3x~iphone~anycom.png" />
    <splash src="res/screen/ios/Default@3x~iphone~comany.png" />
    <splash src="res/screen/ios/Default@2x~ipad~anyany.png" />
    <splash src="res/screen/ios/Default@2x~ipad~comany.png" />   

    <!-- more iOS config... -->
</platform>

Ensuite, créez les images avec les dimensions suivantes dans res/screen/ios (supprimez ceux qui existent déjà) :

Default@2x~iphone~anyany.png - 1334x1334
Default@2x~iphone~comany.png - 750x1334
Default@2x~iphone~comcom.png - 1334x750
Default@3x~iphone~anyany.png - 2208x2208
Default@3x~iphone~anycom.png - 2208x1242
Default@3x~iphone~comany.png - 1242x2208
Default@2x~ipad~anyany.png - 2732x2732
Default@2x~ipad~comany.png - 1278x2732

Une fois les barres noires supprimées, il y a un autre élément différent de l'iPhone X à prendre en compte : La barre d'état est plus grande que 20px en raison de l'"encoche", ce qui signifie que tout contenu situé tout en haut de votre application Cordova sera masqué par celle-ci :

Plutôt que de coder en dur un padding en pixels, vous pouvez le gérer automatiquement en CSS en utilisant la nouvelle fonction safe-area-inset-* dans iOS 11.

Note : dans iOS 11.0 la fonction pour gérer ces constantes était appelée constant() mais dans iOS 11.2 Apple l'a renommé en env() ( voir ici ), Par conséquent, pour couvrir les deux cas, vous devez surcharger la règle CSS avec ces deux éléments et vous appuyer sur l'attribut Mécanisme de repli CSS pour appliquer celui qui convient :

body{
    padding-top: constant(safe-area-inset-top);
    padding-top: env(safe-area-inset-top);
}

Le résultat est alors conforme aux attentes : le contenu de l'application couvre la totalité de l'écran, mais n'est pas masqué par l'"encoche" :

J'ai créé un projet de test Cordova qui illustre les étapes ci-dessus : webview-test.zip

Notes :

Boutons de pied de page

  • Si votre application comporte des boutons de pied de page (comme la mienne), vous devrez également appliquer les règles suivantes safe-area-inset-bottom pour éviter qu'ils ne soient recouverts par le bouton Home virtuel de l'iPhone X.
  • Dans mon cas, je n'ai pas pu l'appliquer à <body> car le pied de page est absolument positionné, j'avais donc besoin de l'appliquer directement au pied de page :

    .toolbar-footer{ margin-bottom: constant(safe-area-inset-bottom); margin-bottom: env(safe-area-inset-bottom); }

cordova-plugin-statusbar

  • La taille de la barre d'état a changé sur l'iPhone X, donc les anciennes versions de cordova-plugin-statusbar affichage incorrect sur l'iPhone X
  • Mike Hartington a créé cette demande de retrait qui applique les changements nécessaires.
  • Celle-ci a été fusionnée avec la cordova-plugin-statusbar@2.3.0 assurez-vous donc que vous utilisez au moins cette version pour appliquer à safe-area-insets

écran d'accueil

  • Les contraintes du storyboard de LaunchScreen ont changé sur iOS 11/iPhone X, ce qui signifie que l'écran d'accueil semblait "sauter" au lancement lors de l'utilisation des versions existantes du plugin ( voir ici ).
  • Ceci a été capturé dans le rapport de bogue CB-13505 , PR fixe cordova-ios#354 et publié en cordova-ios@4.5.4 Il faut donc s'assurer que vous utilisez une version récente de l'interface utilisateur de l'UE. cordova-ios plate-forme.

orientation du dispositif

  • Lors de l'utilisation d'UIWebView sous iOS 11.0, la rotation de portrait > paysage > portrait provoque l'apparition de l'erreur suivante safe-area-inset de ne pas être réappliqué, ce qui fait que le contenu est à nouveau masqué par l'encoche (comme le souligne l'élément jms dans un commentaire ci-dessous).
  • Cela se produit également si l'application est lancée en mode paysage puis tournée en mode portrait.
  • Cela ne se produit pas lorsque l'on utilise WKWebView par l'intermédiaire de cordova-plugin-wkwebview-engine .
  • Rapport radar : http://www.openradar.me/radar?id=5035192880201728
  • Mise à jour : il semble que cela ait été corrigé dans iOS 11.1

Pour référence, il s'agit du problème Cordova original que j'ai ouvert et qui capture ceci : https://issues.apache.org/jira/browse/CB-13273

0 votes

J'ai ajouté un commentaire sur le problème de Cordova, mais pour tous ceux qui trouvent ce problème ici : Pour supprimer les barres noires et prendre la pleine hauteur de l'écran, vous devez utiliser un LaunchStoryboard au lieu des images de l'écran d'accueil. Ceci est pris en charge par les versions plus récentes de Cordova : cordova.apache.org/docs/fr/latest/reference/

0 votes

@dpogue merci, j'ai essayé et ça marche : je vais mettre à jour la réponse pour l'inclure.

3 votes

Avez-vous des problèmes lorsque vous faites pivoter l'écran ? J'ai essayé, mais après avoir fait pivoter l'écran, tout est cassé (safe-area-inset-* ne met pas à jour ses valeurs en fonction de l'orientation de l'appareil ; et après avoir fait pivoter l'écran en portrait -> paysage -> portrait à nouveau, les valeurs initiales sont également cassées). Serait-ce un problème avec le navigateur Apple/Safari ?

38voto

coder Points 329

Pour une correction manuelle d'un projet Cordova existant

Les barres noires

Ajoutez ceci à votre info.plist fichier. La correction de l'image de lancement est une question distincte. Comment ajouter l'image de lancement de l'iPhoneX

<key>UILaunchStoryboardName</key>
<string>CDVLaunchScreen</string>

Les barres blanches

Définir viewport-fit=cover dans la balise méta

<meta name="viewport" content="initial-scale=1, width=device-width, height=device-height, viewport-fit=cover">

0 votes

Merci ! La modification du fichier .plist a le même effet que les modifications de la réponse choisie, mais elle est beaucoup plus rapide.

0 votes

Quel est l'effet de chacune de ces tâches sur la hauteur et la largeur des pixels du CSS ? Mon application comporte une série de divs étroits en haut (menus, etc.)... puis je calcule la hauteur de pixel restante pour que le dernier DIV remplisse le reste de l'écran. Actuellement, je peux voir la barre blanche inférieure couvrir une partie de ce DIV, mais je peux également dire qu'elle ne le couvre pas entièrement - ce qui implique que le DIV ne va toujours pas jusqu'au bas de l'écran. Et à son tour, mon application commence en dessous de la barre blanche supérieure, donc elle n'essaie même pas d'utiliser l'espace supérieur.

0 votes

Utilicé UILaunchStoryboardName et il a réussi à supprimer les barres noires. Mais mon écran d'accueil est agrandi. Quelle en est la raison ? La réponse acceptée ne fonctionne pas pour moi

18voto

l2aelba Points 3156

Il y a 3 étapes que vous devez suivre

pour les problèmes de barre d'état d'iOs 11 et d'en-tête d'iPhone X


1. Couvercle d'ajustement Viewport

Añadir viewport-fit=cover à la méta de votre fenêtre d'affichage dans <header>

<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0,viewport-fit=cover">

Démonstration : https://jsfiddle.net/gq5pt509 (index.html)


  1. Ajouter d'autres images d'accompagnement à votre config.xml à l'intérieur de <platform name="ios">

Ne sautez pas cette étape ce qui est nécessaire pour obtenir ajustement de l'écran para iPhone X travail

<splash src="your_path/Default@2x~ipad~anyany.png" />   <!-- 2732x2732 -->
<splash src="your_path/Default@2x~ipad~comany.png" />   <!-- 1278x2732 -->
<splash src="your_path/Default@2x~iphone~anyany.png" /> <!-- 1334x1334 -->
<splash src="your_path/Default@2x~iphone~comany.png" /> <!-- 750x1334  -->
<splash src="your_path/Default@2x~iphone~comcom.png" /> <!-- 1334x750  -->
<splash src="your_path/Default@3x~iphone~anyany.png" /> <!-- 2208x2208 -->
<splash src="your_path/Default@3x~iphone~anycom.png" /> <!-- 2208x1242 -->
<splash src="your_path/Default@3x~iphone~comany.png" /> <!-- 1242x2208 -->

Démonstration : https://jsfiddle.net/mmy885q4 (config.xml)


  1. Corrigez votre style sur CSS

Utilisez safe-area-inset-left , safe-area-inset-right , safe-area-inset-top o safe-area-inset-bottom

Ejemplo: (Utilisez dans votre cas !)

#header {
   position: fixed;
   top: 1.25rem; // iOs 10 or lower
   top: constant(safe-area-inset-top); // iOs 11
   top: env(safe-area-inset-top); // iOs 11+ (feature)

   // or use calc()
   top: calc(constant(safe-area-inset-top) + 1rem);
   top: env(constant(safe-area-inset-top) + 1rem);

   // or SCSS calc()
   $nav-height: 1.25rem;
   top: calc(constant(safe-area-inset-top) + #{$nav-height});
   top: calc(env(safe-area-inset-top) + #{$nav-height});
}

Bonus : Vous pouvez ajouter une classe de corps comme is-android o is-ios sur prêt à l'emploi

var platformId = window.cordova.platformId;
if (platformId) {
   document.body.classList.add('is-' + platformId);
}

Vous pouvez donc faire quelque chose comme ceci en CSS

.is-ios #header {
 // Properties
}

5voto

TaeKwonJoe Points 226

Dans mon cas, où chaque écran d'accueil a été conçu individuellement au lieu d'être généré automatiquement ou mis en page dans un format de story board, j'ai dû m'en tenir à ma configuration d'écran de lancement héritée et ajouter des images en portrait et en paysage pour cibler les orientations 1125×2436 de l'iPhoneX dans le fichier config.xml comme suit :

<splash height="2436" src="resources/ios/splash/Default-2436h.png" width="1125" />
<splash height="1125" src="resources/ios/splash/Default-Landscape-2436h.png" width="2436" />

Après avoir ajouté ces éléments à config.xml ("viewport-fit=cover" était déjà défini dans index.hml) mon application construite avec Ionic Pro remplit tout l'écran sur les appareils iPhoneX.

0 votes

Monsieur mais dans mon config.xml j'ai déjà ajouté au-dessus de cette ligne et viewport-fit=cover

0 votes

@Kapilsoni, il peut s'agir d'un problème avec le plugin Cordova UIWebView, WKWebView, SplashScreen, ou une combinaison de ces configurations. De plus, ciblez-vous XCode 10 ou 11 dans vos constructions ?

0 votes

Monsieur, je vise XCode 10 ?

2voto

Brent Points 111

Il est à noter que le constant L'utilisation du mot-clé pour les marges de sécurité a été mise à jour pour devenir ce qui suit env pour 11.2 beta+

https://webkit.org/blog/7929/designing-websites-for-iphone-x/

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