Ứng dụng Cordova không hiển thị chính xác trên iPhone X (Trình mô phỏng)


121

Tôi đã thử nghiệm ứng dụng dựa trên Cordova của mình ngày hôm qua trên Trình mô phỏng iPhone X trong Xcode 9.0 (9A235) và nó có vẻ không ổn. Thứ nhất, thay vì lấp đầy toàn màn hình, có một vùng màu đen ở trên và dưới nội dung ứng dụng. Và tệ hơn, giữa nội dung ứng dụng và màu đen là hai thanh màu trắng.

Thêm cordova-plugin-wkwebview-engineđể Cordova kết xuất bằng WKWebView (không phải UIWebView) sẽ sửa các thanh màu trắng. Bởi ứng dụng của tôi không được di chuyển từ UIWebView sang WKWebView do các vấn đề về hiệu suất và rò rỉ bộ nhớ khi sử dụng cordova-plugin-wkwebview-enginexảy ra khi tải hình ảnh tải xuống từ nội dung được lưu trữ trên Inapp Purchase vào canvas HTML5 ( file://không thể truy cập trực tiếp bằng Webview do các hạn chế bảo mật trong WKWebView nên dữ liệu hình ảnh phải được tải qua cordova-plugin-file).

Những ảnh chụp màn hình này hiển thị một ứng dụng thử nghiệm có nền màu xanh lam được đặt trên <body>. Trên và dưới UIWebView, bạn có thể thấy các thanh màu trắng, nhưng với WKWebView thì không:


(nguồn: pbrd.co )


(nguồn: pbrd.co )

Cả hai Chế độ xem web Cordova đều hiển thị các vùng đen khi so sánh với một ứng dụng gốc lấp đầy toàn màn hình:


Thú vị với wkwebview. Trong trò chơi của tôi, tôi có nó không phải là chiều rộng đầy đủ, nhưng cũng bù trừ từ trung tâm. Trong uiwebview, nó vẫn giữ nguyên kích thước, nhưng ít nhất là căn giữa.
agmcleod

Tôi có vấn đề này quá vì vậy tôi thực hiện một số cách giải quyết chỉ với css see pt.stackoverflow.com/a/263460/55076
Igor Trindade

Tôi cũng đang có vấn đề này. Chỉ thêm <meta>thẻ vào tệp cordova index.hml của tôi như những thẻ khác được liệt kê bên dưới không hoạt động. Tôi đang chạy Cordova 7x với cordova-ios 4.5.4 - tôi có cần phải làm gì khác không?
rolinger

Câu trả lời:


245

Tôi đã tìm thấy giải pháp cho các thanh màu trắng ở đây :

Đặt viewport-fit=covertrên <meta>thẻ khung nhìn , tức là:

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

Các thanh màu trắng trong UIWebView sau đó biến mất:

Các giải pháp để loại bỏ những vùng màu đen (cung cấp bởi @dpogue trong một chú thích dưới đây) là sử dụng hình ảnh LaunchStoryboard với cordova-plugin-splashscreenđể thay thế những hình ảnh di sản khởi động, được sử dụng bởi Cordova theo mặc định. Để làm như vậy, hãy thêm phần sau vào nền tảng iOS trong 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>

Sau đó, tạo hình ảnh với các kích thước sau trong res/screen/ios(loại bỏ bất kỳ kích thước hiện có nào):

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

Sau khi các thanh màu đen bị loại bỏ, có một điều khác về iPhone X cần giải quyết: Thanh trạng thái lớn hơn 20px do "notch", có nghĩa là bất kỳ nội dung nào ở phía trên cùng của ứng dụng Cordova của bạn sẽ bị che khuất bởi nó :

Thay vì viết khó một khoảng đệm bằng pixel, bạn có thể xử lý điều này tự động trong CSS bằng các safe-area-inset-*hằng số mới trong iOS 11.

Lưu ý: trong iOS 11.0, hàm để xử lý các hằng số này đã được gọi constant()nhưng trong iOS 11.2 Apple đã đổi tên nó thành env()( xem tại đây ), do đó, để giải quyết cả hai trường hợp, bạn cần quá tải quy tắc CSS với cả hai và dựa vào cơ chế dự phòng CSS để áp dụng thích hợp một:

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

Kết quả sau đó như mong muốn: nội dung ứng dụng bao phủ toàn màn hình, nhưng không bị che khuất bởi "notch":

Tôi đã tạo một dự án thử nghiệm Cordova minh họa các bước trên: webview-test.zip

Ghi chú:

Các nút chân trang

  • Nếu ứng dụng của bạn có các nút chân trang (như của tôi), bạn cũng sẽ cần áp dụng safe-area-inset-bottomđể tránh chúng bị chồng lên bởi nút Home ảo trên iPhone X.
  • Trong trường hợp của tôi, tôi không thể áp dụng điều này <body>vì chân trang đã được định vị tuyệt đối, vì vậy tôi cần áp dụng nó trực tiếp cho chân trang:

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

wireova-plugin-statusbar

  • Kích thước thanh trạng thái đã thay đổi trên iPhone X, do đó, các phiên bản cũ hơn cordova-plugin-statusbarhiển thị không chính xác trên iPhone X
  • Mike Hartington đã tạo yêu cầu kéo này áp dụng các thay đổi cần thiết.
  • Phiên bản này đã được hợp nhất vào cordova-plugin-statusbar@2.3.0bản phát hành, vì vậy hãy đảm bảo rằng bạn đang sử dụng ít nhất phiên bản này để áp dụng cho các nội dung trong vùng an toàn

màn hình giật gân

  • Các ràng buộc của bảng phân cảnh LaunchScreen đã thay đổi trên iOS 11 / iPhone X, có nghĩa là màn hình giật gân dường như "nhảy" khi khởi chạy khi sử dụng các phiên bản hiện có của plugin ( xem tại đây ).
  • Điều này đã được ghi lại trong báo cáo lỗi CB-13505 , đã sửa lỗi PR cordova-ios # 354 và được phát hành cordova-ios@4.5.4, vì vậy hãy đảm bảo rằng bạn đang sử dụng phiên bản gần đây của cordova-iosnền tảng.

hướng thiết bị

  • Khi sử dụng UIWebView trên iOS 11.0, việc xoay từ dọc> ngang> dọc khiến safe-area-insetkhông áp dụng lại được, khiến nội dung bị che khuất bởi rãnh một lần nữa (như được đánh dấu bằng jms trong nhận xét bên dưới).
  • Cũng xảy ra nếu ứng dụng được khởi chạy theo chiều ngang sau đó được xoay sang chiều dọc
  • Điều này không xảy ra khi sử dụng WKWebView qua cordova-plugin-wkwebview-engine.
  • Báo cáo radar: http://www.openradar.me/radar?id=5035192880201728
  • Cập nhật : điều này dường như đã được sửa trong iOS 11.1

Để tham khảo, đây là số báo Cordova ban đầu mà tôi đã mở, ghi lại điều này: https://issues.apache.org/jira/browse/CB-13273


3
Bạn có gặp vấn đề gì khi xoay màn hình không? Tôi đã thử nhưng sau khi xoay màn hình, mọi thứ đều bị hỏng (safe-area-inset- * không cập nhật các giá trị của chúng tùy thuộc vào hướng thiết bị; và sau khi xoay dọc -> ngang -> dọc một lần nữa, các giá trị ban đầu cũng bị hỏng ). Nó có thể là một số vấn đề với trình duyệt apple / safari?
Juan Miguel S.

1
Trong trường hợp của tôi, khi tôi thêm viewport-fit=covertoàn bộ ứng dụng của mình chỉ hiển thị một màn hình trắng trống và không có gì khác. Tôi đang sử dụng iOS11, Xcode9 trên iPhone 7 Plus. Có ai trải qua hành vi tương tự không?
Dimitri

1
@DaveAlden - có vẻ rằng trong 11,2 beta + họ đã giảm constantcho envtừ khóa - xem thêm: webkit.org/blog/7929/designing-websites-for-iphone-x
Brent

1
bạn đặt mã body css trong ứng dụng của mình ở đâu? Giống như trong tệp nào? Công trình không có gì đối với tôi, tôi đang sử dụng Ionic 3.
Dimitri

2
Có cập nhật nào liên quan đến vấn đề xoay vòng không? Tôi đang sử dụng iOS 12 và gặp sự cố tương tự. Có vẻ lạ đối với tôi rằng vấn đề này vẫn tồn tại. / cc @jms
a - m

36

Để sửa chữa thủ công cho một dự án cordova hiện có

Các thanh màu đen

Thêm cái này vào tệp info.plist của bạn . Sửa hình ảnh khởi chạy là một vấn đề riêng biệt, tức là Cách thêm hình ảnh khởi chạy iPhoneX

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

Các thanh màu trắng

Đặt viewport-fit = cover trong thẻ meta

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

Cảm ơn! Thay đổi .plist có tác dụng tương tự như những thay đổi từ câu trả lời đã chọn, nhưng CÁCH nhanh hơn.
2Fwebd

Mỗi tác vụ này làm gì với chiều cao và chiều rộng pixel CSS? Ứng dụng của tôi có một loạt các div hẹp ở trên cùng (menu, v.v.) ... và sau đó tôi tính toán chiều cao pixel còn lại để DIV cuối cùng lấp đầy phần còn lại của màn hình. Ngay bây giờ tôi có thể thấy thanh màu trắng phía dưới che đi một số DIV đó, nhưng tôi cũng không thể biết được tất cả - ngụ ý rằng DIV vẫn chưa đi đến cuối màn hình. Và đến lượt nó, ứng dụng của tôi bắt đầu bên dưới thanh màu trắng phía trên nên nó thậm chí không cố gắng sử dụng khoảng trống phía trên.
rolinger

Tôi đã sử dụng UILaunchStoryboardNamevà nó đã quản lý để loại bỏ các thanh màu đen. Nhưng màn hình giật gân của tôi được mở rộng. Bất kỳ lý do tại sao? Câu trả lời được chấp nhận không phù hợp với tôi
Huiting

@coder Cảm ơn - nhưng việc thêm UILaunchStoryboardName vào plist ngăn tôi không thể gửi lên cửa hàng ứng dụng: ERROR ITMS-90705: "Không tìm thấy bảng phân cảnh khởi chạy. Hãy đảm bảo rằng bạn chỉ định tên tệp bảng phân cảnh khởi chạy mà không có phần mở rộng tên tệp cho khóa UILaunchStoryboardName trong Info.plist. "
Matt Roberts,

@Huiting bạn đã tìm thấy giải pháp nào cho trường hợp của mình chưa?
LMaker

16

Có 3 bước bạn phải làm

đối với các vấn đề về thanh trạng thái và tiêu đề iPhone X của iOs 11


1. Vỏ phù hợp với khung nhìn

Thêm vào viewport-fit=covermeta của khung nhìn của bạn trong<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. Thêm nhiều hình ảnh giật gân vào config.xmlbên trong của bạn<platform name="ios">

Đừng bỏ qua bước này , bước này bắt buộc để có được màn hình vừa vặn cho iPhone X hoạt động

<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. Sửa kiểu của bạn trên CSS

Sử dụng safe-area-inset-left, safe-area-inset-right, safe-area-inset-top, hoặcsafe-area-inset-bottom

Ví dụ: (Sử dụng trong trường hợp của bạ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: Bạn có thể thêm lớp cơ thể như is-androidhoặc is-iostrên deviceready

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

Vì vậy, bạn có thể làm điều gì đó như thế này trên CSS

.is-ios #header {
 // Properties
}

5

Trong trường hợp của tôi khi mỗi màn hình giật gân được thiết kế riêng thay vì được tạo tự động hoặc bố trí ở định dạng bảng phân cảnh, tôi phải gắn với cấu hình màn hình Legacy Launch của mình và thêm hình ảnh dọc và ngang để nhắm mục tiêu các hướng iPhoneX 1125 × 2436 vào config.xml như vậy:

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

Sau khi thêm những thứ này vào config.xml ("viewport-fit = cover" đã được đặt trong index.hml), ứng dụng của tôi được xây dựng bằng Ionic Pro sẽ lấp đầy toàn bộ màn hình trên các thiết bị iPhoneX.


thưa ông nhưng trong config.xml của tôi, tôi đã thêm ở trên dòng này và viewport-fit = cover
Kapil soni

@Kapilsoni thì có thể là sự cố với plugin Cordova UIWebView, WKWebView, SplashScreen hoặc sự kết hợp của các cấu hình này. Ngoài ra, bạn có đang nhắm mục tiêu XCode 10 hoặc 11 trong các bản dựng của mình không?
TaeKwonJoe

thưa tôi đang nhắm mục tiêu XCode 10?
Kapil soni


2

Khắc phục sự cố xoay màn hình iPhone X / XS

Trên iPhone X / XS, việc xoay màn hình sẽ khiến chiều cao của thanh tiêu đề sử dụng giá trị không chính xác, vì việc tính toán vùng an toàn-in- * không phản ánh các giá trị mới trong thời gian làm mới giao diện người dùng. Lỗi này tồn tại trong UIWebView ngay cả trong iOS 12. Một cách giải quyết là chèn lề trên 1px và sau đó nhanh chóng đảo ngược nó, điều này sẽ kích hoạt tính toán lại safe-area-inset- * ngay lập tức. Một bản sửa lỗi hơi xấu nhưng nó hoạt động nếu bạn phải ở lại với UIWebView vì lý do này hay lý do khác.

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

Mục đích của mã là khiến document.body.style.marginTop thay đổi một chút và sau đó đảo ngược nó. Nó không nhất thiết phải là "1px". Bạn có thể chọn một giá trị không khiến giao diện người dùng của bạn nhấp nháy nhưng đạt được mục đích của nó.


UIWebView đã được mô tả trong iOS8 ... Tôi nghi ngờ liệu có bất kỳ lỗi nào hiện có sẽ được sửa hay không. Apple đang cảnh báo khi tải lên các ứng dụng rằng ứng dụng này sẽ sớm bị ngừng hoạt động ... do đó, đã đến lúc chịu khó và chuyển sang WKWebView ...
Mozfet

2

Tôi đang phát triển ứng dụng cordova trong 2 năm và tôi đã dành nhiều tuần để giải quyết các vấn đề liên quan (ví dụ: cuộn trang web khi bàn phím mở). Đây là một giải pháp đã được thử nghiệm và chứng minh cho cả iOS và Android

Tái bút: Tôi đang sử dụng iScroll để cuộn nội dung

  1. Không bao giờ sử dụng viewport-fit = cover tại thẻ meta của index.html, hãy để ứng dụng ở ngoài thanh trạng thái. iOS sẽ xử lý khu vực thích hợp cho tất cả các biến thể iPhone.
  2. Trong XCode, bỏ chọn ẩn thanh trạng tháiyêu cầu toàn màn hình và đừng quên chọn Launch Screen File as CDVLaunchScreen
  3. Trong config.xml, đặt toàn màn hìnhfalse
  4. Cuối cùng, (cảm ơn Eddy Verbruggen về các plugin tuyệt vời) thêm plugin cordova-plugin-webviewcolor của anh ấy để đặt màu nền của thanh trạng thái và vùng dưới cùng. Plugin này sẽ cho phép bạn đặt bất kỳ màu nào bạn muốn.
  5. Thêm bên dưới vào config.xml (ff đầu tiên sau x là độ mờ)

    <preference name="BackgroundColor" value="0xff088c90" />
  6. Tự xử lý vị trí cuộn của bạn bằng cách thêm các sự kiện tiêu điểm vào các phần tử đầu vào

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

Đối với android, hãy làm tương tự nhưng thay vì cordova-plugin-webviewcolor , hãy cài đặt cordova-plugin-statusbarcordova-plugin-navigationbar-color

Đây là mã javascript sử dụng các plugin đó để hoạt động trên cả ios và 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

Nếu bạn cài đặt các phiên bản ionictoàn cầu mới hơn, bạn có thể chạy ionic cordova resourcesvà nó sẽ tạo ra tất cả các hình ảnh màn hình giật gân cho bạn cùng với các kích thước chính xác.


-1

Xin lưu ý rằng bài viết này: https://medium.com/the-web-tub/supporting-iphone-x-for-mobile-web-cordova-app-using-onsen-ui-f17a4c272fcd có các kích thước khác với trên và cordova trang plugin:

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)

Tôi đã thay đổi kích thước hình ảnh như trên và cập nhật iosnền tảng và cordova-plugin-splashscreenmới nhất và đèn flash chuyển sang màn hình trắng sau khi sự cố thứ hai được khắc phục. Tuy nhiên, hình ảnh giật gân ban đầu có viền trắng ở dưới cùng.


1
Tôi có thể khẳng định iPhone X trên ra mắt mô phỏng với Default@3x~iphone~comany.png - 1242x2436hình ảnh
msmfsd

Đáng chú ý, các kích thước thích hợp cho iPhone X như sau ... Chân dung: 1125px × 2436px ... Cảnh: 2436px × 1125px
Sterling Bourne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.