J'ai testé mon application basée sur Cordova hier sur l'iPhone X Simulator sous Xcode 9.0 (9A235) et cela n'a pas l'air bien. Tout d'abord, au lieu de remplir la totalité de la zone d'écran, il y avait une zone noire au-dessus et au-dessous du contenu de l'application… .. Et pire, entre le contenu de l'application et le noir se trouvaient deux barres blanches.
L'ajout de cordova-plugin-wkwebview-engine
afin que Cordova rende à l'aide de WKWebView (et non d'UIWebView) corrige les barres blanches . De plus, mon application n'est pas migrée d'UIWebView vers WKWebView en raison de problèmes de performances et de fuite de mémoire lors de l'utilisation de cordova-plugin-wkwebview-engine
lors du chargement d'images téléchargées depuis Inapp dans un canevas HTML5 (l'accès direct à file://
par Webview n'est pas possible en raison de restrictions de sécurité dans WKWebView, de sorte que les données de l'image doivent être chargées via cordova-plugin-file
).
Ces captures d'écran montrent une application de test avec un arrière-plan bleu défini sur le <body
>. Au-dessus et au-dessous de UIWebView, vous pouvez voir les barres blanches, mais pas avec WKWebView:
Les deux Webviews Cordova présentent les zones noires par rapport à une application native qui remplit la totalité de la zone d'écran:
J'ai trouvé la solution aux barres blanches ici :
Définissez viewport-fit=cover
sur l’étiquette <meta>
de la fenêtre, c.-à-d.:
<meta name="viewport" content="initial-scale=1, width=device-width, height=device-height, viewport-fit=cover">
Les barres blanches dans UIWebView disparaissent ensuite:
La solution pour supprimer les zones noires (fournie par @dpogue dans un commentaire ci-dessous) consiste à utiliser LaunchStoryboard images avec cordova-plugin-splashscreen
pour remplacer les anciennes images de lancement, utilisées par défaut par Cordova. Pour ce faire, ajoutez les éléments suivants à la plate-forme iOS dans 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>
Créez ensuite les images avec les dimensions suivantes dans res/screen/ios
(supprimez celles existantes):
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, l'adresse de l'iPhone X est différente: la barre d'état dépasse 20 pixels en raison de l'encoche qui signifie que tout contenu situé tout en haut de votre application Cordova sera masqué. :
Plutôt que de coder en dur un remplissage en pixels, vous pouvez le gérer automatiquement en CSS à l'aide des nouvelles constantes safe-area-inset-*
dans iOS 11.
Remarque: dans iOS 11.0, la fonction permettant de gérer ces constantes s'appelait constant()
mais dans iOS 11.2, Apple l'a renommée en env()
( voir ici ), Par conséquent, pour couvrir les deux cas, vous devez surcharger le CSS. règle avec les deux et s’appuie sur le 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 celui souhaité: le contenu de l'application couvre la totalité de l'écran mais n'est pas masqué par le "cran":
J'ai créé un projet test Cordova qui illustre les étapes ci-dessus: webview-test.Zip
Remarques:
Boutons de pied de page
safe-area-inset-bottom
pour éviter qu'ils ne soient superposés par le bouton d'accueil virtuel sur iPhone X. <body>
car le pied de page est positionné de manière absolue. Je devais donc 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
cordova-plugin-statusbar
ne s'affichent donc pas correctement sur iPhone X[email protected]
, assurez-vous donc que vous utilisez au moins cette version pour l'appliquer aux espaces sécurisés.écran de démarrage
[email protected]
, assurez-vous donc que vous utilisez une version récente de la plate-forme cordova-ios
.orientation de l'appareil
safe-area-inset
, ce qui obscurcira à nouveau le contenu par l'encoche (comme souligné par jms dans un commentaire ci-dessous). cordova-plugin-wkwebview-engine
.Pour référence, c’est le numéro initial de Cordova que j’ai ouvert et qui capture ceci: https://issues.Apache.org/jira/browse/CB-13273
Pour une correction manuelle d'un projet cordova existant}
Les barres noires
Ajoutez ceci à votre fichier info.plist. La correction de l’image de lancement est un problème distinct, c’est-à-dire Comment ajouter une image de lancement iPhoneX
<key>UILaunchStoryboardName</key>
<string>CDVLaunchScreen</string>
Les barres blanches
Définissez viewport-fit = cover dans la balise meta
<meta name="viewport" content="initial-scale=1, width=device-width, height=device-height, viewport-fit=cover">
pour la barre d'état d'iOs 11 et les problèmes d'en-tête de l'iPhone X
1. Couverture de la fenêtre d'affichage
Ajoutez 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émo:https://jsfiddle.net/gq5pt509 (index.html)
config.xml
à l'intérieur de <platform name="ios">
Ne sautez pas cette étape, cela est nécessaire pour que l'écran s'adapte à iPhone X fonctionne
<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émo:https://jsfiddle.net/mmy885q4 (config.xml)
Utilisez safe-area-inset-left
, safe-area-inset-right
, safe-area-inset-top
ou safe-area-inset-bottom
Exemple: (à utiliser 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 telle que is-Android
ou is-ios
sur deviceready
var platformId = window.cordova.platformId;
if (platformId) {
document.body.classList.add('is-' + platformId);
}
Donc, vous pouvez faire quelque chose comme ça sur CSS
.is-ios #header {
// Properties
}
Dans mon cas où chaque écran de démarrage était conçu individuellement au lieu d'être généré automatiquement ou présenté dans un format de story-board, je devais m'en tenir à la configuration de mon écran de lancement Legacy et ajouter des images de portrait et de paysage pour cibler les orientations iPhoneX 1125 × 2436 dans config.xml ainsi:
<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 créée avec Ionic Pro occupe tout l’écran des appareils iPhoneX.
Notez simplement que le mot clé constant
utilisé pour les marges des zones sûres a été mis à jour à env
pour 11.2 bêta
https://webkit.org/blog/7929/designing-websites-for-iphone-x/
Si vous installez globalement des versions plus récentes de ionic
, vous pouvez exécuter ionic cordova resources
et il générera toutes les images d'écran d'accueil avec les tailles correctes.
Correction du problème de rotation d'écran pour iPhone X/XS
Sur l'iPhone X/XS, une rotation de l'écran entraîne l'utilisation d'une valeur incorrecte par la hauteur de la barre d'en-tête, car le calcul de l'espace sécurisé * ne reflétait pas les nouvelles valeurs dans le temps pour l'actualisation de l'interface utilisateur. Ce problème existe dans UIWebView même dans le dernier iOS 12. Une solution de contournement consiste à insérer une marge supérieure de 1px, puis à l'inverser rapidement, ce qui déclenchera le recalcul immédiat de la zone sécurisée-inset- *. Un correctif un peu moche mais cela fonctionne si vous devez rester avec UIWebView pour une raison ou une autre.
window.addEventListener("orientationchange", function() {
var originalMarginTop = document.body.style.marginTop;
document.body.style.marginTop = "1px";
setTimeout(function () {
document.body.style.marginTop = originalMarginTop;
}, 100);
}, false);
Le code a pour but de modifier légèrement le document.body.style.marginTop, puis de l'inverser. Cela ne doit pas nécessairement être "1px". Vous pouvez choisir une valeur qui ne provoque pas le scintillement de votre interface utilisateur, mais qui remplit son objectif.