Xcode10和iOS12適配

原文
Xcode10和iOS12適配
Xcode10和iOS12適配(持續更新)
適配iPhoneX全系詳解,更新Xcode10爬坑
適配iPhoneX全系詳解,更新Xcode10爬坑
iOS12 Xcode10 libstdc++6.0.9遇到的相關問題

xcode10_ios12_00

前言

昨晚熬夜看完了WWDC 2018,睡前電腦掛著下載Xcode10。手機裝好了iOS12,體驗了一番,感覺比iOS11快多了,看了一眼各家App和我司的App,松了一口氣,初步看來今年應該不需要做太多的適配工作,然后就睡了。(然而,果然不能立flag!??)

早上晚到了一些,Xcode10解壓了一下,開始初步評估一下適配。emmmm,工程跑不起來了…好了果然不能低估,開干。

問題與解決

重復文件報錯

一上來就是build沒2秒就報錯了,看報錯的說法是有重復的info.plist。


xcode10_ios12_01

我們組件化后把一些三方庫和封裝方法打成了一個私有庫。進去看了一下,我們使用了阿里云統計 + 推送 + Alipay,里面確實有好幾個info.plist,刪除了就好了。

xcode10_ios12_02

解決方法 : 刪除掉多余的info.plist文件,重新編譯即可

補充說明 :
臨時解決方案

參考Stack OverflowXcode 10 Error: Multiple commands produce
,修改Xcode編譯配置Xcode->File->Project Settings/Workspace Setting-> Build System -> Legacy Build System.

這里定義為臨時解決方案的原因是:使用了Xcode10編譯的新特性而拋出錯誤,既然是編譯器的特性,那么最好還是接受它的報錯去修復。作為短暫的過渡而使用老的編譯方式雖然也是可以的,但是不推薦

c++.6.0.9消失了?

報錯:library not found for -lstdc++.6.0.9

xcode10_ios12_03

第一反應是去Build Phases里的Link Binary With Libraries進行添加,然后發現選擇frameworks and libraries里已經沒有了這個庫了??,又回去看了一下Xcode9里是有的。

xcode10_ios12_04

但是因為之前在Xcode9上是正常跑的項目,而且我們組件化后,依賴是在私有庫的podspec里定義的,全局搜了下所有的podspec并沒有依賴過這個lib。

想起來pod isntall后會有一個Pods-xxxx.xcconfig文件,果然找到了這個-l stdc++.6.0.9,但是這邊是匯總了所有的依賴,無法找到源頭。

xcode10_ios12_05

那如果直接在這里刪掉這個依賴呢?是不是會爆出更清晰的錯?
答案是就如下圖,因為刪掉了這個依賴,那依賴這個lib的源碼就出現了一些調用方法的報錯,如下圖,很明顯的發現了這個叫libQYSDK.a的庫。恩,就是三方庫七魚客服了??,趕緊聯系了一波工具提供方。

xcode10_ios12_06

這里直接說解決方法:

將Xcode9的 libstdc++6.0.9.tbd 拷貝到Xcode10中使用。
臨時的解決方法就是把libstdc++.6.0.9.tbd這個文件導入到Xcode10中,分別放到以下目錄
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/

libstdc++6.0.9.tbd 下載網址 里面有詳細的安裝教程說明, 下載文件直接拖到對應的路徑中即可

補充說明 :

Xcode10中libstdc++相關的3個庫(libstdc++、libstdc++.6、libstdc++6.0.9)應該都是被徹底廢棄了,如果你使用的三方庫中有依賴,請盡快和提供方溝通,告知他們遷移吧。如果自己開發使用,也盡快考慮遷移的事宜吧.

Copy Pods Resources失效

跳出了前兩個坑以后,滿心歡喜的運行了項目, 出現了另一個巨坑 cocoapads的版本問題, 報錯如下:

image.png

解決辦法 : 需要升級CocoaPods版本>=1.4.0以上, 可見Github上的一個issues Xcode10 beta can't load bundles from CocoaPods

簡單來說: 更新cocoapads的版本就好 (更新cocoapads出現問題的話請移步到baidu??)
附上兩個指令:

//查看當前系統Cocoapods版本命令:
pod --version

//安裝更新:
pod setup

//當執行完以后再執行:
sudo gem install cocoapods

至此我們的工程已經能正常通過Xcode 10編譯,并運行在iOS 12 beta的手機上了。
粗略對一些業務場景進行了使用,沒有發現明顯需要進行處理的問題
后續如果有發現有問題會繼續更新~

====================== 我是分割線 =======================

iOS開發適配iPhoneX全系列小結

閑扯蛋: 不出大家所料, 蘋果手機在庫克手中已經發揚光大, 已經逐步從消費品過渡到了奢侈品.對于用戶來說,本次更新的亮點在我看來(想了很久..)是雙卡雙待,只能算是彌補和android的差距罷了,不過我依舊相信,新的iPhone依舊會成為很多消費者的裝X神器,好了不多提,還是說說適配吧

剛發布的三款新iPhone包括兩款OLED屏幕的iPhone XS和iPhone XS Max,屏幕尺寸分別為5.8英寸(分辨率為1125 x 2436)和6.5英寸(分辨率為1242 x 2688),第三款設備是iPhone XR,配備6.1英寸LCD液晶屏(分辨率為828 x 1792)。三款新iPhone均采用“劉海屏”+Face ID設計,搭載了蘋果A12處理器

先來看一下三款新的iPhoneXS的相關尺寸吧, 如下 :

image.png

需要注意的是:

  • iPhoneXS和iPhoneX的相關尺寸相同,所以,iPhone XS和iPhoneX一樣,無需做其他適配;

  • iPhoneX、iPhone XS、iPhone XS Max均為3倍屏,但是iPhoneXR為2倍屏

  • 如果你使用的是LaunchImag,就需要提供正確的啟動圖。需要注意的是XR使用的@2x的圖

  • 如果我們只設置iPhone X的啟動圖,沒有設置iPhone XR/iPhone XS Max啟動圖。iPhone XR/iPhone XS Max會默認使用iPhone X的啟動圖

  • iPhoneXS Max以及iPhoneXR的邏輯像素是一致的,均為414*896pt,區別在于一個是@3x,一個是@2x

針對這種樣式的屏幕,我們處理方法是一樣,幾個宏直接搞定

怎么判斷是不是iPhone X? 獲取當前屏幕寬度或高度與尺寸進行比較就可以了

image.png

由上圖不難看出, 我們在設計的時候以iPhone8(375*667pt)為基準做設計稿,先得到iPhoneXR:由于都是@2x,首先需要將畫板寬度拉寬為414pt,高度拉高為896pt(與我們做iPhone5到iPhone6的寬高變化處理是一樣的道理),狀態欄由20pt變高為44pt,在底部加上主頁指示器(Home Indicator)高度為34pt,導航欄以及標簽欄高度不變。我們發現iPhoneXR內容呈現的比iPhone8要多一些。有了iPhoneXR后,直接等比例放大1.5倍就可以得到iPhoneXS Max
即:導航欄依舊是64->88, 底部的UITabBar由49->83
附上幾個宏, 直接解決:

#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 kiPhoneXAll ([UIScreen mainScreen].bounds.size.height == 812 || [UIScreen mainScreen].bounds.size.height == 896)

/**
 * iPhoneX全系導航欄增加高度 (64->88)
 */
#define kiPhoneX_Top_Height (([UIScreen mainScreen].bounds.size.height == 812 || [UIScreen mainScreen].bounds.size.height == 896)?24:0)

/**
 * iPhoneX全系TabBar增加高度 (49->83)
 */
#define kiPhoneX_Bottom_Height  (([UIScreen mainScreen].bounds.size.height == 812 || [UIScreen mainScreen].bounds.size.height == 896)?34:0)

注意的是:針對繼承自UIScrollView的,需要處理一下內邊距

//第一步:關閉自動調整內邊距
if (@available(iOS 11.0, *)) {
        [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}

//第二步:在使用的地方手動設置內邊距
self.scrollView.contentInset = UIEdgeInsetsMake(0, 0, kBottomBarHeight, 0);
//這樣設置以后,底下的觸摸區域就能正常顯示內容了,而且當UIScrollView滑到最底部的時候,不會被遮住。

總結: 到這里基本就完成了適配iPhoneX全系以及更新Xcode10所出現的問題了, 可能還有很多不足之處, 也歡迎大家多多指點. 如果以后發現新的問題, 也會不定期更新, 喜歡的同學們可以收藏關注一下, 感謝?? ?? ??

參考文章:
Xcode10和iOS12適配
Xcode10和iOS12適配(持續更新)
適配iPhoneX全系詳解,更新Xcode10爬坑
適配iPhoneX全系詳解,更新Xcode10爬坑
iOS12 Xcode10 libstdc++6.0.9遇到的相關問題

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容