一iOS12
1.1升級(jí)Xcode10后項(xiàng)目報(bào)錯(cuò)
不允許多個(gè)info.plist,Xcode10是默認(rèn)選中的最新的New Build System(Default),在這個(gè)編譯系統(tǒng)的環(huán)境下,不允許多個(gè)info.plist
解決辦法
把build system切換到 Legacy Build System,換言之就是切換成老的編譯系統(tǒng),就OK了。Xcode->File->Project Settings-> Build System -> Legacy Build System.
1.2 iOS 12移除了libstdc++, 用libc++替代
Xcode10中l(wèi)ibstdc++相關(guān)的3個(gè)庫(libstdc++、libstdc++.6、libstdc++6.0.9)應(yīng)該都是被徹底廢棄了,如果你使用的三方庫中有依賴,請(qǐng)盡快和提供方溝通,告知他們遷移吧。如果自己開發(fā)使用,也盡快考慮遷移的事宜吧。
1.3、iPhone XR不支持3D-Touch
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
}
二、iOS11(Xcode9)
2.1安全區(qū)域(SafeArea)
iOS11為UIViewController和UIView增加了兩個(gè)新的屬性safeAreaInsets和safeAreaLayoutGuide
UIViewController中新增:
- (void)viewSafeAreaInsetsDidChange;
UIView中新增:
- (void)viewSafeAreaInsetsDidChange;
當(dāng)UIViewController調(diào)用- (void)viewDidLoad時(shí)它的所有子視圖的safeAreaInsets屬性都等于UIEdgeInsetsZero。
1、viewDidLoad
2、viewWillAppear
3、viewSafeAreaInsetsDidChange
4、viewWillLayoutSubviews
5、viewDidAppear
只有在調(diào)用viewSafeAreaInsetsDidChange后,才能獲得view以及viewController的SafeArea(UIEdgeInsets)。因此在viewDidload中根據(jù)SafeArea設(shè)置界面會(huì)有問題。
安全區(qū)適配的宏
(屏幕寬度)
#defineWY_ScreenWidth? [UIScreen mainScreen].bounds.size.width
(屏幕高度)
#defineWY_ScreenHeight? [UIScreen mainScreen].bounds.size.height
是否為iPhoneX
#defineWY_iPhoneX (WY_ScreenWidth == 375.f && WY_ScreenHeight == 812.f ? YES : NO)
//狀態(tài)欄高度
#defineWY_StatusBarHeight? ? ? (WY_iPhoneX? ? 44.f : 20.f);
//nav的高度
#defineWY_NavigationBarHeight? 44.f;
//底部tabbar的高度
#defineWY_TabbarHeight? ? ? ? (WY_iPhoneX ? (49.f+34.f) : 49.f)
//底部安全區(qū)高度
#defineWY_TabbarSafeBottomMargin? ? ? ? (WY_iPhoneX ? 34.f : 0.f)
//nav夾status的高度
#defineWY_StatusBarAndNavigationBarHeight? (WY_iPhoneX ? 88.f : 64.f)
//適配安全區(qū)域,還有一種寫法配置全局
#defineWY_ViewSafeAreInsets(view) ({UIEdgeInsets insets;if(@available(iOS 11.0, *)) {insets = view.safeAreaInsets;}else{insets = UIEdgeInsetsZero;} insets;})
2.2UIScrollView
iOS 11廢棄了UIViewController的automaticallyAdjustsScrollViewInsets屬性,新增了contentInsetAdjustmentBehavior屬性,所以當(dāng)超出安全區(qū)域時(shí)系統(tǒng)自動(dòng)調(diào)整了SafeAreaInsets,進(jìn)而影響了adjustedContentInset,在iOS11中決定tableView內(nèi)容與邊緣距離的是adjustedContentInset,所以需要設(shè)置UIScrollView的contentInsetAdjustmentBehavior屬性。
if(@available(iOS 11.0, *)) { // 作用于指定的UIScrollView self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; // 作用與所有的UIScrollView UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; }else{ self.automaticallyAdjustsScrollViewInsets = NO; }
2.3tableview問題
iOS11開始UITableView開啟了自動(dòng)估算行高,estimatedRowHeightestimatedSectionHeaderHeightestimatedSectionFooterHeight三個(gè)高度估算屬性由默認(rèn)的0變成了UITableViewAutomaticDimension,如果不實(shí)現(xiàn)-tableView: viewForFooterInSection:和 -tableView: viewForHeaderInSection:,那么estimatedRowHeightestimatedSectionHeaderHeightestimatedSectionFooterHeight三個(gè)高度估算屬性由默認(rèn)的0變成了UITableViewAutomaticDimension,導(dǎo)致高度計(jì)算不對(duì),會(huì)產(chǎn)生空白。解決方法是實(shí)現(xiàn)對(duì)應(yīng)方法或吧這三個(gè)屬性設(shè)為0。
2.4啟動(dòng)圖的適配
方法一:通過LaunchScreen.storyboard方式啟動(dòng)
方法二:使用Assets中的LaunchImage
給Brand Assets添加一張1125*2436大小的圖片
打開Assets.xcassets文件夾,找到Brand Assets
右鍵Show in Finder
添加一張1125*2436大小的圖片
修改Contents.json文件,添加如下內(nèi)容
2.5定位相關(guān)
在 iOS 11 中必須支持 When In Use授權(quán)模式(NSLocationWhenInUseUsageDescription),在 iOS 11 中,為了避免開發(fā)者只提供請(qǐng)求 Always 授權(quán)模式這種情況,加入此限制,如果不提供When In Use授權(quán)模式,那么 Always相關(guān)授權(quán)模式也無法正常使用。如果要支持老版本,即 iOS 11 以下系統(tǒng)版本,那么建議在 info.plist 中配置所有的 Key
NSLocationWhenInUseUsageDescription NSLocationAlwaysAndWhenInUseUsageDescription NSLocationAlwaysUsageDescription NSLocationAlwaysAndWhenInUseUsageDescription
三、iOS10(Xcode8)
3.1證書問題
為了方便用戶來管理,提供Automatically manage signing。需要輸入開發(fā)者賬號(hào)!如果沒有賬號(hào)也沒關(guān)系,在下面也可以選擇Debug、Realease、inHouse模式下對(duì)應(yīng)的證書也可以!
3.2隱私數(shù)據(jù)訪問問題
iOS10,蘋果加強(qiáng)了對(duì)隱私數(shù)據(jù)的保護(hù),要對(duì)隱私數(shù)據(jù)權(quán)限做一個(gè)適配,iOS10調(diào)用相機(jī),訪問通訊錄,訪問相冊(cè)等都要在info.plist中加入權(quán)限訪問描述,不然之前你們的項(xiàng)目涉及到這些權(quán)限的地方就會(huì)直接crash掉。
解決辦法: 只需要在info.plist添加NSContactsUsageDescription的key, value自己隨意填寫就可以,這里列舉出對(duì)應(yīng)的key(Source Code模式下):
3.3跳轉(zhuǎn)到app內(nèi)的隱私數(shù)據(jù)設(shè)置頁面
iOS 10 干掉了所有系統(tǒng)設(shè)置的 URL Scheme,這意味著你再也不可能直接跳轉(zhuǎn)到系統(tǒng)設(shè)置頁面(比如 WiFi、蜂窩數(shù)據(jù)、定位等)。
iOS 10 干掉了所有系統(tǒng)設(shè)置的 URL Scheme,這意味著你再也不可能直接跳轉(zhuǎn)到系統(tǒng)設(shè)置頁面(比如 WiFi、蜂窩數(shù)據(jù)、定位等)。
跳轉(zhuǎn)方式
方式一:prefs:root=某項(xiàng)服務(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];
3.4字體變化
蘋果的默認(rèn)字體會(huì)隨著iOS系統(tǒng)版本的不同而不同,iOS10中字體變大了。導(dǎo)致了原來的顯示有問題,會(huì)造成...的出現(xiàn)。暫時(shí)沒有好的解決辦法,需要自己在一個(gè)個(gè)適配一下!
3.5UIRefreshControl
在iOS 10 中, UIRefreshControl可以直接在UICollectionView和UITableView中使用,并且脫離了UITableViewController.現(xiàn)在RefreshControl是UIScrollView的一個(gè)屬性.
3.6、UserNotifications(用戶通知)
iOS 10所有相關(guān)通知被統(tǒng)一到了UserNotifications.framework框架中。增加了撤銷、更新、中途還可以修改通知的內(nèi)容。通知不在是簡(jiǎn)單的文本了,可以加入視頻、圖片,自定義通知的展示等等。
iOS 10相對(duì)之前的通知來說更加好用易于管理,并且進(jìn)行了大規(guī)模優(yōu)化,對(duì)于開發(fā)者來說是一件好事。
iOS 10開始對(duì)于權(quán)限問題進(jìn)行了優(yōu)化,申請(qǐng)權(quán)限就比較簡(jiǎn)單了(本地與遠(yuǎn)程通知集成在一個(gè)方法中)。
四、iOS9(Xcode7)
4.1、Bitcode
Xcode7 默認(rèn)啟用 Bitcode,但是如果我們用到的第三方庫編譯時(shí)還沒啟用 Bitcode,主工程就會(huì)編譯不過。Bitcode 是蘋果 App Thinning 的機(jī)制之一,可以減少安裝包的大小。App store 會(huì)將這個(gè) Bitcode 編譯為可執(zhí)行的64位或32位程序。
解決辦法一: 最簡(jiǎn)單的解決辦法是先把 Bitcode 關(guān)掉:把 Build settings - Build Options - Enable Bitcode 改為 NO。
解決辦法二: 移除不支持BitCode的平臺(tái)SDK,或者尋找支持BitCode的替代品,或者聯(lián)系SDK方支持BitCode。
4.2HTTP 請(qǐng)求失敗
iOS9 默認(rèn)不支持 HTTP 請(qǐng)求,需要改用更安全的 HTTPS(默認(rèn)用 TLS 1.2)。蘋果還提供了配置,使得所有安全性更低的網(wǎng)絡(luò)請(qǐng)求也能使用,解決方案就是在 info.plist 里面增加以下配置:
NSAppTransportSecurity? ? NSAllowsArbitraryLoads? ? 復(fù)制代碼
如果復(fù)雜一些,還可以指定白名單域名,聲明所支持 TLS 的最低版本。另外需要注意的是,即使寫了上述配置,在 HTTPS 頁面中,HTTP 的 javascript 或 css 不會(huì)被加載,因?yàn)樘O果認(rèn)為這降低了頁面的安全性
4.3canOpenUrl 限制
canOpenUrl 可以用來判斷用戶是否安裝了某個(gè) APP。也許是出于用戶隱私的考慮,iOS9 上對(duì) canOpenUrl 做了限制,最多只能對(duì) 50 個(gè) scheme 做判斷。如果是用 Xcode7 編譯,需要在 plist 里面聲明這些 scheme,沒有聲明的會(huì)直接返回 NO:
4.4UIStatusBar的問題
iOS9中廢棄的方法
// 修改狀態(tài)欄的樣式為白色//'setStatusBarStyle(_:animated:)'was deprecatediniOS 9.0: Use -[UIViewController preferredStatusBarStyle]UIApplication.shared.setStatusBarStyle(.lightContent, animated:true)// 隱藏狀態(tài)欄//'setStatusBarHidden(_:with:)'was deprecatediniOS 9.0: Use -[UIViewController prefersStatusBarHidden]UIApplication.shared.setStatusBarHidden(true, with: .fade)
//替換方法
-[UIViewController preferredStatusBarstyle]
-[UIViewController preferredStatusBarHidden]
4.5泛型
帶泛型的容器(規(guī)定容器中所存儲(chǔ)的數(shù)據(jù)類型)
(1)帶泛型的數(shù)組
聲明一個(gè)可變數(shù)組, 內(nèi)部存放的都是NSString1.數(shù)組中添加其他類型會(huì)有警告2.數(shù)組取出來的類型不再是id類型, 會(huì)對(duì)應(yīng)變成聲明時(shí)的類型3.泛型會(huì)改變類的一些方法, 使與聲明的類型相同看下圖的情況:
(2)帶泛型的字典
可以看到使用泛型規(guī)定了字典key和value的數(shù)據(jù)類型后,向字典中添加其他類型(如圖中的數(shù)組)時(shí)會(huì)有類型不匹配的警告。而從字典中取出的value也有了固定的類型(圖中規(guī)定的是NSString),因此可以通過取出來的value使用getter方法得到字符串的length屬性
4.5協(xié)變性與逆變性
還是先來看看實(shí)際的例子來了解下什么是協(xié)變性和逆變性吧,下圖是系統(tǒng)NSArray的頭文件部分,可以看到它使用了自定義泛型并命名為 OBjectType,在自定義泛型前加了一個(gè) __covariant 的修飾符,這個(gè)修飾符就表示協(xié)變性
__covariant - 協(xié)變性,子類型可以強(qiáng)轉(zhuǎn)到父類型(里氏替換原則)
__contravariant - 逆變性,父類型可以強(qiáng)轉(zhuǎn)到子類型
后記我不記得實(shí)在那里看的文章,如果有人知道請(qǐng)@wo,我給上連接