天天看點

Xcode10打包存在iOS9.3以下系統crash(最新:Xcode10.1已解決crash問題) 暨iPhoneXS,iPhoneXS Max,iPhoneXR适配小結不廢話,直接出結論。Attention:

不廢話,直接出結論。

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的相關尺寸如下圖:

Xcode10打包存在iOS9.3以下系統crash(最新:Xcode10.1已解決crash問題) 暨iPhoneXS,iPhoneXS Max,iPhoneXR适配小結不廢話,直接出結論。Attention:

由上圖可以看出

第一、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中增加字段)

方式二:

Xcode10打包存在iOS9.3以下系統crash(最新:Xcode10.1已解決crash問題) 暨iPhoneXS,iPhoneXS Max,iPhoneXR适配小結不廢話,直接出結論。Attention:

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):

Xcode10打包存在iOS9.3以下系統crash(最新:Xcode10.1已解決crash問題) 暨iPhoneXS,iPhoneXS Max,iPhoneXR适配小結不廢話,直接出結論。Attention:
Xcode10打包存在iOS9.3以下系統crash(最新:Xcode10.1已解決crash問題) 暨iPhoneXS,iPhoneXS Max,iPhoneXR适配小結不廢話,直接出結論。Attention:

這裡相當于是将xcode build的設定修改為原來的配置了。如何在新的build 系統下解決這些問題,還待進一步研究。

繼續閱讀