不廢話,直接出結論。
Attention:
Xcode10釋出後,很多大廠采用xcode10适配iPhone新機,且提審時采用了Xcode打包,此包提審後通過appstore下載下傳的安裝包在iOS9.3以下的系統(>=iOS9.0)存在随機崩潰!國内阿裡,京東等廠均已複現了該問題。
https://stackoverflow.com/questions/52364231/our-app-crashed-in-ios-9-which-upload-by-xcode-10
此問題是由于蘋果對Assets資源的優化引起的(蘋果經常在iOS9到9.3的系統上搞事情,xcode9打包的情況下,如果資源中包含了P3圖檔,也會随機崩潰,看來是新的程式猿沒有注意到老的邏輯的坑導緻的)。
蘋果在Xcode10.1 beta2中修複了此問題https://developer.apple.com/documentation/xcode_release_notes/xcode_10_1_beta_2_release_notes?language=objc
目前有一些workround,如先用xcode10打包送出一個包,最低版本支援到9.3,然後用Xcode9打包再釋出一個版本,讓iOS9.3以下的使用者更新。
但是操作成本相對都比較大,是以如無特别需求,在Xcode10.1正式版未釋出前請勿用Xcode10打包送出稽核。
最新消息:根據蘋果開發者論壇的消息,Xcode10.1并未解決以上問題:
https://forums.developer.apple.com/thread/110393?from=timeline&isappinstalled=0#110393
蘋果官方也确認了Xcode10.1并未解決以上問題:
https://developer.apple.com/documentation/xcode_release_notes/xcode_10_1_release_notes?language=objc
最新消息,蘋果可通過服務端配置解決以上問題。
截止目前,微信、QQ等均适配了Xcode10.至于是否需要開發者做什麼事情,節後實際灰階一下看看。
經testflight驗證,目前未見xcode10.1打包存在崩潰問題,另,微信、QQ都采用了xcode10.1打包,是以,該問題應該已被解決。
一、新版iPhone适配
1、三款新的iPhoneX的相關尺寸如下圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9UFVOVTTU1EMJRVT3V1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMygzM1QjM4ETOxkDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
由上圖可以看出
第一、iPhoneXS和iPhoneX的相關尺寸相同,是以,iPhone XS無需其他适配;
第二、iPhone XR和iPhoneXS Max的尺寸和iPhoneX不同,是以,以前判斷iPhoneX的邏輯在這兩款機型上失效,需要相容。這兩個機型的問題在我們app裡面基本表現一緻,隻要在原來iPhoneX的判斷的位置上,加上這兩款機型的判斷,基本就沒有問題了。個别寫死寫死尺寸的地方,可能需要設計介入做些許調整;
第三、iPhoneX、iPhone XS、iPhone XS Max均為3倍屏,但是iPhoneXR為2倍屏
第四、h5适配的時候需要相容多種model了。
總體來看,這次新機型的适配難度要遠遠小于當初iPhoneX的适配;
2、各種機型的判斷的方法:
方式一:
各個機型枚舉
#define iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
#define iPhoneXR ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(828, 1792), [[UIScreen mainScreen] currentMode].size) : NO)
#define iPhoneXS_Max ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2688), [[UIScreen mainScreen] currentMode].size) : NO)
方式二:
目前iPhoneX系列都是劉海屏,其實隻要判斷出這個特性,就可以統一做适配了。故:
#define isIPhoneXAll ([UIScreen mainScreen].bounds.size.height == 812 || [UIScreen mainScreen].bounds.size.height == 896)
方式三:
目前iPhoneX都是劉海屏,狀态欄的高度均為44pt,故:
#define isIPhoneXAll ([[UIApplication sharedApplication] statusBarFrame].size.height == 44)
3、h5如何适配iPhoneX:
方式一:
通過與Native互動擷取目前的裝置型号(Native可以通過js橋,或者在UA中增加字段)
方式二:
h5可以通過在css中設定padding來達到自動适配的目的,這種情況下,h5不需要關注是否為iPhoneX了
方式二與native解耦,強烈推薦!
二、xcode10 工程配置
Xcode 10和以前相比,對工程的校驗嚴格了很多,主要表現在原?️的工程直接無法run,主要問題有:
1、libstdc++.6.0.9被廢棄;這裡需要移除所有的libstdc++.6.0.9庫,如果項目需要C++,則再添加libc++.tbd;
2、報錯如下:
error: Embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target's code sign settings match the parent app's.
Embedded Binary Signing Certificate: Software Signing
Parent App Signing Certificate: - (Ad Hoc Code Signed)
3、報錯如下:
error: Multiple commands produce 'xxxx':
1) Target 'xxxModule' (project 'Pods') has copy command from 'xxxx' to 'yyyy'
2) Target 'xxxModule' (project 'Pods') has copy command from 'zzzz' to 'pppp'
這裡2、3都是xcode對工程配置強校驗引起的,很棘手,找了很久才基本解決掉,解決方法是一緻的,在
Xcode--->File下進行工程設定,如下圖(project setting或workspace setting):
這裡相當于是将xcode build的設定修改為原來的配置了。如何在新的build 系統下解決這些問題,還待進一步研究。