http://www.itdecent.cn/p/2ca9ecdb07ce
iOS5.0
1:iMessage
2、iCloud
iCloud存儲(chǔ)API使程序可以將用戶文檔和關(guān)鍵數(shù)據(jù)存儲(chǔ)到iCloud中,并同時(shí)將改動(dòng)推送到用戶所有的計(jì)算機(jī)和設(shè)備上這一切都是自動(dòng)的
3、通知中心
4、自動(dòng)引用計(jì)數(shù)(ARC)
5、Storyboard
6、AirPlay
7、Core Image
8、GameCenter
9、OpenGL ES
iOS6.0
1、地圖 拋棄了googlemap 使用了自家地圖
2、新的IAP(應(yīng)用內(nèi)支付)
3、自動(dòng)布局
iOS7.0
1、UIKIT 全新偏化風(fēng)絡(luò)
2、UIKIT 力學(xué)模型,增加UIDynamicItem委托
3、Store Kit:IAP方面采用了新的訂單系統(tǒng),減少內(nèi)購實(shí)現(xiàn)流程和內(nèi)購破解。實(shí)現(xiàn)
對(duì)訂單的本機(jī)驗(yàn)證
4、多任務(wù)
iOS7之前后臺(tái)完成某些費(fèi)時(shí)間的特定任務(wù),后臺(tái)播放音樂,位置服務(wù),ip電話
iOS7 改變了后臺(tái)任務(wù)的運(yùn)行方式除網(wǎng)絡(luò)外的后臺(tái)任務(wù),被分布到不同的應(yīng)用喚醒系統(tǒng)時(shí)執(zhí)行.
網(wǎng)絡(luò)傳輸?shù)膽?yīng)用建議使用NSURLSessioin 創(chuàng)建后臺(tái)的session并進(jìn)行網(wǎng)格傳輸.
增加了后臺(tái)獲取 Background Fetch ?應(yīng)用打開前有機(jī)會(huì)執(zhí)行代碼來獲取數(shù)取,刷新ui,省去了網(wǎng)絡(luò)加載過程
增加了推送喚醒( 靜默推送,Slient Remove Notifications)
增加了后臺(tái)傳輸(Background Transfer service)
ios8.0
1、iOS開發(fā)界面的統(tǒng)一
Size Classes 的引入和新的 Presentation 系統(tǒng)了
2、IB的重大改進(jìn),可提高開發(fā)效率,節(jié)省開發(fā)時(shí)間
3、 Cloud Kit 的框架的推出
4、Health Kit 和 Home Kit的引入
5、本地通知也需要用戶許可
6、CoreLocation 室內(nèi)定位
7、Touch ID API簡化了Paypal 或者支付寶這樣的第三方支付和確認(rèn)的流程的
iOS9
iOS9系統(tǒng)發(fā)送的網(wǎng)絡(luò)請(qǐng)求將統(tǒng)一使用HTTPs,將不再默認(rèn)使用HTTP等不安全的網(wǎng)絡(luò)協(xié)議,而默認(rèn)采用TLS 1.2。服務(wù)器因此需要更新,以解析相關(guān)數(shù)據(jù)。如不更新,可通過在 info.plist 中聲明,倒退回不安全的網(wǎng)絡(luò)請(qǐng)求。
· 將允許出現(xiàn)這種場景:同一app中多個(gè)location manager:一些只能在前臺(tái)定位,另一些可在后臺(tái)定位
· bitcode的理解應(yīng)該是把程序編譯成的一種過渡代碼,然后蘋果再把這個(gè)過渡代碼編譯成可執(zhí)行的程序。 ? ? ?bitcode也允許蘋果在后期重新優(yōu)化我們程序的二進(jìn)制文件,有類似于App瘦身的思想。
· stackView
· Multasking:多任務(wù)特性,三種形式
·視頻播放的畫中畫模式(Picture in Picture)(AVPlayerViewController默認(rèn)支持。MPMoviePlayerViewController被deprecated掉了,不支持)?
iPad真正同時(shí)使用兩個(gè)App
· UI Test:iOS9.0之前加入異步代碼測設(shè)和性能測試,可以說Xcode自帶的測試框架已經(jīng)能滿足絕大部分單元測試的需求了,但是這并不夠,因?yàn)殚_發(fā)一個(gè)iOS app從來都是很注重UI和用戶體驗(yàn)的,之前UI測試使用KIF,Automating,iOS9.0的Xcode給出了自帶的XCUITest的一系列工具,和大多數(shù)UI測試工具類似,XCUI使用Accessbility標(biāo)記來確定view,但因?yàn)槭茿pple自家的東西,可以自動(dòng)記錄操作流程,所以只要書寫最后的驗(yàn)證部分就好了,比其他UI測試工具方便多了
· Swift2
· APP Thinning:app為了后向兼容,都同時(shí)包含了32bit和64bit,在圖片資源2X和3X的一應(yīng)俱全,下載的時(shí)候只需要當(dāng)前機(jī)型對(duì)應(yīng)的一套資源,但是卻要全部打包下載,現(xiàn)在只需要升級(jí)iOS9,就可以省很多流量
· 3D touch
· 地圖顯示實(shí)時(shí)的交通狀況
· 人工智能siri更加智能,幾個(gè)大城市的地鐵及火車站入口都有詳細(xì)的標(biāo)識(shí)
· 手機(jī)電池的低功耗設(shè)置
· Spootlight,你的設(shè)備會(huì)向推薦最近通話過的聯(lián)系人,使用過的APP以及你可能感興趣的去處、信息呈現(xiàn)更精彩
iOS10
· SiriKit 在 iOS 10 里面開發(fā)者可以使用 Siri SDK,這可能是 iOS 10 最重要的新 SDK之一。從此開發(fā)者可以使用原生API提供語音搜索、語音轉(zhuǎn)文字消息甚至更多常見語音功能。
· Proactive Suggestions 貌似是一個(gè)和 CoreSpotlight 有整合的使用建議的東西。
· Message App Extension 在 iOS 10 里面開發(fā)者可以給 Message.app 提供兩種 App Extension,分別是可以提供一個(gè)表情包,和一個(gè)自定義的界面,用于表情搜索等。
· User Notifications 這個(gè) API 讓你可以處理本地或遠(yuǎn)程的用戶通知,并且可以基于某個(gè)條件,例如時(shí)間或者地理位置。這個(gè)異常強(qiáng)大,好像可以在通知里包含圖片和視頻了,貌似可以攔截并替換自己 app 發(fā)下來的 payload。
· Speech Recognition 見聞知意,語音識(shí)別 API,可以把音頻流實(shí)時(shí)的轉(zhuǎn)換為文本。雖說早期版本已經(jīng)有了TTS語音轉(zhuǎn)文字,但畢竟Siri語義識(shí)別的加入讓機(jī)器對(duì)自然語義的把握更精準(zhǔn),詳見Speech.framework
· App Search Enhancements 對(duì) CoreSpotlight 的增強(qiáng),其中我比較感興趣的是 Visualization of validation results。
· Widget Enhancements 為了配合 iOS 10 鎖屏下面 Widget 的體驗(yàn),蘋果提供了 widgetPrimaryVibrancyEffect 和 widgetSecondaryVibrancyEffect 用于定制化 Widget 的界面。
· CallKit callkit框架 VoIP應(yīng)用程序集成與iPhone的通話界面,給用戶一個(gè)很棒的體驗(yàn),鎖屏后VoIP網(wǎng)絡(luò)電話可以直接用iPhone系統(tǒng)UI接聽了。
· App Extensions 其實(shí)上面也有提到,iOS 10最重要的開發(fā)特點(diǎn)就是允許第三方應(yīng)用對(duì)自帶基礎(chǔ)app的拓展關(guān)聯(lián), 全新 7 種 App Extension:?
Call Directory(VoIP回調(diào))
Intents(接Siri、Apple map等服務(wù))
Intents UI(接Siri、Apple map等服務(wù)的自定義界面)
Messages(iMessage拓展)
Notification Content(內(nèi)容通知)
Notification Service (服務(wù)通知)
StickerPack(iMessage表情包)
· Custom Keyboard 對(duì)第三方鍵盤的改進(jìn) 通過 handleInputModeListFromView:withEvent: 可以彈出系統(tǒng)鍵盤列表。同時(shí)使用 documentInputMode 可以檢測輸入上下文中的語言,你可以對(duì)輸入方式進(jìn)行一些類似于對(duì)齊方式的調(diào)整。
另外需要注意的是,和以往歷代iOS版本推出一樣,新陳代謝,有新SDK、新API的開放,也會(huì)有舊的API被遺棄,所以好好檢查你的項(xiàng)目,使用了被遺棄的API要盡快修改,以免不兼容!還有個(gè)要注意的問題 iOS10 對(duì)隱私權(quán)限的管理更為嚴(yán)格 ,比如訪問的攝像頭、麥克風(fēng)等硬件,都需要提前請(qǐng)求應(yīng)用權(quán)限、允許后才可以使用,或者現(xiàn)在要提前聲明,雖然以往要求不嚴(yán)格。
ios11新特性
1.UIKit Bars的改版
1.在瀏覽功能上的大標(biāo)題視圖(向上滑動(dòng)后標(biāo)題會(huì)回到原來的UI效果)、橫屏狀態(tài)下tab上的文字和icon會(huì)變?yōu)樽笥遗帕小?/p>

橫屏.png
當(dāng)然,如果圖標(biāo)和文字覺得太小了,可以長按item進(jìn)行放大操作。具體只需要添加代碼

放大.png
2. iOS11導(dǎo)航欄
設(shè)置導(dǎo)航欄大標(biāo)題:navigationBar.prefersLargeTitles,顯示的時(shí)機(jī)可以用navigationItem.largeTitleDisplayMode設(shè)置枚舉值。
設(shè)置導(dǎo)航欄搜索控制器
searchController? :self.navigationItem.searchController = searchController
3.上面設(shè)置titleView為customView時(shí)出現(xiàn)寬度縮小的問題 (這個(gè)網(wǎng)上提到了這個(gè)問題,但是我自定義代碼并沒有出現(xiàn)這個(gè)情況)
3.調(diào)整相冊權(quán)限的key
NSPhotoLibraryUsageDescription改為NSPhotoLibraryAddUsageDescription
。(beta版本好像又改過來了,我現(xiàn)在沒有調(diào)整key也是可以訪問相冊的)
4.近場通訊
首先也要在info.plist配置NFCReaderUsageDescription
5.無線配備
6. 棄用API,scrollview和tableview的改變
iOS11棄用了automaticallyAdjustsScrollViewInsets
屬性,新增contentInsetAdjustmentBehavior
來替代它。這可能使得一些刷新出現(xiàn)頭部錯(cuò)亂。contentInsetAdjustmentBehavior其實(shí)是一個(gè)枚舉值。用來管理adjustedContentInset
-automatic和scrollableAxes一樣,scrollView會(huì)自動(dòng)計(jì)算和適應(yīng)頂部和底部的內(nèi)邊距并且在scrollView不可滾動(dòng)時(shí),也會(huì)設(shè)置內(nèi)邊距.
-scrollableAxes自動(dòng)計(jì)算內(nèi)邊距.
-never不計(jì)算內(nèi)邊距
-always根據(jù)safeAreaInsets計(jì)算內(nèi)邊距
我們這里要設(shè)置為never,所以我們的OC代碼可以這樣寫:
聲明tableView的位置 添加下面代碼
if(@available(iOS11.0, *)) {self.tableView.contentInsetAdjustmentBehavior =UIScrollViewContentInsetAdjustmentNever;self.tableView.contentInset =UIEdgeInsetsMake(0,0,0,0);self.tableView.scrollIndicatorInsets = _tableView.contentInset;? ? ? ? }
在iOS8引入Self-Sizing之后,我們可以通過實(shí)現(xiàn)estimatedRowHeight相關(guān)的屬性來展示動(dòng)態(tài)的內(nèi)容。Self-Sizing在iOS11下是默認(rèn)開啟的,Headers,Footers, and cells都默認(rèn)開啟Self-Sizing,所有estimated高度默認(rèn)值從iOS11之前的 0 改變?yōu)閁ITableViewAutomaticDimension.
如果目前項(xiàng)目中沒有使用estimateRowHeight屬性,在iOS11的環(huán)境下就要注意了,因?yàn)殚_啟Self-Sizing之后,tableView是使用estimateRowHeight屬性的,就會(huì)可能會(huì)使代理方法設(shè)置高度失效.
通過以下方法進(jìn)行關(guān)閉:
Table Views:separatorInset 擴(kuò)展
iOS 7 引入separatorInset屬性,用以設(shè)置 cell 的分割線邊距,在 iOS 11 中對(duì)其進(jìn)行了擴(kuò)展。可以通過新增的UITableViewSeparatorInsetReference枚舉類型的separatorInsetReference屬性來設(shè)置separatorInset屬性的參照值。
typedefNS_ENUM(NSInteger,UITableViewSeparatorInsetReference) {UITableViewSeparatorInsetFromCellEdges,//默認(rèn)值,表示separatorInset是從cell的邊緣的偏移量UITableViewSeparatorInsetFromAutomaticInsets//表示separatorInset屬性值是從一個(gè)insets的偏移量}
7.拖放
8.文件管理
9.tableView右滑操作
增加了兩個(gè)代理方法來取代原來的代理方法(tableView: editActionsForRowAtIndexPath:)
// Swipe actions// These methods supersede -editActionsForRowAtIndexPath: if implemented- (nullableUISwipeActionsConfiguration*)tableView:(UITableView*)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath*)indexPath- (nullableUISwipeActionsConfiguration*)tableView:(UITableView*)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath*)indexPath
創(chuàng)建UIContextualAction對(duì)象時(shí),UIContextualActionStyle有兩種類型,如果是置頂、已讀等按鈕就使用UIContextualActionStyleNormal類型,delete操作按鈕可使用UIContextualActionStyleDestructive類型,當(dāng)使用該類型時(shí),如果是右滑操作,一直向右滑動(dòng)某個(gè)cell,會(huì)直接執(zhí)行刪除操作,不用再點(diǎn)擊刪除按鈕。
10.Safe Area
以前做懸?。ㄖЦ?,頭部標(biāo)題等),系統(tǒng)為我們提供了viewController的topLayoutGuide和bottomLayoutGuide方法進(jìn)行約束,但是在iOS11中被廢棄了,引用了一個(gè)新的概念。safeArea,它提供兩種方式:safeAreaInsets或safeAreaLayoutGuide來提供給你safeArea的參照值,即insets或者layout guide。同時(shí)如果改變Insets時(shí)會(huì)獲得兩個(gè)回調(diào)
UIView.safeAreaInsetsDidChange()UIViewController.viewSafeAreaInsetsDidChange()
這個(gè)iOS的safe Area涉及到的第三方庫有mansory和IQkeyboard所以可能這兩個(gè)庫也會(huì)進(jìn)行一些適配
11.UIToolbar and UINavigationBar— Layout
在 iOS 11 中,當(dāng)蘋果進(jìn)行所有這些新特性時(shí),也進(jìn)行了其他的優(yōu)化,針對(duì) UIToolbar 和 UINavigaBar 做了新的自動(dòng)布局?jǐn)U展支持,自定義的bar button items、自定義的title都可以通過layout來表示尺寸。 需要注意的是,你的constraints需要在view內(nèi)部設(shè)置,所以如果你有一個(gè)自定義的標(biāo)題視圖,你需要確保任何約束只依賴于標(biāo)題視圖及其任何子視圖。當(dāng)你使用自動(dòng)布局,系統(tǒng)假設(shè)你知道你在做什么。
12. 管理margins 和 insets
基于約束的Auto Layout,使我們搭建能夠動(dòng)態(tài)響應(yīng)內(nèi)部和外部變化的用戶界面。Auto Layout為每一個(gè)view都定義了margin。margin指的是控件顯示內(nèi)容部分的邊緣和控件邊緣的距離。 可以用layoutMargins或者layoutMarginsGuide屬性獲得view的margin,margin是視圖內(nèi)部的一部分。layoutMargins允許獲取或者設(shè)置UIEdgeInsets結(jié)構(gòu)的margin。layoutMarginsGuide則獲取到只讀的UILayoutGuide對(duì)象。
在iOS11新增了一個(gè)屬性:directional layout margins,該屬性是NSDirectionalEdgeInsets結(jié)構(gòu)體類型的屬性:
typedefstructNSDirectionalEdgeInsets{CGFloattop, leading, bottom, trailing;}NSDirectionalEdgeInsetsAPI_AVAILABLE(ios(11.0),tvos(11.0),watchos(4.0));
layoutMargins是UIEdgeInsets結(jié)構(gòu)體類型的屬性:
typedefstructUIEdgeInsets{CGFloattop, left, bottom, right;}UIEdgeInsets;
從上面兩種結(jié)構(gòu)體的對(duì)比可以看出,NSDirectionalEdgeInsets屬性用leading 和 trailing 取代了之前的 left 和 right。
directional layout margins屬性的說明如下:
directionalLayoutMargins.leading is used on the left when the user interface direction is LTR and on the right for RTL.
Vice versa for directionalLayoutMargins.trailing.
例子:當(dāng)你設(shè)置了trailing = 30;當(dāng)在一個(gè)right to left 語言下trailing的值會(huì)被設(shè)置在view的左邊,可以通過layout margins的left屬性讀出該值。
如下圖所示:
還有其他一些更新。自從引入layout margins,當(dāng)將一個(gè)view添加到viewController時(shí),viewController會(huì)修復(fù)view的layoutMargins為UIKit定義的一個(gè)值,這些調(diào)整對(duì)外是封閉的。從iOS11開始,這些不再是一個(gè)固定的值,它們實(shí)際是最小值,你可以改變你的view的layoutMargins為任意一個(gè)更大的值。而且,viewController新增了一個(gè)屬性:viewRespectsSystemMinimumLayoutMargins,如果你設(shè)置該屬性為”false”,你就可以改變你的layout margins為任意你想設(shè)置的值,包括0。
0人點(diǎn)贊