Кордова приложение не отображается правильно на 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 84

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)


  1. добавить больше изображений заставок на 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)


  1. исправьте свой стиль на 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 deviceready

var 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 теперь имеет белую границу внизу.