Додаток Кордова не відображається належним чином на iPhone X (Simulator)


121

Я вчора перевірив додаток на основі Кордови на iPhone X Simulator в Xcode 9.0 (9A235), і він виглядав не так добре. По-перше, замість заповнення площі на весь екран з'явилася чорна зона над і під вмістом програми. І ще гірше, між вмістом програми та чорним було дві білі смуги.

Якщо додати cordova-plugin-wkwebview-engineтак, що Кордова відображає за допомогою WKWebView (не UIWebView), фіксує білі смуги. Моє додаток не перенесено з UIWebView на WKWebView через проблеми з продуктивністю та пам'яттю при використанні, cordova-plugin-wkwebview-engineякі виникають під час завантаження зображень, завантажених із Inapp Purchase, розміщеного вмісту на полотно HTML5 (прямий file://доступ через веб-перегляд неможливий через обмеження безпеки в WKWebView, так дані зображення повинні бути завантажені через cordova-plugin-file).

Ці скріншоти показують тестовий додаток із синім фоном, встановленим на екрані <body>. Вище та нижче UIWebView ви можете бачити білі смуги, але не WKWebView:


(джерело: pbrd.co )


(джерело: pbrd.co )

Обидва веб-перегляди Кордови демонструють чорні області в порівнянні з нативним додатком, який заповнює область на весь екран:


Цікаво з wkwebview. У моїй грі я мав це не на повну ширину, а й зміщений від центру. У uiwebview він зберігав однакові розміри, але принаймні централізувався.
agmcleod

У мене була ця проблема теж, тому я зробив певний спосіб вирішити лише css, див. Pt.stackoverflow.com/a/263460/55076
Ігор

У мене теж є ця проблема. Просто додавання <meta>тегу до мого файлу cordova index.hml, як інші, перелічені нижче, не працює. Я запускаю Кордову 7x з cordova-ios 4.5.4 - чи потрібно ще щось робити?
ролінгер

Відповіді:


245

Я знайшов рішення білих барів тут :

Встановіть тег viewport-fit=coverвікна перегляду <meta>, тобто:

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

Білі смуги в UIWebView потім зникають:

Рішення для видалення чорних областей (надається @dpogue в коментарях нижче), щоб використовувати LaunchStoryboard зображення з cordova-plugin-splashscreenдля заміни застарілих запуску зображень, використовуваних Кордової за замовчуванням. Для цього додайте до платформи 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: адресна панель перевищує 20 пікселів через "виїмку", що означає, що будь-який вміст у дальній частині вашої програми Кордова буде затьмарений нею :

Замість того, щоб жорстко кодувати прокладку в пікселях, ви можете це обробляти автоматично в 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);
}

Потім результат є бажаним: вміст програми охоплює весь екран, але не затьмарюється "виїмкою":

Я створив тестовий проект Кордова, який ілюструє вищезазначені кроки: webview-test.zip

Примітки:

Кнопки нижнього колонтитулу

  • Якщо у вашому додатку є кнопки нижнього колонтитулу (як у мене), вам також потрібно буде подати заявку, 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випуск, тож переконайтеся, що ви використовуєте принаймні цю версію для застосування до безпечних областей

заставка

  • Обмеження на панелі розробки LaunchScreen змінилися на iOS 11 / iPhone X, тобто сплеск-екран, здавалося б, "стрибнув" при запуску при використанні існуючих версій плагіна ( див. Тут ).
  • Це було зроблено у звіті про помилки CB-13505 , виправлено PR cordova-ios # 354 та випущено cordova-ios@4.5.4, тому переконайтеся, що ви використовуєте останню версію cordova-iosплатформи.

орієнтація пристрою

  • При використанні UIWebView на iOS 11.0, обертання від портрета> пейзаж> портрет призводить до того, що safe-area-insetне буде повторно застосовано, внаслідок чого вміст знову затьмарюється виїмкою (як підкреслено jms у коментарі нижче).
  • Також трапляється, якщо додаток запускається в пейзажному режимі, потім повертається до портретного
  • Це не відбувається при використанні WKWebView через cordova-plugin-wkwebview-engine.
  • Звіт про радіолокацію: http://www.openradar.me/radar?id=5035192880201728
  • Оновлення : це, здається, було виправлено в iOS 11.1

Для довідки - це оригінальний випуск про Кордову, який я відкрив, і це захоплює: https://isissue.apache.org/jira/browse/CB-13273


3
Чи є у вас проблеми під час обертання екрана? Я намагався, але після екрана обертання все порушено (безпечна область-вставка- * не оновлює свої значення залежно від орієнтації пристрою; а після обертання портрета -> пейзаж -> портрет знову, початкові значення теж порушені ). Чи може бути якась проблема з браузером apple / safari?
Хуан Мігель С.

1
У моєму випадку, коли я додав, viewport-fit=coverцілий додаток показує порожній білий екран і більше нічого. Я використовую iOS11, Xcode9 на iPhone 7 Plus. Хтось із подібною поведінкою?
Димитрій

1
@DaveAlden - схоже, що в 11.2 бета + вони перейшли constantна envключове слово - дивіться також: webkit.org/blog/7929/designing-websites-for-iphone-x
Brent

1
куди ви кладете код css body у своєму додатку? Як у якому файлі? Ніщо не працює для мене, я використовую Ionic 3.
Димитрій

2
Чи є якесь оновлення щодо проблеми обертання? Я на iOS 12 і відчуваю те саме питання. Мені дивно здається, що ця проблема зберігається. / cc @jms
a - m

36

Для виправлення вручну до існуючого проекту cordova

Чорні смуги

Додайте це до файлу info.plist . Виправлення стартового зображення є окремою проблемою, тобто як додати зображення для запуску iPhoneX

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

Білі смужки

Встановити viewport-fit = обкладинка в метатезі

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

Дякую! Зміна .plist має той самий ефект, що і зміни у вибраній відповіді, але ШЛЯХ швидше.
2Fwebd

Що кожне з цих завдань виконує для висоти та ширини пікселів CSS? У моєму додатку є серія вузьких знаків у верхній частині (меню тощо) ... і тоді я обчислюю решту висот пікселя, щоб останній DIV заповнив решту екрана. Зараз я бачу, як нижня біла смуга покриває частину цього DIV, але я також можу сказати не все це - маючи на увазі, що DIV все ще не йде в нижній частині екрана. А в свою чергу, моя програма запускається нижче верхньої білої смуги, тому її навіть не намагаються використовувати верхній пробіл.
ролінгер

Я використовував, UILaunchStoryboardNameі це вдалося зняти чорні смуги. Але мій сплеск екран розширюється. Будь-яка причина чому? Прийнята відповідь не працює для мене
Хатінг

@coder Спасибі - але додавання UILaunchStoryboardName до списку перешкоджає мені подати в магазин додатків: ПОМИЛКА ITMS-90705: "Запуск розгортки не знайдено. Переконайтеся, що ви вказали назву файлу запуску розкадровки без розширення імені файлу для ключа UILaunchStoryboardName у списку Info.plist. "
Метт Робертс

@Huiting Ви знайшли рішення щодо своєї справи?
LMaker

16

Ви повинні зробити 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">

Демо: https://jsfiddle.net/gq5pt509 (index.html)


  1. Додати ще Сплеск зображення для вашого config.xmlвсередині<platform name="ios">

Dont пропустіть цей крок , це потрібно для отримання екрану підходить для 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 -->

Демо: 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на пристрої

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

Тож ви можете зробити щось подібне на CSS

.is-ios #header {
 // Properties
}

5

У моєму випадку, коли кожен заставний екран був розроблений індивідуально, а не автогенерований або викладений у форматі дошки розповідей, мені довелося дотримуватися конфігурації екрана Legacy Launch і додати портретні та альбомні зображення, щоб орієнтувати орієнтації iPhoneX 1125 × 2436 на config.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" />

Після додавання їх до config.xml ("viewport-fit = cover" вже встановлено в index.hml) мій додаток, побудований за допомогою Ionic Pro, заповнює весь екран на пристроях iPhoneX.


сер, але в моєму config.xml я вже додав вище цього рядка та viewport-fit = cover
Kapil soni

@Kapilsoni, то це може бути проблема із плагіном UIWebView Cordova, WKWebView, SplashScreen або комбінацією цих конфігурацій. Також ви орієнтуєтесь на XCode 10 або 11 у своїх збірках?
TaeKwonJoe

сер, я націлююся на XCode 10?
Капіль соні


2

Виправлення проблеми з поворотом екрана iPhone X / XS

На iPhone X / XS поворот екрана призведе до неправильного значення висоти рядка заголовка, оскільки обчислення безпечної області-вставки- * не відображало нових значень у часі для оновлення інтерфейсу користувача. Ця помилка існує в UIWebView навіть в останній версії iOS 12. Подолання вставляє верхній запас 1px і потім швидко відміняє його, що спричинить негайне перерахування негайного введення безпечної області-*. Дещо потворне виправлення, але воно працює, якщо вам доведеться залишитися з UIWebView з тих чи інших причин.

window.addEventListener("orientationchange", function() {
    var originalMarginTop = document.body.style.marginTop;
    document.body.style.marginTop = "1px";
    setTimeout(function () {
        document.body.style.marginTop = originalMarginTop;
    }, 100);
}, false);

Мета коду - змусити документ.body.style.marginTop трохи змінитись, а потім повернути його назад. Це не обов'язково має бути "1px". Ви можете вибрати значення, яке не спричиняє мерехтіння вашого інтерфейсу, але досягає своєї мети.


UIWebView був видалений в iOS8 ... Сумніваюся, чи буде виправлена ​​будь-яка з існуючих помилок. Під час завантаження додатків Apple попереджає, що незабаром це буде припинено ... таким чином час перенести біль та перейти на WKWebView ...
Mozfet

2

Я розробляю програми для cordova протягом 2 років і витрачав тижні, щоб вирішити пов'язані з цим проблеми (наприклад: прокрутки веб-огляду, коли клавіатура відкрита). Ось перевірене та перевірене рішення як для ios, так і для android

PS: Я використовую iScroll для прокрутки вмісту

  1. Ніколи не використовуйте viewport-fit = cover у метатезі index.html, не залишайте додаток поза панеллю стану. iOS буде обробляти належну область для всіх варіантів iPhone.
  2. У XCode зніміть прапорець приховати рядок стану та потрібен повний екран і не забудьте вибрати пункт Запустити екранний файл як режиму, CDVLaunchScreen
  3. У config.xml встановіть повний екран як помилковий
  4. Нарешті, (завдяки Едді Вербрюгген за чудові плагіни) додайте його плагін cordova-plugin-webviewcolor, щоб встановити колір панелі стану та нижню область фону. Цей плагін дозволить вам встановити будь-який колір, який ви хочете.
  5. Додати нижче в config.xml (перший ff після x - непрозорість)

    <preference name="BackgroundColor" value="0xff088c90" />
  6. Обробляйте позицію прокрутки самостійно, додаючи події фокусування до елементів введення

    iscrollObj.scrollToElement(elm, transitionduration ... etc)

Для android зробіть те саме, але замість cordova-plugin-webviewcolor встановіть cordova-plugin-statusbar та cordova-plugin-navigationbar-color

Ось код Javascript, що використовує ці плагіни для роботи як на ios, так і на android:

function setStatusColor(colorCode) {
    //colorCode is smtg like '#427309';
    if (cordova.platformId == 'android') {
        StatusBar.backgroundColorByHexString(colorCode);
        NavigationBar.backgroundColorByHexString(colorCode);
    } else if (cordova.platformId == 'ios') {
        window.plugins.webviewcolor.change(colorCode);
    }
}

1

Якщо ви встановите новіші версії в ionicусьому світі, ви можете запустити, ionic cordova resourcesі це генерує для вас усі зображення на екрані екрана разом з правильними розмірами.


-1

Зверніть увагу, що ця стаття: 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також останній та спалах на білий екран після виправлення другого питання. Однак на початковому зображенні штриха тепер біла рамка внизу.


1
Я можу підтвердити iPhone X на запуску симулятора із Default@3x~iphone~comany.png - 1242x2436зображенням
msmfsd

Зверніть увагу, що належні розміри для iPhone X такі: портрет: 1125px × 2436px ... Пейзаж: 2436px × 1125px
Стерлінг Борн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.