iOS9、iOS10崎溃、iOS11蜻直、iOS12常見適配

一、iOS12(Xcode10)

1.1袁串、升級Xcode10后項目報錯

不允許多個info.plist

Xcode10是默認(rèn)選中的最新的New Build System(Default)概而,在這個編譯系統(tǒng)的環(huán)境下,不允許多個info.plist

解決辦法一:(推薦)

把build system切換到 Legacy Build System般婆,換言之就是切換成老的編譯系統(tǒng)到腥,就OK了。

Xcode->File->Project Settings-> Build System -> Legacy Build System.

image.png
image.png

解決辦法二:

刪除其他info.plist文件蔚袍。

iOS 12移除了libstdc++, 用libc++替代

Xcode10中l(wèi)ibstdc++相關(guān)的3個庫(libstdc++乡范、libstdc++.6、libstdc++6.0.9)應(yīng)該都是被徹底廢棄了啤咽,如果你使用的三方庫中有依賴晋辆,請盡快和提供方溝通,告知他們遷移吧宇整。如果自己開發(fā)使用瓶佳,也盡快考慮遷移的事宜吧。

1.2鳞青、iPhone XR不支持3D-Touch

OC檢測代碼

if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {

}

swift檢測代碼

self.traitCollection.forceTouchCapability == .availible

二霸饲、iOS11(Xcode9)

2.1为朋、安全區(qū)域(SafeArea)

iOS11為UIViewController和UIView增加了兩個新的屬性safeAreaInsets和safeAreaLayoutGuide

safeAreaInsets 適用于手動計算.

safeAreaLayoutGuide 適用于自動布局.

UIViewController中新增:

- (``void``)viewSafeAreaInsetsDidChange;

UIView中新增:

- (``void``)viewSafeAreaInsetsDidChange;

在Storyboard使用Safe Area最低只支持iOS9厚脉,iOS8的用戶就要放棄了

image.png
image.png

當(dāng)UIViewController調(diào)用- (void)viewDidLoad時它的所有子視圖的safeAreaInsets屬性都等于UIEdgeInsetsZero习寸。

viewSafeAreaInsetsDidChange的調(diào)用時機如下:

1、viewDidLoad

2傻工、viewWillAppear

3霞溪、viewSafeAreaInsetsDidChange

4、viewWillLayoutSubviews

5中捆、viewDidAppear

只有在調(diào)用viewSafeAreaInsetsDidChange后鸯匹,才能獲得view以及viewController的SafeArea(UIEdgeInsets)。因此在viewDidload中根據(jù)SafeArea設(shè)置界面會有問題泄伪。

iPhone X:有導(dǎo)航欄的時候可以+44

豎屏 safeAreaInsets = (top = 44, left = 0, bottom = 34, right = 0)

橫屏 safeAreaInsets = (top = 0, left = 44, bottom = 21, right = 44)

#``import "Adaptive11VC.h"

static inline UIEdgeInsets sgm_safeAreaInset(UIView *view) {

if (@available(iOS ``11.0``, *)) {

return view.safeAreaInsets;

}

return UIEdgeInsetsZero;

}

@``interface Adaptive11VC ()

@end

@implementation Adaptive11VC

- (``void``)viewDidLoad {

[``super viewDidLoad];

}

- (``void``)testSafeArea {

UIEdgeInsets safeAreaInsets = sgm_safeAreaInset(self.view);

NSLog(@``"safeAreaInsets = %@"``, NSStringFromUIEdgeInsets(safeAreaInsets));

}

- (``void``)viewSafeAreaInsetsDidChange {

[``super viewSafeAreaInsetsDidChange];

[self testSafeArea];

}

@end

2.2殴蓬、UIScrollView

iOS 11廢棄了UIViewController的automaticallyAdjustsScrollViewInsets屬性,新增了contentInsetAdjustmentBehavior屬性蟋滴,所以當(dāng)超出安全區(qū)域時系統(tǒng)自動調(diào)整了SafeAreaInsets科雳,進(jìn)而影響了adjustedContentInset,在iOS11中決定tableView內(nèi)容與邊緣距離的是adjustedContentInset脓杉,所以需要設(shè)置UIScrollView的contentInsetAdjustmentBehavior屬性。

// 方式一:(不推薦)修改額外的安全區(qū)域

if (@available(iOS ``11.0``, *)) {

self.additionalSafeAreaInsets = UIEdgeInsetsMake(-``44``, ``0``, ``0``, ``0``);

}

else {

// Fallback on earlier versions

}

// 方式二:(推薦)設(shè)置為不自動調(diào)整

if (@available(iOS ``11.0``, *)) {

// 作用于指定的UIScrollView

self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

// 作用與所有的UIScrollView

UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

}

else {

self.automaticallyAdjustsScrollViewInsets = NO;

}

2.3简逮、tableview問題

iOS11開始UITableView開啟了自動估算行高球散,estimatedRowHeight estimatedSectionHeaderHeight estimatedSectionFooterHeight三個高度估算屬性由默認(rèn)的0變成了UITableViewAutomaticDimension,如果不實現(xiàn)-tableView: viewForFooterInSection: 和 -tableView: viewForHeaderInSection:散庶,那么estimatedRowHeight estimatedSectionHeaderHeight estimatedSectionFooterHeight三個高度估算屬性由默認(rèn)的0變成了UITableViewAutomaticDimension蕉堰,導(dǎo)致高度計算不對,會產(chǎn)生空白悲龟。解決方法是實現(xiàn)對應(yīng)方法或吧這三個屬性設(shè)為0屋讶。

2.4、LocalAuthentication 本地認(rèn)證

本地認(rèn)證框架提供了從具有指定安全策略(密碼或生物學(xué)特征)的用戶請求身份驗證的功能须教。例如皿渗,要求用戶僅使用Face ID或Touch ID進(jìn)行身份驗證,可使用以下代碼:

#``import /**

檢測TouchID是否可用

*/

- (``void``)checkBiometrics {

LAContext *context = [[LAContext alloc] init];

BOOL success = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics

error:nil];

if ( success ) {

NSLog(@"can use"`);

}

else {

NSLog(@"cant use ");

}

}

/**

在驗證TouchID可用的情況下使用

*/

- (``void``)excuteBiometrics {

LAContext *context = [[LAContext alloc] init];

context.localizedFallbackTitle = @"自定義標(biāo)題"`;

[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics

localizedReason:@"為什么使用TouchID寫這里"

reply:^(BOOL success, NSError * _Nullable error) {

if ( success ) {

// 指紋驗證成功

}

else {

switch (error.code) {

case LAErrorUserFallback:{

NSLog(@"用戶選擇輸入密碼"`);

break;

}

case LAErrorAuthenticationFailed:{

NSLog(@"驗證失敗"`);

break;

}

case LAErrorUserCancel:{

NSLog(@"用戶取消"`);

break;

}

case LAErrorSystemCancel:{

NSLog(@``"系統(tǒng)取消"``);

break;

}

// 以下三種情況如果提前檢測TouchID是否可用就不會出現(xiàn)

case LAErrorPasscodeNotSet:{

break;

}

case LAErrorTouchIDNotAvailable:{

break;

}

case LAErrorTouchIDNotEnrolled:{

break;

}

default:

break;

}

}

}];

}

2.5轻腺、啟動圖的適配

方法一:通過LaunchScreen.storyboard方式啟動

方法二:使用Assets中的LaunchImage

image.png

  • 給Brand Assets添加一張1125*2436大小的圖片

  • 打開Assets.xcassets文件夾乐疆,找到Brand Assets

  • 右鍵Show in Finder

  • 添加一張1125*2436大小的圖片

  • 修改Contents.json文件,添加如下內(nèi)容

{

"extent" : ``"full-screen"``,

"idiom" : ``"iphone"``,

"subtype" : ``"2436h"``,

"filename" : ``"1125_2436.png"``,

"minimum-system-version" : ``"11.0"``,

"orientation" : ``"portrait"``,

"scale" : ``"3x"

}

|

2.6、定位相關(guān)

在 iOS 11 中必須支持 When In Use 授權(quán)模式(NSLocationWhenInUseUsageDescription)贬养,在 iOS 11 中挤土,為了避免開發(fā)者只提供請求 Always 授權(quán)模式這種情況,加入此限制误算,如果不提供When In Use 授權(quán)模式仰美,那么 Always 相關(guān)授權(quán)模式也無法正常使用迷殿。

如果要支持老版本,即 iOS 11 以下系統(tǒng)版本咖杂,那么建議在 info.plist 中配置所有的 Key(即使

|

1

2

3

4

5

|

NSLocationAlwaysUsageDescription 在 iOS ``11``及以上版本不再使用):

NSLocationWhenInUseUsageDescription

NSLocationAlwaysAndWhenInUseUsageDescription

NSLocationAlwaysUsageDescription

NSLocationAlwaysAndWhenInUseUsageDescription ``// 為 iOS 11 中新引入的一個 Key庆寺。

|

2.7、iOS11中 UIKit’s Bars 上的變化

三翰苫、iOS10(Xcode8)

3.1止邮、(Why?Safe奏窑!)插件取消

Xcode8取消了三方插件(很多優(yōu)秀的插件导披,本來可以顯著提高效率)的功能,使用Extension代替

Xcode 8 Extension 推薦

3.2埃唯、證書問題

為了方便用戶來管理撩匕,提供Automatically manage signing。需要輸入開發(fā)者賬號墨叛!如果沒有賬號也沒關(guān)系止毕,在下面也可以選擇Debug、Realease漠趁、inHouse模式下對應(yīng)的證書也可以扁凛!

3.3、隱私數(shù)據(jù)訪問問題

iOS10闯传,蘋果加強了對隱私數(shù)據(jù)的保護(hù)谨朝,要對隱私數(shù)據(jù)權(quán)限做一個適配,iOS10調(diào)用相機甥绿,訪問通訊錄字币,訪問相冊等都要在info.plist中加入權(quán)限訪問描述,不然之前你們的項目涉及到這些權(quán)限的地方就會直接crash掉共缕。

解決辦法:

只需要在info.plist添加NSContactsUsageDescription的key, value自己隨意填寫就可以,這里列舉出對應(yīng)的key(Source Code模式下):

NSPhotoLibraryUsageDescriptionApp需要您的同意,才能訪問相冊NSCameraUsageDescriptionApp需要您的同意,才能訪問相機NSMicrophoneUsageDescriptionApp需要您的同意,才能訪問麥克風(fēng)NSLocationUsageDescriptionApp需要您的同意,才能訪問位置NSLocationWhenInUseUsageDescriptionApp需要您的同意,才能在使用期間訪問位置NSLocationAlwaysUsageDescriptionApp需要您的同意,才能始終訪問位置NSCalendarsUsageDescriptionApp需要您的同意,才能訪問日歷NSRemindersUsageDescriptionApp需要您的同意,才能訪問提醒事項NSMotionUsageDescriptionApp需要您的同意,才能訪問運動與健身NSHealthUpdateUsageDescriptionApp需要您的同意,才能訪問健康更新 NSHealthShareUsageDescriptionApp需要您的同意,才能訪問健康分享NSBluetoothPeripheralUsageDescriptionApp需要您的同意,才能訪問藍(lán)牙NSAppleMusicUsageDescriptionApp需要您的同意,才能訪問媒體資料庫

|

image.png

3.4洗出、跳轉(zhuǎn)到app內(nèi)的隱私數(shù)據(jù)設(shè)置頁面

iOS 10 干掉了所有系統(tǒng)設(shè)置的 URL Scheme,這意味著你再也不可能直接跳轉(zhuǎn)到系統(tǒng)設(shè)置頁面(比如 WiFi图谷、蜂窩數(shù)據(jù)翩活、定位等)。

跳轉(zhuǎn)方式

方式一:prefs:root=某項服務(wù) 適用于 小于 iOS10的系統(tǒng)便贵;

NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"];

方式二:prefs:root=bundleID 適用于 大于等于iOS8系統(tǒng)隅茎,小于iOS10的系統(tǒng)

NSURL *url = [NSURL URLWithString:@"prefs:root=bundleID"];

方式三:UIApplicationOpenSettingsURLString 適用于 大于等于iOS8的系統(tǒng)

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

// iOS系統(tǒng)版本 >= 10.0

{

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

if ([[UIApplication sharedApplication] canOpenURL:url]) {

[[UIApplication sharedApplication] openURL:url];

}

}

return``;

// iOS系統(tǒng)版本 >= 10.0

// But! 不建議這樣做哦,官方文檔中說過:

//URL is now considered a private API and use will result in app rejection.

// 雖然是有可能躲過蘋果的檢測嫉沽,但是蘋果如果發(fā)現(xiàn)你這樣用了辟犀,app上架是有被拒的風(fēng)險的.

{

NSURL *url = [NSURL URLWithString:@``"APP-Prefs:root=WIFI"``];

if ([[UIApplication sharedApplication] canOpenURL:url]) {

if (@available(iOS ``10.0``, *)) {

[[UIApplication sharedApplication] openURL:url

options:@{}

completionHandler:nil];

} ``else {

// Fallback on earlier versions

}

}

}

// iOS系統(tǒng)版本 < 10.0

{

NSURL *url = [NSURL URLWithString:@``"prefs:root=WIFI"``];

if ([[UIApplication sharedApplication] canOpenURL:url]) {

[[UIApplication sharedApplication] openURL:url];

}

}

跳轉(zhuǎn)目的地

iOS系統(tǒng)版本 <= iOS7 , 只能跳轉(zhuǎn)到 系統(tǒng)設(shè)置頁面

iOS系統(tǒng)版本 >= iOS8 ,支持跳轉(zhuǎn)到第三方應(yīng)用的設(shè)置界面中。使用prefs:root=bundleID ,bundleID是你第三方應(yīng)用工程的唯一ID

iOS系統(tǒng)版本 >= iOS10堂竟,支持跳轉(zhuǎn)到自己應(yīng)用設(shè)置魂毁,不支持跳轉(zhuǎn)到系統(tǒng)設(shè)置

3.5、字體變化

蘋果的默認(rèn)字體會隨著iOS系統(tǒng)版本的不同而不同出嘹,iOS10中字體變大了席楚。導(dǎo)致了原來的顯示有問題,會造成...的出現(xiàn)税稼。暫時沒有好的解決辦法烦秩,需要自己在一個個適配一下!

3.6郎仆、UICollectionViewCell的的優(yōu)化

在iOS 10 之前,cell只能從重用隊列里面取出,再走一遍生命周期,并調(diào)用cellForItemAtIndexPath創(chuàng)建或者生成一個cell.

在iOS 10 中,系統(tǒng)會cell保存一段時間,也就是說當(dāng)用戶把cell滑出屏幕以后,如果又滑動回來,cell不用再走一遍生命周期了,只需要調(diào)用willDisplayCell方法就可以重新出現(xiàn)在屏幕中了.

iOS 10 中,系統(tǒng)是一個一個加載cell的,二以前是一行一行加載的,這樣就可以提升很多性能;

iOS 10 新增加的Pre-Fetching預(yù)加載

3.7只祠、UIRefreshControl

在iOS 10 中, UIRefreshControl可以直接在UICollectionView和UITableView中使用,并且脫離了UITableViewController.現(xiàn)在RefreshControl是UIScrollView的一個屬性.

3.8、UserNotifications(用戶通知)

iOS 10所有相關(guān)通知被統(tǒng)一到了UserNotifications.framework框架中扰肌。增加了撤銷抛寝、更新、中途還可以修改通知的內(nèi)容曙旭。通知不在是簡單的文本了盗舰,可以加入視頻、圖片桂躏,自定義通知的展示等等钻趋。

iOS 10相對之前的通知來說更加好用易于管理,并且進(jìn)行了大規(guī)模優(yōu)化剂习,對于開發(fā)者來說是一件好事爷绘。

iOS 10開始對于權(quán)限問題進(jìn)行了優(yōu)化,申請權(quán)限就比較簡單了(本地與遠(yuǎn)程通知集成在一個方法中)进倍。

四、iOS9(Xcode7)

4.1购对、Bitcode

Xcode7 默認(rèn)啟用 Bitcode猾昆,但是如果我們用到的第三方庫編譯時還沒啟用 Bitcode,主工程就會編譯不過骡苞。Bitcode 是蘋果 App Thinning 的機制之一垂蜗,可以減少安裝包的大小。App store 會將這個 Bitcode 編譯為可執(zhí)行的64位或32位程序解幽。

解決辦法一:

最簡單的解決辦法是先把 Bitcode 關(guān)掉:把 Build settings - Build Options - Enable Bitcode 改為 NO贴见。
image.png

解決辦法二:

移除不支持BitCode的平臺SDK,或者尋找支持BitCode的替代品躲株,或者聯(lián)系SDK方支持BitCode片部。

4.2、HTTP 請求失敗

iOS9 默認(rèn)不支持 HTTP 請求霜定,需要改用更安全的 HTTPS(默認(rèn)用 TLS 1.2)档悠。蘋果還提供了配置廊鸥,使得所有安全性更低的網(wǎng)絡(luò)請求也能使用,解決方案就是在 info.plist 里面增加以下配置:

NSAppTransportSecurity NSAllowsArbitraryLoads

如果復(fù)雜一些辖所,還可以指定白名單域名惰说,聲明所支持 TLS 的最低版本。另外需要注意的是缘回,即使寫了上述配置吆视,在 HTTPS 頁面中,HTTP 的 javascript 或 css 不會被加載酥宴,因為蘋果認(rèn)為這降低了頁面的安全性啦吧。

4.3、canOpenUrl 限制

canOpenUrl 可以用來判斷用戶是否安裝了某個 APP幅虑。也許是出于用戶隱私的考慮丰滑,iOS9 上對 canOpenUrl 做了限制,最多只能對 50 個 scheme 做判斷倒庵。如果是用 Xcode7 編譯褒墨,需要在 plist 里面聲明這些 scheme,沒有聲明的會直接返回 NO:

LSApplicationQueriesSchemes weixin wechat

4.4擎宝、UIStatusBar的問題

iOS9中廢棄的方法

// 修改狀態(tài)欄的樣式為白色

// 'setStatusBarStyle(_:animated:)' was deprecated in iOS 9.0: Use -[UIViewController preferredStatusBarStyle]

UIApplication.shared.setStatusBarStyle(.lightContent, animated: ``true``)

// 隱藏狀態(tài)欄

// 'setStatusBarHidden(_:with:)' was deprecated in iOS 9.0: Use -[UIViewController prefersStatusBarHidden]

UIApplication.shared.setStatusBarHidden(``true``, ``with``: .fade)

復(fù)制代碼用下面兩個方法替換

-[UIViewController preferredStatusBarstyle]

-[UIViewController preferredStatusBarHidden]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郁妈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绍申,更是在濱河造成了極大的恐慌噩咪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件极阅,死亡現(xiàn)場離奇詭異胃碾,居然都是意外死亡,警方通過查閱死者的電腦和手機筋搏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門仆百,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奔脐,你說我怎么就攤上這事俄周。” “怎么了髓迎?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵峦朗,是天一觀的道長。 經(jīng)常有香客問我排龄,道長波势,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮艰亮,結(jié)果婚禮上闭翩,老公的妹妹穿的比我還像新娘。我一直安慰自己迄埃,他們只是感情好疗韵,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侄非,像睡著了一般蕉汪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逞怨,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天者疤,我揣著相機與錄音,去河邊找鬼叠赦。 笑死驹马,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的除秀。 我是一名探鬼主播糯累,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼册踩!你這毒婦竟也來了泳姐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤暂吉,失蹤者是張志新(化名)和其女友劉穎胖秒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慕的,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡阎肝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肮街。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片风题。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖低散,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骡楼,我是刑警寧澤熔号,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站鸟整,受9級特大地震影響引镊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一弟头、第九天 我趴在偏房一處隱蔽的房頂上張望吩抓。 院中可真熱鬧,春花似錦赴恨、人聲如沸疹娶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雨饺。三九已至,卻和暖如春惑淳,著一層夾襖步出監(jiān)牢的瞬間额港,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工歧焦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留移斩,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓绢馍,卻偏偏與公主長得像向瓷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痕貌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容