Кордова приложение не отображается правильно на iPhone X (симулятор)
вчера я тестировал свое приложение на основе Cordova на симуляторе iPhone X в Xcode 9.0 (9A235), и это не выглядело хорошо. Во-первых, вместо того, чтобы заполнить всю область экрана, была черная область выше и ниже содержимого приложения. И что еще хуже, между содержимым приложения и черным были две белые полосы.
добавлять cordova-plugin-wkwebview-engine
поэтому Cordova отображает с помощью WKWebView (не UIWebView) исправляет белые полосы.
Мое приложение не переносится из UIWebView в WKWebView из-за производительности и утечки памяти проблемы при использовании cordova-plugin-wkwebview-engine
которые возникают при загрузке изображений, загруженных из iNAPP Purchase размещенного контента в HTML5 холст (direct file://
доступ к Webview невозможен из-за ограничений безопасности в WKWebView, поэтому данные изображения должны быть загружены через cordova-plugin-file
).
эти скриншоты показывают тестовое приложение с синим фоном, установленные на <body
>.
Выше и ниже UIWebView, вы можете увидеть белые полосы, но не с WKWebView:
Как Кордова Webviews показывают черные области по сравнению с родным приложением, которое заполняет всю область экрана:
7 ответов:
я нашел решение для белых полос здесь:
Set
viewport-fit=cover
на просмотра<meta>
тег, например:<meta name="viewport" content="initial-scale=1, width=device-width, height=device-height, viewport-fit=cover">
белые полосы в UIWebView затем исчезают:
решение для удаления черных областей (предоставлено @dpogue в комментарии ниже) - это использовать LaunchStoryboard images С
cordova-plugin-splashscreen
чтобы заменить устаревшие образы запуска, используемые Cordova по умолчанию. Делать Итак, добавьте следующее на платформу iOS в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>
затем создайте изображения со следующими размерами в
res/screen/ios
(удалить все существующие):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
как только черные полосы будут удалены, есть еще одна вещь, которая отличается от iPhone X для решения: строка состояния больше 20px из-за "выреза", что означает, что любой контент в дальней верхней части вашего приложения Cordova будет скрыт это:
вместо жесткого кодирования отступа в пикселях, вы можете обрабатывать это автоматически в CSS с помощью нового
safe-area-inset-*
константы в iOS 11.Примечание: в iOS 11.0 функция для обработки этих констант называлась
constant()
но в iOS 11.2 Apple переименовала его вenv()
(посмотреть здесь), поэтому для покрытия обоих случаев вам нужно перегрузить правило CSS обоими и полагаться на CSS запасной вариант механизм чтобы применить соответствующий:body{ padding-top: constant(safe-area-inset-top); padding-top: env(safe-area-inset-top); }
результат будет таким, как хотелось бы: содержимое приложения охватывает весь экран, но не затеняется "зарубкой":
я создал тестовый проект Cordova, который иллюстрирует вышеуказанные шаги:webview-тест.молнии
Примечания:
кнопки в футере
- если ваше приложение имеет кнопки нижнего колонтитула (как у меня), вы также нужно будет подать заявку
safe-area-inset-bottom
чтобы избежать их перекрытия с помощью кнопки виртуального дома на iPhone X.- в моем случае, я не мог применить это к
<body>
поскольку нижний колонтитул абсолютно расположен, поэтому мне нужно было применить его непосредственно к нижнему колонтитулу:
.toolbar-footer{ margin-bottom: constant(safe-area-inset-bottom); margin-bottom: env(safe-area-inset-bottom); }
cordova-plugin-statusbar
- размер строки состояния изменился на iPhone X, поэтому более старые версии
cordova-plugin-statusbar
дисплей неправильно на iPhone X- Майк Хартингтон создал это тянуть запрос который применяет необходимые изменения.
- это было объединено в
cordova-plugin-statusbar@2.3.0
релиз, так что убедитесь, что вы используете по крайней мере эту версию, чтобы применить к безопасной области вставкиsplashscreen
- ограничения раскадровки LaunchScreen изменились на iOS 11 / iPhone X, что означает, что splashscreen появился для "прыжка" при запуске при использовании существующих версии плагина (посмотреть здесь).
- это было зафиксировано в отчете об ошибке CB-13505, исправлен PR cordova-ios#354 и освобожден в
cordova-ios@4.5.4
, поэтому убедитесь, что вы используете последние версии
для ручного исправления существующего проекта cordova
черные полосы
добавьте это в ваш информация.файл plist. Исправление образа запуска-это отдельная проблема, т. е. как добавить изображение запуска iPhoneX
<key>UILaunchStoryboardName</key> <string>CDVLaunchScreen</string>
белые полосы
Set viewport-fit=обложка в метатеге
<meta name="viewport" content="initial-scale=1, width=device-width, height=device-height, viewport-fit=cover">
есть 3 шага, которые вы должны сделать
для iOs 11 строка состояния и проблемы с заголовком iPhone X
1. Видовой экран подходит крышка
добавить
viewport-fit=cover
мета тега в<header>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0,viewport-fit=cover">
Demo: https://jsfiddle.net/gq5pt509 (Индекс.html)
- добавить больше изображений заставок на
config.xml
внутри<platform name="ios">
не пропустите этот шаг, это требуется для получения настройки экрана на iPhone X работа
<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 -->
Demo:https://jsfiddle.net/mmy885q4 (config.xml)
- исправьте свой стиль на CSS
использовать
safe-area-inset-left
,safe-area-inset-right
,safe-area-inset-top
илиsafe-area-inset-bottom
пример: (использовать в случае!)
#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}); }
бонус: вы можете добавить класс тело, как
is-android
илиis-ios
on devicereadyvar platformId = window.cordova.platformId; if (platformId) { document.body.classList.add('is-' + platformId); }
так что вы можете сделать что-то вроде этого на CSS
.is-ios #header { // Properties }
просто обратите внимание, что
constant
использование ключевых слов для безопасного-площадь поля была обновлена доenv
для 11.2 бета+https://webkit.org/blog/7929/designing-websites-for-iphone-x/
в моем случае, когда каждый экран-заставка был индивидуально разработан вместо автогенерации или выложен в формате раскадровки, мне пришлось придерживаться моей устаревшей конфигурации экрана запуска и добавлять портретные и ландшафтные изображения для целевой ориентации iPhoneX 1125×2436 в конфигурацию.xml вот так:
<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" />
после добавления их в конфиг.xml ("viewport-fit=cover" уже был установлен в index.hml) мое приложение, построенное с помощью Ionic Pro, заполняет весь экран на устройствах iPhoneX.
Если вы устанавливаете новые версии
ionic
глобально, вы можете запуститьionic cordova resources
и он будет генерировать все изображения splashscreen для вас вместе с правильными размерами.
обратите внимание, что эта статья: https://medium.com/the-web-tub/supporting-iphone-x-for-mobile-web-cordova-app-using-onsen-ui-f17a4c272fcd имеет разные размеры, чем выше и страница плагина cordova:
Default@2x~iphone~anyany.png (= 1334x1334 = 667x667@2x) Default@2x~iphone~comany.png (= 750x1334 = 375x667@2x) Default@2x~iphone~comcom.png (= 750x750 = 375x375@2x) Default@3x~iphone~anyany.png (= 2436x2436 = 812x812@3x) Default@3x~iphone~anycom.png (= 2436x1242 = 812x414@3x) Default@3x~iphone~comany.png (= 1242x2436 = 414x812@3x) Default@2x~ipad~anyany.png (= 2732x2732 = 1366x1366@2x) Default@2x~ipad~comany.png (= 1278x2732 = 639x1366@2x)
Я изменил размер изображения, как указано выше, и обновил
ios
платформы иcordova-plugin-splashscreen
до последней и вспышка на белый экран после Второй проблемы была исправлена. Однако начальное изображение spash теперь имеет белую границу внизу.