Cordova uygulaması iPhone X'te doğru görüntülenmiyor (Simülatör)


121

Cordova tabanlı uygulamamı dün Xcode 9.0'da (9A235) iPhone X Simulator'da test ettim ve iyi görünmedi. Öncelikle tam ekran alanını doldurmak yerine uygulama içeriğinin üstünde ve altında siyah bir alan vardı. Daha da kötüsü, uygulama içeriği ile siyah arasında iki beyaz çubuk vardı.

cordova-plugin-wkwebview-engineCordova'nın WKWebView (UIWebView değil) kullanarak oluşturduğu eklenmesi beyaz çubukları düzeltir. Uygulamam, cordova-plugin-wkwebview-engineInapp Purchase'den indirilen görüntüleri bir HTML5 tuvaline yüklerken ortaya çıkan performans ve bellek sızıntısı sorunları nedeniyle UIWebView'dan WKWebView'e taşınmadı ( file://WKWebView'daki güvenlik kısıtlamaları nedeniyle Webview ile doğrudan erişim mümkün değildir. görüntü verileri üzerinden yüklenmelidir cordova-plugin-file).

Bu ekran görüntüleri, <body> üzerinde mavi arka plana sahip bir test uygulamasını gösterir . UIWebView'ün üstünde ve altında beyaz çubukları görebilirsiniz, ancak WKWebView ile göremezsiniz:


(kaynak: pbrd.co )


(kaynak: pbrd.co )

Her iki Cordova Webview, tam ekran alanını dolduran yerel bir uygulamaya kıyasla siyah alanları sergiler:


Wkwebview ile ilginç. Oyunumda tam genişlikte değil, aynı zamanda merkezden ofset de vardı. Uiwebview'de aynı boyutu korudu, ancak en azından kendisini ortalar.
agmcleod

Ben de bu sorunu yaşadım, bu yüzden sadece css ile bazı geçici çözümler yaptım bkz. Pt.stackoverflow.com/a/263460/55076
Igor Trindade

Ben de bu sorunu yaşıyorum. <meta>Etiketi cordova index.hml dosyama aşağıda listelenen diğerleri gibi eklemek işe yaramıyor. Cordova 7x'i cordova-ios 4.5.4 ile çalıştırıyorum - yapmam gereken başka bir şey var mı?
rolinger

Yanıtlar:


246

Beyaz çubukların çözümünü burada buldum :

Set viewport-fit=covergörüntü alanı üzerinde <meta>etiketi, yani:

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

UIWebView'daki beyaz çubuklar kaybolur:

(Sağladığı siyah alanlarını kaldırmak için çözüm @dpogue altındaki bir yorumda) kullanmaktır LaunchStoryboard görüntüleri ile cordova-plugin-splashscreenvarsayılan olarak Cordova tarafından kullanılan eski fırlatma görüntüleri değiştirmek için. Bunu yapmak için aşağıdakileri iOS platformuna ekleyin 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>

Ardından aşağıdaki boyutlara sahip görselleri oluşturun res/screen/ios(mevcut olanları kaldırın):

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

Siyah çubuklar kaldırıldıktan sonra, iPhone X'in ele alması gereken farklı bir şey daha var: Durum çubuğu "çentik" nedeniyle 20 pikselden daha büyüktür, bu da Cordova uygulamanızın en üstündeki herhangi bir içeriğin onun tarafından gizleneceği anlamına gelir. :

Bir dolguyu piksel cinsinden sabit kodlamak yerine safe-area-inset-*, iOS 11'deki yeni sabitleri kullanarak bunu CSS'de otomatik olarak halledebilirsiniz .

Not: iOS 11.0'da bu sabitleri işleyen işlev çağrıldı, constant()ancak iOS 11.2'de Apple bunu env()( buraya bakın ) olarak yeniden adlandırdı , bu nedenle her iki durumu da kapsamak için her ikisiyle de CSS kuralını aşırı yüklemeniz ve CSS geri dönüş mekanizmasına güvenmeniz gerekir. uygun olan:

body{
    padding-top: constant(safe-area-inset-top);
    padding-top: env(safe-area-inset-top);
}

Sonuç, istenildiği gibidir: Uygulama içeriği tam ekranı kaplar, ancak "çentik" tarafından engellenmez:

Yukarıdaki adımları gösteren bir Cordova test projesi oluşturdum: webview-test.zip

Notlar:

Altbilgi düğmeleri

  • Uygulamanızda altbilgi düğmeleri varsa (benimki gibi), safe-area-inset-bottombunların iPhone X'teki sanal Ana Sayfa düğmesiyle örtüşmesini önlemek için başvurmanız gerekir .
  • Benim durumumda, <body>altbilgi kesinlikle konumlandırıldığı için bunu uygulayamadım, bu yüzden onu doğrudan altbilgiye uygulamam gerekiyordu:

.toolbar-footer{
    margin-bottom: constant(safe-area-inset-bottom);
    margin-bottom: env(safe-area-inset-bottom);
}

cordova-eklentisi-durum çubuğunda

  • İPhone X'te durum çubuğu boyutu değişti, bu nedenle iPhone X'te cordova-plugin-statusbarekranın eski sürümleri hatalı şekilde
  • Mike Hartington , gerekli değişiklikleri uygulayan bu çekme talebini oluşturdu .
  • Bu cordova-plugin-statusbar@2.3.0sürümle birleştirildi , bu nedenle güvenli alan eklerine uygulamak için en azından bu sürümü kullandığınızdan emin olun

başlangıç ​​ekranı

  • İOS 11 / iPhone X'te LaunchScreen film şeridi kısıtlamaları değişti, yani eklentinin mevcut sürümleri kullanılırken açılış ekranı "atlıyor" gibi görünüyordu ( buraya bakın ).
  • Bu, CB-13505 hata raporunda yakalandı , düzeltildi ve PR cordova-ios # 354'te yayınlandı cordova-ios@4.5.4, bu nedenle cordova-iosplatformun en son sürümünü kullandığınızdan emin olun .

cihaz yönü

  • İOS 11.0'da UIWebView kullanırken, dikey> yatay> dikeyden döndürme, safe-area-insetyeniden uygulanmamasına neden olarak içeriğin tekrar çentik tarafından engellenmesine neden olur ( aşağıdaki yorumda jms ile vurgulandığı gibi).
  • Ayrıca uygulama yatay modda başlatılıp ardından dikey olarak döndürülürse
  • WKWebView aracılığıyla kullanıldığında bu gerçekleşmez cordova-plugin-wkwebview-engine.
  • Radar raporu: http://www.openradar.me/radar?id=5035192880201728
  • Güncelleme : Bu, iOS 11.1'de düzeltilmiş görünüyor

Referans için, bu, açtığım ve bunu yakalayan orijinal Cordova sorunu: https://issues.apache.org/jira/browse/CB-13273


3
Ekranı döndürürken herhangi bir sorun yaşıyor musunuz? Deniyorum, ancak ekranı döndürdükten sonra her şey bozuldu (safe-area-inset- * değerleri cihaz yönüne bağlı olarak güncellemez; ve portreyi döndürdükten sonra -> yatay -> tekrar dikey, başlangıç ​​değerleri de bozuldu ). Apple / Safari tarayıcısıyla ilgili bir sorun olabilir mi?
Juan Miguel S.

1
Benim durumumda, viewport-fit=covertüm uygulamamı eklediğimde sadece boş bir beyaz ekran gösteriyor ve başka hiçbir şey göstermiyor. İPhone 7 Plus'ta iOS11, Xcode9 kullanıyorum. Benzer davranışlar yaşayan var mı?
Dimitri

1
@DaveAlden - bu 11.2 beta onlar koydum + o görünüyor constantiçin envanahtar kelime - ayrıca bkz: webkit.org/blog/7929/designing-websites-for-iphone-x
Brent

1
body css kodunu uygulamanızda nereye koyuyorsunuz? Hangi dosyadaki gibi? Benim için hiçbir şey işe
Dimitri

2
Rotasyon problemiyle ilgili herhangi bir güncelleme var mı? İOS 12 kullanıyorum ve aynı sorunu yaşıyorum. Bu sorunun devam etmesi bana garip geliyor. / cc @jms
a - m

36

Mevcut bir cordova projesine manuel düzeltme için

Siyah çubuklar

Bunu info.plist dosyanıza ekleyin . Başlatma görüntüsünü düzeltmek ayrı bir sorundur, yani iPhoneX Başlatma Görüntüsü Nasıl Eklenir

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

Beyaz çubuklar

Meta etikette viewport-fit = cover'ı ayarlayın

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

Teşekkürler! .Plist değişikliği, seçili yanıttaki değişikliklerle aynı etkiye sahiptir, ancak ÇOK daha hızlıdır.
2Fwebd

Bu görevlerin her biri CSS piksel yüksekliği ve genişliğine ne yapar? Uygulamamın üstte bir dizi dar bölmesi var (menüler vb.) ... ve sonra kalan piksel yüksekliğini son DIV'nin ekranın geri kalanını doldurması için hesaplarım. Şu anda alt beyaz çubuğun bu DIV'nin bir kısmını kapladığını görebiliyorum, ancak hepsini söyleyemiyorum - DIV'nin hala ekranın altına gitmediğini ima ediyor. Ve sırayla, uygulamam üstteki beyaz çubuğun altında başlıyor, bu yüzden üst alanı kullanmaya bile çalışmıyor.
rolinger

Kullandım UILaunchStoryboardNameve siyah çubukları çıkarmayı başardım. Ancak açılış ekranım genişliyor. Herhangi bir neden? Kabul edilen cevap benim için işe yaramıyor
Huiting

@coder Teşekkürler - ancak UILaunchStoryboardName'i pliste eklemek, uygulama mağazasına gönderebilmemi engelliyor: ERROR ITMS-90705: "Film şeridi başlat bulunamadı. UILaunchStoryboardName anahtarı için bir dosya adı uzantısı olmadan başlatma film şeridi dosya adını belirttiğinizden emin olun Info.plist içinde. "
Matt Roberts

@Huiting davanızla ilgili herhangi bir çözüm buldunuz mu?
LMaker

16

Yapmanız gereken 3 adım var

iOs 11 durum çubuğu ve iPhone X başlık sorunları için


1. Görüntü alanına sığan kapak

viewport-fit=coverGörüntü alanınızın metasına ekleyin<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 (index.html)


  1. Daha sıçrama resim ekle sizin için config.xmliçeriden<platform name="ios">

Bu adımı atlamayın , bu , iPhone X çalışması için ekrana sığdırmak için gereklidir

<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'de stilinizi düzeltin

Kullanım safe-area-inset-left, safe-area-inset-right, safe-area-inset-top, veyasafe-area-inset-bottom

Örnek: (Sizin durumunuzda kullanın!)

#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: Sen gibi vücut sınıfını ekleyebilir is-androidveya is-iosüzerinde deviceready

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

Yani CSS'de buna benzer bir şey yapabilirsiniz

.is-ios #header {
 // Properties
}

5

Her açılış ekranının otomatik olarak oluşturulmak yerine ayrı ayrı tasarlandığı veya bir hikaye panosu biçiminde düzenlendiği durumumda, Eski Başlatma ekranı yapılandırmamla devam etmem ve iPhoneX 1125 × 2436 yönlerini config.xml dosyasına hedeflemek için dikey ve yatay görüntüler eklemem gerekiyordu. böyle:

<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" />

Bunları config.xml'e ekledikten sonra ("viewport-fit = cover" zaten index.hml'de ayarlanmıştır) Ionic Pro ile oluşturduğum uygulamam iPhoneX cihazlarında tüm ekranı dolduruyor.


efendim ama config.xml dosyamda bu satırın üstüne zaten ekledim ve viewport-fit = cover
Kapil soni

@Kapilsoni daha sonra Cordova UIWebView, WKWebView, SplashScreen eklentisi veya bu konfigürasyonların bir kombinasyonu ile ilgili bir sorun olabilir. Ayrıca, derlemelerinizde XCode 10 veya 11'i mi hedefliyorsunuz?
TaeKwonJoe

efendim XCode 10'u hedefliyorum?
Kapil soni


2

İPhone X / XS ekran döndürme sorunu için düzeltme

İPhone X / XS'de ekran döndürme, başlık çubuğu yüksekliğinin yanlış bir değer kullanmasına neden olur, çünkü safe-area-inset- * hesaplaması, UI yenileme için zamanında yeni değerleri yansıtmıyordu. Bu hata, en son iOS 12'de bile UIWebView'da mevcuttur. Bir geçici çözüm, 1px'lik bir üst kenar boşluğu eklemek ve ardından bunu hızlı bir şekilde tersine çevirmektir, bu da safe-area-inset- * 'nin hemen yeniden hesaplanmasını tetikler. Biraz çirkin bir düzeltme, ancak bir nedenden ötürü UIWebView ile kalmanız gerekiyorsa işe yarıyor.

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

Kodun amacı document.body.style.marginTop'un biraz değişip sonra tersine çevirmesini sağlamaktır. Mutlaka "1px" olması gerekmez. Kullanıcı arayüzünüzün titremesine neden olmayan ancak amacına ulaşan bir değer seçebilirsiniz.


UIWebView iOS8'de kaldırıldı ... Mevcut hatalardan herhangi birinin düzeltilip düzeltilmeyeceğinden şüpheliyim. Apple, uygulamaları yüklerken bunun yakında durdurulacağı konusunda uyarıda bulunuyor ... bu nedenle acıyı alma ve WKWebView'a geçme zamanı ...
Mozfet

2

2 yıldır cordova uygulamaları geliştiriyorum ve ilgili sorunları çözmek için haftalar harcadım (örneğin: klavye açıkken web görünümü kaydırmaları). İşte hem iOS hem de Android için test edilmiş ve kanıtlanmış bir çözüm

Not: İçeriği kaydırmak için iScroll kullanıyorum

  1. İndex.html'nin meta etiketinde asla viewport-fit = cover kullanmayın , uygulamayı durum çubuğunun dışında bırakın. iOS, tüm iPhone varyantları için uygun alanı işleyecektir.
  2. XCode'da durum çubuğunu gizle işaretini kaldırın ve tam ekran gerektirir ve CDVLaunchScreen olarak Ekran Dosyasını Başlat'ı seçmeyi unutmayın.
  3. Config.xml'de tam ekranı yanlış olarak ayarlayın
  4. Son olarak (harika eklentiler için Eddy Verbruggen'e teşekkürler) durum çubuğunu ve alt alan arka plan rengini ayarlamak için eklenti cordova-eklenti-webviewcolor'u ekleyin . Bu eklenti, istediğiniz herhangi bir rengi ayarlamanıza izin verecektir.
  5. Config.xml'ye aşağıyı ekleyin (x'ten sonraki ilk ff, opaklıktır)

    <preference name="BackgroundColor" value="0xff088c90" />
  6. Giriş öğelerine odak etkinlikleri ekleyerek kaydırma konumunuzu kendiniz yönetin

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

Android için aynı şeyi ancak yerine cordova-eklenti-webviewcolor yüklemek Cordova'ya-eklentisi-statusbar ve cordova-eklentisi-NavigationBar-renk

Hem ios hem de android üzerinde çalışmak için bu eklentileri kullanan bir javascript kodu:

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

ionicGlobal olarak daha yeni sürümler yüklerseniz , çalıştırabilirsiniz ionic cordova resourcesve sizin için doğru boyutlarla birlikte tüm açılış ekranı görüntülerini oluşturur.


-1

Lütfen şu makalenin: https://medium.com/the-web-tub/supporting-iphone-x-for-mobile-web-cordova-app-using-onsen-ui-f17a4c272fcd'nin yukarıdaki ve cordova'dan farklı boyutlara sahip olduğunu unutmayın. eklenti sayfası:

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)

Görüntüleri yukarıdaki gibi yeniden boyutlandırdım ve iosplatformu cordova-plugin-splashscreenen son olarak güncelledim ve ikinci bir sorun giderildikten sonra flaş beyaz ekrana dönüştü. Bununla birlikte, ilk püskürme görüntüsünün şimdi altta beyaz bir sınırı var.


1
Simülatör başlatıldığında iPhone X'in Default@3x~iphone~comany.png - 1242x2436görüntüyle başlatıldığını onaylayabilirim
msmfsd

Unutmayın, iPhone X için uygun boyutlar aşağıdaki gibidir ... Dikey: 1125px × 2436px ... Yatay: 2436px × 1125px
Sterling Bourne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.