看各個大神整理而成web
一、檢查版本問題算法
不能夠像下面這樣用api
#define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1]intValue]>=10)
安全
這樣能夠網絡
[[UIDevice currentDevice].systemVersion floatValue] >= 10.0數據結構
二、隱私設置app
你的項目中訪問了隱私數據,好比:相機,相冊,聯繫人等,在Xcode8中打開編譯的話,通通會crash框架
<!-- 相冊 --> <key>NSPhotoLibraryUsageDescription</key> <string>App須要您的贊成,才能訪問相冊</string> <!-- 相機 --> <key>NSCameraUsageDescription</key> <string>App須要您的贊成,才能訪問相機</string> <!-- 麥克風 --> <key>NSMicrophoneUsageDescription</key> <string>App須要您的贊成,才能訪問麥克風</string> <!-- 位置 --> <key>NSLocationUsageDescription</key> <string>App須要您的贊成,才能訪問位置</string> <!-- 在使用期間訪問位置 --> <key>NSLocationWhenInUseUsageDescription</key> <string>App須要您的贊成,才能在使用期間訪問位置</string> <!-- 始終訪問位置 --> <key>NSLocationAlwaysUsageDescription</key> <string>App須要您的贊成,才能始終訪問位置</string> <!-- 日曆 --> <key>NSCalendarsUsageDescription</key> <string>App須要您的贊成,才能訪問日曆</string> <!-- 提醒事項 --> <key>NSRemindersUsageDescription</key> <string>App須要您的贊成,才能訪問提醒事項</string> <!-- 運動與健身 --> <key>NSMotionUsageDescription</key> <string>App須要您的贊成,才能訪問運動與健身</string> <!-- 健康更新 --> <key>NSHealthUpdateUsageDescription</key> <string>App須要您的贊成,才能訪問健康更新 </string> <!-- 健康分享 --> <key>NSHealthShareUsageDescription</key> <string>App須要您的贊成,才能訪問健康分享</string> <!-- 藍牙 --> <key>NSBluetoothPeripheralUsageDescription</key> <string>App須要您的贊成,才能訪問藍牙</string> <!-- 媒體資料庫 --> <key>NSAppleMusicUsageDescription</key> <string>App須要您的贊成,才能訪問媒體資料庫</string>
三、UIColor問題dom
官方文檔中說:大多數core
開頭的圖形框架和AVFoundation
都提升了對擴展像素和寬色域色彩空間的支持.經過圖形堆棧擴展這種方式比以往支持廣色域的顯示設備更加容易。如今對UIKit擴展能夠在sRGB的色彩空間下工做,性能更好,也能夠在更普遍的色域來搭配sRGB顏色.若是你的項目中是經過低級別的api本身實現圖形處理的,建議使用sRGB,也就是說在項目中使用了RGB轉化顏色的建議轉換爲使用sRGB,在UIColor
類中新增了兩個api:ide
- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0); + (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
四、真色彩顯示
真彩色的顯示會根據光感應器來自動的調節達到特定環境下顯示與性能的平衡效果,若是須要這個功能的話,能夠在info.plist
裏配置(在Source Code模式下):
<key>UIWhitePointAdaptivityStyle</key>
它有五種取值,分別是:
<string>UIWhitePointAdaptivityStyleStandard</string> // 標準模式 <string>UIWhitePointAdaptivityStyleReading</string> // 閱讀模式 <string>UIWhitePointAdaptivityStylePhoto</string> // 圖片模式 <string>UIWhitePointAdaptivityStyleVideo</string> // 視頻模式 <string>UIWhitePointAdaptivityStyleStandard</string> // 遊戲模式
也就是說若是你的項目是閱讀類的,就選擇UIWhitePointAdaptivityStyleReading
這個模式,五種模式的顯示效果是從上往下遞減,也就是說若是你的項目是圖片處理類的,你選擇的是閱讀模式,給選擇太好的效果會影響性能.
五、ATS問題
---在iOS 9的時候,默認非HTTS的網絡是被禁止的,咱們能夠在info.plist
文件中添加NSAppTransportSecurity
字典,將NSAllowsArbitraryLoads
設置爲YES
來禁用ATS;
---從2017年1月1日起,,全部新提交的 app 默認不容許使用NSAllowsArbitraryLoads
來繞過ATS的限制,默認狀況下你的 app 能夠訪問加密足夠強的(TLS V1.2以上)HTTPS內容;
---能夠選擇使用NSExceptionDomains
設置白名單的方式對特定的域名開放HTTP內容來經過審覈,好比說你的應用集成了第三方的登陸分享SDK,能夠經過這種方式來作,下面以新浪SDK做爲示範(Source Code 模式下):
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>sina.cn</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> <key>weibo.cn</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> <key>weibo. com</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> <key>sinaimg.cn</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> <key>sinajs.cn</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> <key>sina.com.cn</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>
---在iOS 10 中info.plist
文件新加入了NSAllowsArbitraryLoadsInWebContent
鍵,容許任意web頁面加載,同時蘋果會用 ATS 來保護你的app;
---安全傳輸再也不支持SSLv3
, 建議儘快停用SHA1
和3DES
算法;
六、UIStatusBar
原來setStatusBarStyle不能用了,如今能夠經過屬性來設置
@property(nonatomic,readonly)UIStatusBarStyle preferredStatusBarStyle
@property(nonatomic,readonly)BOOL prefersStatusBarHidden
-(BOOL)prefersStatusBarHidden
-(UIStatusBarAnimation)preferredStatusBarUpdateAnimation
七、UITextField
在iOS 10 中,UITextField
新增了textContentType
字段,是UITextContentType
類型,它是一個枚舉,做用是能夠指定輸入框的類型,以便系統能夠分析出用戶的語義.是電話類型就建議一些電話,是地址類型就建議一些地址.能夠在#import <UIKit/UITextInputTraits.h>
文件中,查看textContentType
字段,有如下能夠選擇的類型:
UITextContentTypeName UITextContentTypeNamePrefix UITextContentTypeGivenName UITextContentTypeMiddleName UITextContentTypeFamilyName UITextContentTypeNameSuffix UITextContentTypeNickname UITextContentTypeJobTitle UITextContentTypeOrganizationName UITextContentTypeLocation UITextContentTypeFullStreetAddress UITextContentTypeStreetAddressLine1 UITextContentTypeStreetAddressLine2 UITextContentTypeAddressCity UITextContentTypeAddressState UITextContentTypeAddressCityAndState UITextContentTypeSublocality UITextContentTypeCountryName UITextContentTypePostalCode UITextContentTypeTelephoneNumber UITextContentTypeEmailAddress UITextContentTypeURL UITextContentTypeCreditCardNumber
八、對UICollectionView進行了優化
對UICollectionView進行了優化,並新增長了預加載的UICollectionViewDataSourcePrefetching代理協議及代理方法
-(void)collectionView: (UICollectionView*)collectionView prefetchItemsAtIndexPaths: (NSArray*)indexPaths
-(void)collectionView: (UICollectionView*)collectionView cancelPrefetchingForItemsAtIndexPaths: (NSArray*)indexPaths
注意:這兩個代理方法並不能代替以前讀取數據的方法,僅僅是輔助加載數據在iOS 10 以前,UICollectionView上面若是有大量cell,當用戶活動很快的時候,整個UICollectionView的卡頓會很明顯,爲何會形成這樣的問題,這裏涉及到了iOS 系統的重用機制,當cell準備加載進屏幕的時候,整個cell都已經加載完成,等待在屏幕外面了,也就是整整一行cell都已經加載完畢,這就是形成卡頓的主要緣由,專業術語叫作:掉幀.要想讓用戶感受不到卡頓,咱們的app必須幀率達到60幀/秒,也就是說每幀16毫秒要刷新一次.
prepareForReuse
方法,在這個方法裏面,能夠重置cell的狀態,加載新的數據;cellForItemAtIndexPath
方法,在這個方法裏面給cell賦值模型,而後返回給系統;willDisplayCell
方法,在這個方法裏面咱們還能夠修改cell,爲進入屏幕作最後的準備工做;willDisplayCell
方法後,cell就進去屏幕了.當cell徹底離開屏幕之後,會調用didEndDisplayingCell
方法.prepareForReuse
方法,在這裏當cell尚未進去屏幕的時候,就已經提早調用這個方法了,對比以前的區別是以前是cell的上邊緣立刻進去屏幕的時候就會調用該方法,而iOS 10 提早到cell還在屏幕外面的時候就調用;cellForItemAtIndexPath
中建立cell,填充數據,刷新狀態等操做,相比於以前也提早了;willDisplayCell
方法,原則就是:什麼時候須要顯示,什麼時候再去調用willDisplayCell
方法;didEndDisplayingCell
方法,跟以前同樣,cell會進入重用隊列.cellForItemAtIndexPath
建立或者生成一個cell.willDisplayCell
方法就能夠從新出如今屏幕中了.九、UIRefreshControl
在iOS 10 中, UIRefreshControl能夠直接在UICollectionView和UITableView中使用,而且脫離了UITableViewController.如今RefreshControl是UIScrollView的一個屬性.
使用方法:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(loadData) forControlEvents:UIControlEventValueChanged]; collectionView.refreshControl = refreshControl;
十、UserNotifications(用戶通知)
iOS 10 中將通知相關的 API 都統一了,在此基礎上不少用戶定義的通知,而且能夠捕捉到各個通知狀態的回調.之前通知的概念是:你們想接受的提早作好準備,而後一下全兩分發,沒收到也無論了,也不關心發送者,如今的用戶通知作成了相似於網絡請求,先發一個request
獲得response
的流程,還封裝了error
,能夠在各個狀態的方法中作一些額外的操做,而且能得到一些字段,好比發送者之類的.這個功能的頭文件是:#import <UserNotifications/UserNotifications.h>