-
iOS 10 新特性以及適配點
-
SiriKit
所有第三方應用都可以用Siri,支持音頻、視頻、消息發送接收、搜索照片、預訂行程、管理鍛煉等
-
Proactive Suggestions 系統預先建議
背景就是iOS9的時候系統給予的主動建議 通過:Spolight搜索,Safari搜索,Handoff,或者siri建議。
在iOS10之后新增了,鍵盤QuickType建議,地圖,車載娛樂,應用切換,siri交互,鎖屏播放。eg:你正在一個應用里看一個酒店,可以使用mapitem屬性保存正在查看的這個酒店的位置,然后你切換旅行或地圖App時這個位置可以自動提供使用。
如果你需要這樣利用系統來共享一個位置,那你需要指定這個位置的經緯度、地名、電話等屬性來便於siri的直接調起。
-
Message App Extension
在 iOS 10 里面開發者可以給 Message.app 提供兩種 App Extension,分別是可以提供一個表情包(沒錯,英文名就叫 Sticker Pack),和一個自定義的界面,用於表情搜索等
-
User Notifications 用戶通知
iOS 10 中以前雜亂的和通知相關的 API 都被統一了,現在開發者可以使用獨立的 UserNotifications.framework 來集中管理和使用 iOS 系統中通知的功能。
在 iOS 10 中,開發者的服務器有機會在本地或者遠程通知發送給用戶之前再進行修改。
在此基礎上,Apple 還增加了撤回單條通知,更新已展示通知,中途修改通知內容,在通知中展示圖片視頻,自定義通知 UI 等一系列新功能,非常強大。
-
Speech Recognition 語音識別
IOS 10 引入Speech.framework用來支持語音識別, 在app中可以識別語音並轉成文本, 語音來源可以是實時的也可以是錄音。
-
Wide Color 廣色域
包括Core Graphics,Core Image,Metal,AVFoundation在內的圖像框架極大的改善了對更加廣泛的像素格式和寬色域色彩空間的支持。
Adapting to the True Tone Display 真色調展示
真色調(True Tone)顯示使用環境光傳感器,可以做到配合當前環境的光線條件自動調節顯示的顏色和強度。如果你的應用是閱讀類,和環境中的白點保持一致對用戶來說就是有益的。
-
App Search Enhancements 應用搜索增強功能
新的CSSearchQuery類支持搜索那些你用Core Spotlight API指出的應用內內容。
使用這些API可以淘汰你應用中單獨的搜索索引,以及更好的利用Spotlight強大的搜索技術,同時,匹配規則允許用戶在不離開你應用的條件下搜索內容,就像他們在Mail,Messages和Notes中體驗到的一樣。
-
Widget Enhancements widget增強功能
iOS10引入了一個新的鎖屏設計,新的鎖屏現在會顯示各種widget。
-
Apple Pay Enhancements
在iOS10中,用戶可以從網頁上,或通過Siri和地圖的互動來使用Apple Pay進行簡單和安全的支付。
對於開發者來說,iOS10引入了可以同時在iOS和watchOS上使用的新API,支持動態支付網絡的能力,和新的沙盒測試環境。
-
Security and Privacy Enhancements
iOS10引入幾個變化來幫助您提高代碼的安全和維護用戶數據的隱私性。
想了解更多,請查閱 https://developer.apple.com/security/。
-
CallKit 來電攔截相關
CallKit框架(CallKit.framework)使得VoIP應用能與iPhone UI整合到一起,從而給用戶帶來更好的體驗。
使用這個框架來讓用戶在鎖屏頁面查看和接聽打來的VoIP電話,並在Phone應用的個人收藏和最近通話視圖中管理來自VoIP通話的聯系人。
CallKit框架同樣也引入了應用擴展(app extensions),這個擴展可以進行呼叫攔截和來電識別。你可以創建一個應用擴展來將電話號碼和名稱關聯起來,或是告訴系統什么樣的號碼需要被攔截。
-
News Publisher Enhancements
News Publisher使用Apple News Format來讓發表設計精美的新聞、雜志、網頁內容到Apple News變的簡單。
從各大雜志或新聞機構這種獨立出版商,到個人博客,任何人都可以注冊。
-
Video Subscriber Account
iOS10引入了Video Subscriber Account框架(VideoSubscriberAccount.framework)來幫助應用支持流媒體認證或認證視頻點播(也被稱為TV Everywhere)與他們的有線電視或衛星電視供應商認證。
對於那些用戶注冊一次就能解鎖流媒體訂閱服務的應用來說,使用這個框架中的API可以幫助你支持單一登錄體驗。
-
增加的庫
CallKit
iAd
Intents (Siri相關)
IntentsUI (Siri相關)
Messages
Speech
UserNotifications
UserNotificationsUI
VideoSubscriberAccount
-
移除的庫
iAdJS
-
變化的接口
AVKit、Core Image、GameKit、GameplayKit、HealthKit、HomeKit、Metal、ModelIO、Photos、ReplayKit、ReplayKit、SpriteKit均有不同程度的改動。詳細請參考官方 iOS 9.3 to iOS 10.0 API Differences
需要關注的地方
1. UITabBarController 中的改進
在iOS 10之前,tabBarItem上的文字顏色,默認是藍色,上面的新消息提醒數字badge 默認是紅色的,未選中的TabBarItem的文字顏色默認是黑色的,我們修改的話,也只能修改它的默認顏色 ,其它的就不能進行個性化定制,使用起來非常的不方便,iOS10之后我們可以輕松個性化定制了。
2. iOS10.0中字體跟隨系統設置變化大小
在以前如果說我們想改變APP中程序的字體大小,我們只能自定義字體或者使用runtime進行處理,或者都得設置UIFont,非常的不方便,從iOS 10蘋果官方允許我們自定義設置 代碼:self.labels.adjustsFontForContentSizeCategory = YES;
3. UIViewPropertyAnimator屬性動畫器
那么在iOS 10之前,我們使用UIView 做動畫效果或者自定義一些layer 的動畫,如果開始了,一般無法進行停止操作更不能暫停操作,而且一些非常復雜的動畫處理也比較麻煩,但是在iOS10,蘋果推出了一個全新的APIUIViewPropertyAnimator,可供我們處理動畫操作
4. UIColor 新增方法
在iOS10之前,UIColor中設置顏色只能通過RGB 來表示,在iOS原生還不支持#16進制寫法,還得自己寫分類去處理,我們知道RGB表示的顏色是優先的,而且也是不精准的,那么在iOS10中,蘋果官方新增了colorWithDisplayP3Red方法
5. UIApplication對象中openUrl被廢棄
在iOS 10.0以前的年代,我們要想使用應用程序去打開一個網頁或者進行跳轉,直接使用[[UIApplication sharedApplication] openURL 方法就可以了,但是在iOS 10 已經被廢棄了,因為使用這種方式,處理的結果我們不能攔截到也不能獲取到,對於開發是非常不利的,在iOS 10全新的推出了[UIApplication sharedApplication] openURL:nil options:nil completionHandler:^(BOOL success);有一個成功的回調block 可以進行監視。
6. CoreData提升了並發訪問性能
7. 刷新控件(UIRefresh Control)
iOS系統自帶的刷新控件支持所有的 UIScrollView 以及其子類,比如說 UICollectionView,UITableView。
8. GCD多線程支持創建私有隊列
9. iOS10 對隱私權限的管理
比如訪問的攝像頭、麥克風等硬件,都需要提前請求應用權限、允許后才可以使用,或者現在要提前聲明,雖然以往要求不嚴格。比如在iOS10中訪問通訊錄時,強制必須在Info.plist中加入NSContactsUsageDescription等描述,否則應用會崩潰。
崩潰日志:
***This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCameraUsageDescriptionkey with a string value explaining to the user how the app uses this data.
10. 證書簽名
在Xcode 8中,代碼簽名錯誤的情況應該不會存在了。
在每一個targe中,你都可以在框中打勾來告訴Xcode讓它來代表你管理代碼簽名。 對於新項目這個選項默認是打開的。
打勾以后,Xcode為你管理certificates, provisioning profiles和 application identifiers。
11. Xib兼容問題
Xcode8上打開項目要小心,尤其是對於xib過程,在變動后可不要隨意點保存,否則當你回頭用Xcode7打開時時發現報錯了,Xcode保存的xib在xcode7上是識別不了的, 如果你在Xcode8中打開或者xib文件,會彈出如下提示框, 忽視他
12. 運行時問題 Runtime Issues
這Xcode新特性,自動識別跟蹤找到漏洞並且報告問題, 有些很難跟蹤的bug,直到您的應用程序到了用戶手中,也可能沒有被發現。
Thread Sanitizer spots:新的線程污點清理器, 解決多線程情況下的資源競爭條件,數據的變化和其它相關線程的
bug View Debugger:使用更新的帶有更大的保真度和視覺精度檢查UI約束問題的視圖調試器
Memory Debugger:可以用新的內存調試跟蹤器跟蹤發出的內存泄漏警報。
iOS 10 兼容適配點
1. iOS 10 對隱私權限的管理(必須要改否則會crash)
比如訪問的攝像頭、麥克風等硬件,都需要提前請求應用權限、允許后才可以使用,或者現在要提前聲明,雖然以往要求不嚴格。比如在iOS10中訪問通訊錄時,強制必須在Info.plist中加入NSContactsUsageDescription等描述,否則應用會崩潰。
崩潰日志:
***This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCameraUsageDescriptionkey with a string value explaining to the user how the app uses this data. Photo Library NSPhotoLibraryUsageDescription Camera NSCameraUsageDescription Microphone NSMicrophoneUsageDescription Location NSLocationUsageDescription Location When In Use NSLocationWhenInUseUsageDescription Location Always NSLocationAlwaysUsageDescription Calendars NSCalendarsUsageDescription Reminders NSRemindersUsageDescription Motion NSMotionUsageDescription Health Update NSHealthUpdateUsageDescription Health Share NSHealthShareUsageDescription Bluetooth Peripheral NSBluetoothPeripheralUsageDescription
相關字段:
麥克風權限:Privacy - Microphone Usage Description 是否允許此App使用你的麥克風?
相機權限: Privacy - Camera Usage Description 是否允許此App使用你的相機? 相冊權限: Privacy - Photo Library Usage Description 是否允許此App訪問你的媒體資料庫?通訊錄權限: Privacy - Contacts Usage Description 是否允許此App訪問你的通訊錄? 藍牙權限:Privacy - Bluetooth Peripheral Usage Description 是否許允此App使用藍牙? 語音轉文字權限:Privacy - Speech Recognition Usage Description 是否允許此App使用語音識別? 日歷權限:Privacy - Calendars Usage Description 是否允許此App使用日歷? 定位權限:Privacy - Location When In Use Usage Description 我們需要通過您的地理位置信息獲取您周邊的相關數據 定位權限: Privacy - Location Always Usage Description 我們需要通過您的地理位置信息獲取您周邊的相關數據
2. Xib兼容問題
Xcode8上打開項目要小心,尤其是對於xib過程,在變動后可不要隨意點保存,否則當你回頭用Xcode7打開時時發現報錯了,Xcode8保存的xib在xcode7上是識別不了的, 如果你在Xcode8中打開或者xib文件,會彈出如下提示框, 忽視他
3. UIApplication對象中openUrl被廢棄(不改也可以用)
在iOS 10.0以前的年代,我們要想使用應用程序去打開一個網頁或者進行跳轉,直接使用[[UIApplication sharedApplication] openURL方法就可以了,但是在iOS 10 已經被廢棄了,因為使用這種方式,處理的結果我們不能攔截到也不能獲取到,對於開發是非常不利的,在iOS 10全新的推出了[UIApplication sharedApplication] openURL:nil options:nil completionHandler:^(BOOL success);有一個成功的回調block 可以進行監視。
4. 安全和保密性
使用改進后的SecKey API 而不是過時的 CDSA API。
安全傳輸API中不再支持SSLv3, 建議你們盡快停用SHA1和3DES加密算法。
5. widget鎖屏界面
現在鎖屏界面有了新的設計,建議我們廢棄以前的notificationCenterVibrancyEffect 改用widgetPrimaryVibrancyEffect或者widgetSecondaryVibrancyEffect,並且窗口的小部件可以讓你描述有多少東西可用,支持緊湊和擴展兩種形態。
6. AVFoundation(不改也可以用)
AVCaptureStillImageOutput廢棄了, 用AVCapturePhotoOutput替換.
7. IOS版本檢查
下面的寫法會返回NO
#define IsIOS7 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=7)
因為substringToIndex:1 in SDK 'iOS 10.0'(Xcode 8) means SDK 'iOS 1.0'
8. 廢棄的API(不改也可以用)
CloudKit中廢棄的
CKDiscoverAllContactsOperation
CKDiscoveredUserInfo
CKDiscoverUserInfosOperation
CKFetchRecordChangesOperation
CKSubscription中廢棄的
initWithRecordType:predicate:options:
initWithRecordType:predicate:subscriptionID:options:
initWithZoneID:options:
initWithZoneID:subscriptionID:options:
zoneID
recordType
predicate
subscriptionOptions
CKSubscriptionOptions
initWithCoder:
NSPersistentStoreCoordinator中廢棄的
removeUbiquitousContentAndPersistentStoreAtURL:options:error:
lock
tryLock
unlock
metadataForPersistentStoreWithURL:error:
setMetadata:forPersistentStoreOfType:URL:error:
metadataForPersistentStoreOfType:URL:error:
NSPersistentStoreUbiquitousTransitionType
NSPersistentStoreDidImportUbiquitousContentChangesNotification
setStoresFastSyncDetailsAtURL:forPersistentStore:
syncWithClient:inBackground:handler:error:
UIViewController中廢棄的
ADBannerView
ADInterstitialAd
SKUniform中廢棄的
uniformWithName:floatVector2:
uniformWithName:floatVector3:
uniformWithName:floatVector4:
uniformWithName:floatMatrix2:
uniformWithName:floatMatrix3:
uniformWithName:floatMatrix4:
initWithName:floatVector2:
initWithName:floatVector3:
initWithName:floatVector4:
initWithName:floatMatrix2:
initWithName:floatMatrix3:
initWithName:floatMatrix4:
floatVector2Value
floatVector3Value
floatVector4Value
floatMatrix2Value
floatMatrix3Value
floatMatrix4Value
UIKit中廢棄的
UILocalNotification
UIMutableUserNotificationAction
UIMutableUserNotificationCategory
UIUserNotificationAction
UIUserNotificationCategory
UIUserNotificationSettings
WatchKit中廢棄的
handleActionWithIdentifier:forLocalNotification:
handleActionWithIdentifier:forRemoteNotification:
didReceiveLocalNotification:withCompletion:
didReceiveRemoteNotification:withCompletion:
WKExtensionDelegate
didReceiveRemoteNotification:
handleActionWithIdentifier:forRemoteNotification:
9.屏蔽雜亂無章的bug
更新Xcode8之后,新建立工程,都會打印一堆莫名其妙看不懂的Log.
屏蔽的方法如下:
Xcode8里邊 Edit Scheme-> Run -> Arguments, 在Environment Variables里邊添加
OS_ACTIVITY_MODE = Disable
10.代碼注釋不能用的解決辦法
這個是因為蘋果解決xcode ghost,把插件屏蔽了。
解決方法
打開終端,命令運行: sudo /usr/libexec/xpccachectl
然后必須重啟電腦后生效
注意:Xcode8內置了開啟注釋的功能,位置在這里
/** 如有不足,歡迎補充! */