ios10 適配問題總結

看各個大神整理而成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, 建議儘快停用SHA13DES算法;

六、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毫秒要刷新一次.

iOS 10 以前UICollectionViewCell的生命週期是這樣的:
  • 1.用戶滑動屏幕,屏幕外有一個cell準備加載進來,把cell從reusr隊列拿出來,而後調用prepareForReuse方法,在這個方法裏面,能夠重置cell的狀態,加載新的數據;
  • 2.繼續滑動,就會調用cellForItemAtIndexPath方法,在這個方法裏面給cell賦值模型,而後返回給系統;
  • 3.當cell立刻進去屏幕的時候,就會調用willDisplayCell方法,在這個方法裏面咱們還能夠修改cell,爲進入屏幕作最後的準備工做;
  • 4.執行完willDisplayCell方法後,cell就進去屏幕了.當cell徹底離開屏幕之後,會調用didEndDisplayingCell方法.
iOS 10 UICollectionViewCell的生命週期是這樣的:
  • 1.用戶滑動屏幕,屏幕外有一個cell準備加載進來,把cell從reusr隊列拿出來,而後調用prepareForReuse方法,在這裏當cell尚未進去屏幕的時候,就已經提早調用這個方法了,對比以前的區別是以前是cell的上邊緣立刻進去屏幕的時候就會調用該方法,而iOS 10 提早到cell還在屏幕外面的時候就調用;
  • 2.在cellForItemAtIndexPath中建立cell,填充數據,刷新狀態等操做,相比於以前也提早了;
  • 3.用戶繼續滑動的話,當cell立刻就須要顯示的時候咱們再調用willDisplayCell方法,原則就是:什麼時候須要顯示,什麼時候再去調用willDisplayCell方法;
  • 4.當cell徹底離開屏幕之後,會調用didEndDisplayingCell方法,跟以前同樣,cell會進入重用隊列.
    在iOS 10 以前,cell只能從重用隊列裏面取出,再走一遍生命週期,並調用cellForItemAtIndexPath建立或者生成一個cell.
    在iOS 10 中,系統會cell保存一段時間,也就是說當用戶把cell滑出屏幕之後,若是又滑動回來,cell不用再走一遍生命週期了,只須要調用willDisplayCell方法就能夠從新出如今屏幕中了.
    iOS 10 中,系統是一個一個加載cell的,二之前是一行一行加載的,這樣就能夠提高不少性能;

九、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>

相關文章
相關標籤/搜索