Ontem, testei meu aplicativo baseado em Cordova no iPhone X Simulator no Xcode 9.0 (9A235) e ele não parecia bom. Em primeiro lugar, em vez de preencher a área de tela cheia, havia uma área preta acima e abaixo do conteúdo do aplicativo. E pior, entre o conteúdo do aplicativo e o preto havia duas barras brancas.
Adicionar cordova-plugin-wkwebview-engine
a renderização do Cordova usando o WKWebView (não o UIWebView) corrige as barras brancas. Por meu aplicativo não é migrado do UIWebView para o WKWebView devido a problemas de desempenho e vazamento de memória ao usar o cordova-plugin-wkwebview-engine
que ocorre ao carregar imagens baixadas do Inapp Adquira conteúdo hospedado em uma tela HTML5 (o file://
acesso direto pelo Webview não é possível devido a restrições de segurança no WKWebView, portanto os dados da imagem devem ser carregados via cordova-plugin-file
).
Essas capturas de tela mostram um aplicativo de teste com um fundo azul definido no <body
>. Acima e abaixo do UIWebView, você pode ver as barras brancas, mas não com o WKWebView:
(fonte: pbrd.co )
(fonte: pbrd.co )
As duas visualizações da Cordova na Web exibem as áreas pretas quando comparadas a um aplicativo nativo que preenche a área de tela inteira:
<meta>
tag ao meu arquivo cordova index.hml, como os outros listados abaixo, não está funcionando. Estou executando o Cordova 7x com o cordova-ios 4.5.4 - há mais alguma coisa que eu precise fazer?Respostas:
Encontrei a solução para as barras brancas aqui :
Defina
viewport-fit=cover
na<meta>
tag viewport , ou seja:As barras brancas no UIWebView desaparecem:
A solução para remover as áreas pretas (fornecido pelo @dpogue em um comentário abaixo) é usar imagens LaunchStoryboard com
cordova-plugin-splashscreen
a substituir as imagens de lançamento legado, usados por Cordova por padrão. Para fazer isso, adicione o seguinte à plataforma iOS emconfig.xml
:Em seguida, crie as imagens com as seguintes dimensões em
res/screen/ios
(remova as existentes):Depois que as barras pretas são removidas, há outra coisa diferente no iPhone X: a barra de status é maior que 20 px devido ao "entalhe", o que significa que qualquer conteúdo na parte superior do aplicativo Cordova será ocultado por ela. :
Em vez de codificar um preenchimento em pixels, você pode lidar com isso automaticamente em CSS usando as novas
safe-area-inset-*
constantes no iOS 11.Nota: no iOS 11.0, a função para lidar com essas constantes foi chamada,
constant()
mas no iOS 11.2 a Apple a renomeou paraenv()
( veja aqui ); portanto, para cobrir os dois casos, você precisa sobrecarregar a regra CSS com ambas e confiar no mecanismo de fallback CSS para aplicar o método apropriado:O resultado é o desejado: o conteúdo do aplicativo cobre a tela inteira, mas não é obscurecido pelo "entalhe":
Eu criei um projeto de teste Cordova que ilustra as etapas acima: webview-test.zip
Notas:
Botões de rodapé
safe-area-inset-bottom
para evitar que eles se sobreponham ao botão Início virtual no iPhone X.<body>
pois o rodapé está absolutamente posicionado; portanto, era necessário aplicá-lo diretamente ao rodapé:cordova-plugin-statusbar
cordova-plugin-statusbar
exibição incorretamente no iPhone X[email protected]
versão, portanto, verifique se você está usando pelo menos esta versão para aplicar às inserções de área seguratela de abertura
[email protected]
, portanto, verifique se você está usando uma versão recente dacordova-ios
plataforma.orientação do dispositivo
safe-area-inset
não seja reaplicado, fazendo com que o conteúdo seja obscurecido pelo entalhe novamente (conforme destacado por jms em um comentário abaixo).cordova-plugin-wkwebview-engine
.Para referência, esta é a edição original de Cordova que eu abri que captura isso: https://issues.apache.org/jira/browse/CB-13273
fonte
viewport-fit=cover
meu aplicativo inteiro, apenas aparece uma tela branca em branco e nada mais. Estou usando o iOS11, Xcode9 no iPhone 7 Plus. Alguém experimentando comportamento semelhante?constant
para aenv
palavra-chave - consulte também: webkit.org/blog/7929/designing-websites-for-iphone-xPara uma correção manual em um projeto cordova existente
As barras pretas
Adicione isso ao seu arquivo info.plist . A correção da imagem de inicialização é uma questão separada, por exemplo, como adicionar uma imagem de inicialização do iPhoneX
As barras brancas
Definir viewport-fit = cover na metatag
fonte
UILaunchStoryboardName
e ele conseguiu remover as barras pretas. Mas minha tela inicial é expandida. Alguma razão para isso? A resposta aceite não está trabalhando para mimExistem 3 etapas que você precisa executar
para problemas na barra de status do iOs 11 e no cabeçalho do iPhone X
1. Tampa de ajuste da janela de visualização
Adicione
viewport-fit=cover
à meta da sua viewport em<header>
Demonstração: https://jsfiddle.net/gq5pt509 (index.html)
config.xml
interior<platform name="ios">
Não pule esta etapa , isso é necessário para obter o ajuste da tela para o trabalho do iPhone X
Demonstração: https://jsfiddle.net/mmy885q4 (config.xml)
Use
safe-area-inset-left
,safe-area-inset-right
,safe-area-inset-top
, ousafe-area-inset-bottom
Exemplo: (use no seu caso!)
Bônus: você pode adicionar classe de corpo como
is-android
ouis-ios
no devicereadyEntão você pode fazer algo assim em CSS
fonte
No meu caso, em que cada tela inicial foi projetada individualmente em vez de gerada automaticamente ou organizada em um formato de storyboard, tive que ficar com a configuração da tela Legacy Launch e adicionar imagens retrato e paisagem para direcionar as orientações iPhoneX 1125 × 2436 ao config.xml igual a:
Depois de adicioná-los ao config.xml ("viewport-fit = cover" já estava definido em index.hml), meu aplicativo criado com o Ionic Pro preenche a tela inteira em dispositivos iPhoneX.
fonte
Apenas observe que a
constant
palavra - chave usar para margens da área segura foi atualizadaenv
para 11.2 beta +https://webkit.org/blog/7929/designing-websites-for-iphone-x/
fonte
Correção para problema de rotação da tela do iPhone X / XS
No iPhone X / XS, uma rotação da tela fará com que a altura da barra de cabeçalho use um valor incorreto, porque o cálculo da área segura inserida * não refletia os novos valores a tempo da atualização da interface do usuário. Esse bug existe no UIWebView, mesmo no iOS 12. mais recente. Uma solução alternativa é inserir uma margem superior de 1px e revertê-la rapidamente, o que fará com que a área segura inset- * seja recalculada imediatamente. Uma correção um pouco feia, mas funciona se você precisar ficar com o UIWebView por um motivo ou outro.
O objetivo do código é fazer com que o document.body.style.marginTop mude levemente e depois o inverta. Não precisa necessariamente ser "1px". Você pode escolher um valor que não faça com que sua interface do usuário pisque, mas atinja seu objetivo.
fonte
Estou desenvolvendo aplicativos cordova por 2 anos e passei semanas para resolver problemas relacionados (por exemplo: o webview rola quando o teclado é aberto). Aqui está uma solução testada e comprovada para iOS e Android
PS: Estou usando o iScroll para rolar o conteúdo
Adicione abaixo ao config.xml (primeiro ff após x é opacidade)
Controle sua posição de rolagem adicionando eventos de foco aos elementos de entrada
Para o Android, faça o mesmo, mas em vez de cordova-plugin-webviewcolor , instale cordova-plugin-statusbar e cordova-plugin-navigationbar-color
Aqui está um código javascript usando esses plugins para funcionar no ios e no android:
fonte
Se você instalar versões mais recentes do
ionic
mundo, poderá executarionic cordova resources
e isso gerará todas as imagens da tela de abertura para você, juntamente com os tamanhos corretos.fonte
Observe que este artigo: https://medium.com/the-web-tub/supporting-iphone-x-for-mobile-web-cordova-app-using-onsen-ui-f17a4c272fcd possui tamanhos diferentes do que acima e cordova página de plug-in:
Redimensionei as imagens como acima e atualizei a
ios
plataforma ecordova-plugin-splashscreen
a mais recente e o flash para a tela branca após a correção de um segundo problema. No entanto, a imagem spash inicial tem uma borda branca na parte inferior agora.fonte
Default@3x~iphone~comany.png - 1242x2436
imagem