Ich habe meine Cordova-basierte App gestern auf dem iPhone X Simulator in Xcode 9.0 (9A235) getestet und sah nicht gut aus. Erstens, anstatt den gesamten Bildschirmbereich auszufüllen, befand sich oberhalb und unterhalb des App-Inhalts ein schwarzer Bereich . Schlimmer noch, zwischen dem App-Inhalt und dem schwarzen Bereich befanden sich zwei weiße Balken.
Durch das Hinzufügen von cordova-plugin-wkwebview-engine
für die Wiedergabe von Cordova mit WKWebView (nicht UIWebView) werden die weißen Balken behoben. Durch meine Anwendung wird die Migration von UIWebView zu WKWebView nicht durchgeführt, da bei der Verwendung von cordova-plugin-wkwebview-engine
beim Laden von Bildern, die von Inapp Purchase heruntergeladener gehosteter Inhalt heruntergeladen werden, Probleme auftreten in einen HTML5-Canvas (direkter file://
-Zugriff durch Webview ist aufgrund von Sicherheitsbeschränkungen in WKWebView nicht möglich, daher müssen die Bilddaten über cordova-plugin-file
geladen werden).
Diese Screenshots zeigen eine Test-App mit blauem Hintergrund im <body
>. Oberhalb und unterhalb von UIWebView können Sie die weißen Balken sehen, jedoch nicht mit WKWebView:
Beide Cordova-Webviews zeigen die schwarzen Bereiche im Vergleich zu einer nativen App, die den gesamten Bildschirm ausfüllt:
Ich habe die Lösung für die weißen Balken hier gefunden:
Legen Sie viewport-fit=cover
im Viewport <meta>
-Tag fest, d. H .:
<meta name="viewport" content="initial-scale=1, width=device-width, height=device-height, viewport-fit=cover">
Die weißen Balken in UIWebView verschwinden dann:
Die Lösung zum Entfernen der schwarzen Bereiche (bereitgestellt von @dpogue in einem Kommentar weiter unten) besteht darin, LaunchStoryboard-Images mit cordova-plugin-splashscreen
zu verwenden, um die von Cordova standardmäßig verwendeten Start-Images zu ersetzen. Fügen Sie dazu der iOS-Plattform in config.xml
Folgendes hinzu:
<platform name="ios">
<splash src="res/screen/ios/[email protected]~iphone~anyany.png" />
<splash src="res/screen/ios/[email protected]~iphone~comany.png" />
<splash src="res/screen/ios/[email protected]~iphone~comcom.png" />
<splash src="res/screen/ios/[email protected]~iphone~anyany.png" />
<splash src="res/screen/ios/[email protected]~iphone~anycom.png" />
<splash src="res/screen/ios/[email protected]~iphone~comany.png" />
<splash src="res/screen/ios/[email protected]~ipad~anyany.png" />
<splash src="res/screen/ios/[email protected]~ipad~comany.png" />
<!-- more iOS config... -->
</platform>
Dann erstellen Sie die Bilder mit den folgenden Abmessungen in res/screen/ios
(entfernen Sie vorhandene Bilder):
[email protected]~iphone~anyany.png - 1334x1334
[email protected]~iphone~comany.png - 750x1334
[email protected]~iphone~comcom.png - 1334x750
[email protected]~iphone~anyany.png - 2208x2208
[email protected]~iphone~anycom.png - 2208x1242
[email protected]~iphone~comany.png - 1242x2208
[email protected]~ipad~anyany.png - 2732x2732
[email protected]~ipad~comany.png - 1278x2732
Nachdem die schwarzen Balken entfernt wurden, unterscheidet sich das iPhone X von einer anderen Sache: Die Statusleiste ist aufgrund der "Kerbe" größer als 20 Pixel, was bedeutet, dass alle Inhalte ganz oben in Ihrer Cordova-App durch diese verdeckt werden :
Anstatt eine Auffüllung in Pixel fest zu codieren, können Sie dies in CSS automatisch mit den neuen safe-area-inset-*
-Konstanten in iOS 11 behandeln.
Hinweis: in iOS 11.0 hieß die Funktion zum Umgang mit diesen Konstanten constant()
, aber in iOS 11.2 hat Apple sie in env()
( siehe hier ) umbenannt. Damit beide Fälle abgedeckt werden können, müssen Sie überladen die CSS-Regel mit beiden und stützt sich auf den CSS-Fallback-Mechanismus , um den entsprechenden Code anzuwenden:
body{
padding-top: constant(safe-area-inset-top);
padding-top: env(safe-area-inset-top);
}
Das Ergebnis ist dann wie gewünscht: Der Inhalt der App deckt den gesamten Bildschirm ab, wird jedoch nicht durch die "Kerbe" verdeckt:
Ich habe ein Cordova-Testprojekt erstellt, das die obigen Schritte veranschaulicht: webview-test.Zip
Anmerkungen:
Fußzeilenschaltflächen
safe-area-inset-bottom
anwenden, um zu vermeiden, dass sich die virtuelle Home-Taste auf dem iPhone X überlappt. <body>
anwenden, da die Fußzeile absolut positioniert ist. Daher musste ich sie direkt auf die Fußzeile anwenden:.toolbar-footer{
margin-bottom: constant(safe-area-inset-bottom);
margin-bottom: env(safe-area-inset-bottom);
}
cordova-Plugin-Statusleiste
cordova-plugin-statusbar
auf dem iPhone X falsch angezeigt werden[email protected]
-Version integriert. Stellen Sie daher sicher, dass Sie mindestens diese Version für die Anwendung auf Safe-Area-Insets verwendenbegrüßungsbildschirm
[email protected]
veröffentlicht. Stellen Sie daher sicher, dass Sie eine aktuelle Version verwenden der cordova-ios
-Plattform.geräteorientierung
safe-area-inset
nicht erneut angewendet wird, wodurch der Inhalt erneut durch die Kerbe verdeckt wird (wie in einem Kommentar unten durch jms hervorgehoben). . cordova-plugin-wkwebview-engine
verwendet wird.Dies ist die ursprüngliche Cordova-Ausgabe, die ich aufgeschlagen habe. Sie enthält folgende Informationen: https://issues.Apache.org/jira/browse/CB-13273
Für eine manuelle Korrektur an einem vorhandenen Cordova-Projekt
Die schwarzen Balken
Fügen Sie dies zu Ihrer Datei info.plist hinzu. Das Beheben des Startabbilds ist ein separates Problem, d. H. Hinzufügen eines iPhoneX-Startabbilds
<key>UILaunchStoryboardName</key>
<string>CDVLaunchScreen</string>
Die weißen Balken
Setze viewport-fit = cover im Meta Tag
<meta name="viewport" content="initial-scale=1, width=device-width, height=device-height, viewport-fit=cover">
für iOs 11-Statusleiste und iPhone X-Headerprobleme
1. Passform für Ansichtsfenster
Fügen Sie viewport-fit=cover
zum Meta Ihres Viewports in <header>
hinzu.
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0,viewport-fit=cover">
Demo:https://jsfiddle.net/gq5pt509 (index.html)
config.xml
in <platform name="ios">
hinzuÜberspringen Sie diesen Schritt nicht. Dies ist erforderlich, um screen fit für iPhone X zu verwenden
<splash src="your_path/[email protected]~ipad~anyany.png" /> <!-- 2732x2732 -->
<splash src="your_path/[email protected]~ipad~comany.png" /> <!-- 1278x2732 -->
<splash src="your_path/[email protected]~iphone~anyany.png" /> <!-- 1334x1334 -->
<splash src="your_path/[email protected]~iphone~comany.png" /> <!-- 750x1334 -->
<splash src="your_path/[email protected]~iphone~comcom.png" /> <!-- 1334x750 -->
<splash src="your_path/[email protected]~iphone~anyany.png" /> <!-- 2208x2208 -->
<splash src="your_path/[email protected]~iphone~anycom.png" /> <!-- 2208x1242 -->
<splash src="your_path/[email protected]~iphone~comany.png" /> <!-- 1242x2208 -->
Demo:https://jsfiddle.net/mmy885q4 (config.xml)
Verwenden Sie safe-area-inset-left
, safe-area-inset-right
, safe-area-inset-top
oder safe-area-inset-bottom
Beispiel: (In Ihrem Fall verwenden!)
#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: Sie können Körperklasse wie is-Android
oder is-ios
zu deviceready hinzufügen.
var platformId = window.cordova.platformId;
if (platformId) {
document.body.classList.add('is-' + platformId);
}
So können Sie so etwas in CSS machen
.is-ios #header {
// Properties
}
In meinem Fall, in dem jeder Begrüßungsbildschirm einzeln erstellt wurde, anstatt automatisch generiert oder in einem Storyboard-Format angeordnet zu sein, musste ich bei meiner Legacy Launch-Bildschirmkonfiguration bleiben und dem Zielsystem für das iPhoneX 1125 × 2436 in der config.xml Hoch- und Querformatbilder hinzufügen wie so:
<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" />
Nach dem Hinzufügen zu config.xml ("viewport-fit = cover" war bereits in index.hml festgelegt) füllt meine mit Ionic Pro erstellte App den gesamten Bildschirm auf iPhoneX-Geräten.
Nur ein Hinweis, dass das Schlüsselwort constant
für Ränder im sicheren Bereich für 11.2 beta + auf env
aktualisiert wurde
https://webkit.org/blog/7929/designing-websites-for-iphone-x/
Wenn Sie neuere Versionen von ionic
global installieren, können Sie ionic cordova resources
ausführen, und es werden alle Begrüßungsbildschirmbilder mit den richtigen Größen für Sie generiert.
Fix für iPhone X/XS Bildschirmdrehungsproblem
Bei iPhone X/XS führt eine Bildschirmrotation dazu, dass die Höhe der Kopfleistenleiste einen falschen Wert verwendet, da die Berechnung des Einzugsbereichs für sichere Bereiche * die neuen Werte nicht rechtzeitig für die Aktualisierung der Benutzeroberfläche widerspiegelte. Dieser Fehler ist in UIWebView selbst in der neuesten Version von iOS 12 vorhanden. Eine Problemumgehung besteht darin, einen oberen Rand von 1 Bildpunkt einzufügen und ihn schnell wieder rückgängig zu machen. Dadurch wird der Bereich für sicheres Einfügen * sofort ausgelöst. Eine etwas hässliche Lösung, aber es funktioniert, wenn Sie aus irgendeinem Grund bei UIWebView bleiben müssen.
window.addEventListener("orientationchange", function() {
var originalMarginTop = document.body.style.marginTop;
document.body.style.marginTop = "1px";
setTimeout(function () {
document.body.style.marginTop = originalMarginTop;
}, 100);
}, false);
Der Zweck des Codes besteht darin, den document.body.style.marginTop leicht zu ändern und dann umzukehren. Es muss nicht unbedingt "1px" sein. Sie können einen Wert auswählen, der Ihre Benutzeroberfläche nicht flackert, aber ihren Zweck erfüllt.