2016年9月7日,蘋果發佈iOS 10。2016年9月14日,全新的操做系統iOS 10將正式上線。json
做爲開發者,如何適配iOS10呢?數組
自從Notification
被引入以後,蘋果就不斷的更新優化,但這些更新優化只是小打小鬧,直至如今iOS 10開始真正的進行大改重構,這讓開發者也體會到UserNotifications
的易用,功能也變得很是強大。安全
iOS 9 之前的通知性能優化
1.在調用方法時,有些方法讓人很難區分,容易寫錯方法,這讓開發者有時候很苦惱。網絡
2.應用在運行時和非運行時捕獲通知的路徑還不一致。app
3.應用在前臺時,是沒法直接顯示遠程通知,還須要進一步處理。框架
4.已經發出的通知是不能更新的,內容發出時是不能改變的,而且只有簡單文本展現方式,擴展性根本不是很好。dom
iOS 10 開始的通知iphone
1.全部相關通知被統一到了UserNotifications.framework
框架中。異步
2.增長了撤銷、更新、中途還能夠修改通知的內容。
3.通知不在是簡單的文本了,能夠加入視頻、圖片,自定義通知的展現等等。
4.iOS 10相對以前的通知來講更加好用易於管理,而且進行了大規模優化,對於開發者來講是一件好事。
5.iOS 10開始對於權限問題進行了優化,申請權限就比較簡單了(本地與遠程通知集成在一個方法中)。
若是使用了推送,修改如圖:
iOS 9中默認非HTTS的網絡是被禁止的,固然咱們也能夠把NSAllowsArbitraryLoads
設置爲YES
禁用ATS
。不過iOS 10從2017年1月1日起蘋果不容許咱們經過這個方法跳過ATS
,也就是說強制咱們用HTTPS
,若是不這樣的話提交App可能會被拒絕。可是咱們能夠經過NSExceptionDomains
來針對特定的域名開放HTTP
能夠容易經過審覈。
NSExceptionDomains方式 設置域。能夠簡單理解成,把不支持https協議的接口設置成http的接口。
具體方法:
1)、在項目的info.plist中添加一個Key:App Transport Security Settings,類型爲字典類型。
2)、而後給它添加一個Exception Domains,類型爲字典類型;
3)、把須要的支持的域添加給Exception Domains。其中域做爲Key,類型爲字典類型。
4)、每一個域下面須要設置3個屬性:NSIncludesSubdomains、NSExceptionRequiresForwardSecrecy、NSExceptionAllowsInsecureHTTPLoads。
如圖:
iOS 10 開始對隱私權限更加嚴格,若是你不設置就會直接崩潰,如今不少遇到崩潰問題了,通常解決辦法都是在info.plist
文件添加對應的Key
-Value
就能夠了。
以上Value
值,圈出的紅線部分的文字是展現給用戶看的,必須添加。
上圖咱們看到,本身新建的一個工程啥也沒幹就打印一堆爛七八糟的東西,我以爲這個應該是Xcode 8
的問題,
具體也沒細研究,解決辦法是設置OS_ACTIVITY_MODE : disable
以下圖:
第一步:
第二步:
第三步:
添加參數:
Name :OS_ACTIVITY_MODE
Value : disable
在咱們開發中有可能用到UIStatusBar
一些屬性,在iOS 10 中這些方法已通過期了,若是你的項目中有用的話就得須要適配。
上面的圖片也能發現,若是在iOS 10中你須要使用preferredStatusBar
好比這樣:
//iOS 10 - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleDefault; }
隨着開發者對UICollectionView
的信賴,項目中用的地方也比較多,可是仍是存在一些問題,好比有時會卡頓、加載慢等。因此iOS 10 對UICollectionView
進一步的優化。
在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
方法就能夠從新出如今屏幕中了.UICollectionViewDataSourcePrefetching
協議,這個協議裏面定義了兩個方法: - (void)collectionView:(UICollectionView *)collectionView prefetchItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths NS_AVAILABLE_IOS(10_0); - (void)collectionView:(UICollectionView *)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths NS_AVAILABLE_IOS(10_0);
在ColletionView prefetchItemsAt indexPaths
這個方法是異步預加載數據的,當中的indexPaths
數組是有序的,就是item接收數據的順序; CollectionView cancelPrefetcingForItemsAt indexPaths
這個方法是可選的,能夠用來處理在滑動中取消或者下降提早加載數據的優先級.
注意:這個協議並不能代替以前讀取數據的方法,僅僅是輔助加載數據.
Pre-Fetching預加載對UITableViewCell一樣適用.
如下是官方文檔的說明:
Most graphics frameworks throughout the system, including Core Graphics, Core Image, Metal, and AVFoundation, have substantially improved support for extended-range pixel formats and wide-gamut color spaces. By extending this behavior throughout the entire graphics stack, it is easier than ever to support devices with a wide color display. In addition, UIKit standardizes on working in a new extended sRGB color space, making it easy to mix sRGB colors with colors in other, wider color gamuts without a significant performance penalty.
Here are some best practices to adopt as you start working with Wide Color.
In iOS 10, the UIColor class uses the extended sRGB color space and its initializers no longer clamp raw component values to between 0.0 and 1.0. If your app relies on UIKit to clamp component values (whether you’re creating a color or asking a color for its component values), you need to change your app’s behavior when you link against iOS 10.
When performing custom drawing in a UIView on an iPad Pro (9.7 inch), the underlying drawing environment is configured with an extended sRGB color space.
If your app renders custom image objects, use the new UIGraphicsImageRenderer class to control whether the destination bitmap is created using an extended-range or standard-range format.
If you are performing your own image processing on wide-gamut devices using a lower level API, such as Core Graphics or Metal, you should use an extended range color space and a pixel format that supports 16-bit floating-point component values. When clamping of color values is necessary, you should do so explicitly.
Core Graphics, Core Image, and Metal Performance Shaders provide new options for easily converting colors and images between color spaces.
由於以前咱們都是用RGB
來設置顏色,反正用起來也不是特別多樣化,此次新增的方法應該就是一個彌補吧。因此在iOS 10 蘋果官方建議咱們使用sRGB
,由於它性能更好,色彩更豐富。若是你本身爲UIColor
寫了一套分類的話也可嘗試替換爲sRGB
,UIColor
類中新增了兩個Api
以下:
+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0); - (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
// The textContentType property is to provide the keyboard with extra information about the semantic intent of the text document.@property(nonatomic,copy) UITextContentType textContentType NS_AVAILABLE_IOS(10_0); // default is nil
在iOS 10 UITextField
添加了textContentType
枚舉,指示文本輸入區域所指望的語義意義。
使用此屬性能夠給鍵盤和系統信息,關於用戶輸入的內容的預期的語義意義。例如,您能夠指定一個文本字段,用戶填寫收到一封電子郵件確認uitextcontenttypeemailaddress
。當您提供有關您指望用戶在文本輸入區域中輸入的內容的信息時,系統能夠在某些狀況下自動選擇適當的鍵盤,並提升鍵盤修正和主動與其餘文本輸入機會的整合。
當咱們手機系統字體改變了以後,那咱們App
的label
也會跟着一塊兒變化,這須要咱們寫不少代碼來進一步處理才能實現,可是iOS 10 提供了這樣的屬性adjustsFontForContentSizeCategory
來設置。由於沒有真機,具體實際操做還沒去實現,若是理解錯誤幫忙指正。
UILabel *myLabel = [UILabel new]; /* UIFont 的preferredFontForTextStyle: 意思是指定一個樣式,並讓字體大小符合用戶設定的字體大小。 */ myLabel.font =[UIFont preferredFontForTextStyle: UIFontTextStyleHeadline]; /* Indicates whether the corresponding element should automatically update its font when the device’s UIContentSizeCategory is changed. For this property to take effect, the element’s font must be a font vended using +preferredFontForTextStyle: or +preferredFontForTextStyle:compatibleWithTraitCollection: with a valid UIFontTextStyle. */ //是否更新字體的變化 myLabel.adjustsFontForContentSizeCategory = YES;
iOS 10 之後只要是繼承UIScrollView
那麼就支持刷新功能:
@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;
判斷系統版本是咱們常常用到的,尤爲是如今你們都有可能須要適配iOS 10,那麼問題就出現了,以下圖:
咱們獲得了答案是:
//值爲 1 [[[[UIDevice currentDevice] systemVersion] substringToIndex:1] integerValue]
//值爲10.000000 [[UIDevice currentDevice] systemVersion].floatValue,
//值爲10.0 [[UIDevice currentDevice] systemVersion]
因此說判斷系統方法最好仍是用後面的兩種方法,哦~我忘記說了[[UIDevice currentDevice] systemVersion].floatValue
這個方法也是不靠譜的,好像在8.3
版本輸出的值是8.2
,記不清楚了反正是不靠譜的,因此建議你們用[[UIDevice currentDevice] systemVersion]
這個方法!
Swift判斷以下:
if #available(iOS 10.0, *) { // iOS 10.0 print("iOS 10.0"); } else { }
你們都升級了Xcode 8
,可是對於插件依賴的開發者們,一邊哭着一邊去網上尋找解決辦法。那麼下面是解決辦法:
讓你的 Xcode8 繼續使用插件(http://vongloo.me/2016/09/10/Make-Your-Xcode8-Great-Again/?utm_source=tuicool&utm_medium=referral )
可是看到文章最後的解釋,咱們知道若是用插件的話,可能安全上會有問題、而且提交審覈會被拒絕,因此建議你們仍是不要用了,解決辦法老是有的,好比在Xcode
中添加註釋的代碼塊也是很方便的。
我用Xcode 8
和Xcode 7.3
分別測試了下,以下圖:
Xcode 8
Xcode7
建立一個Label
而後讓它自適應大小,字體大小都是17
最後輸出的寬度是不同的,咱們再看一下,
下面的數據就知道爲何升級iOS 10
以後App
中有的文字顯示不全了:
英文字母會不會也有這種問題,我又經過測試,後來發現英文字母沒有問題,只有漢字有問題。
目前只有一個一個修改控件解決這個問題,暫時沒有其餘好辦法來解決。
Label17iOS 10App
在Xcode 8
以前咱們使用Xib
初始化- (void)awakeFromNib {}
都是這麼寫也沒什麼問題,可是在Xcode 8
會有以下警告:
官方解釋:
You must call the super implementation of awakeFromNib to give parent classes the opportunity to perform any additional initialization they require.
Although the default implementation of this method does nothing, many UIKit classes provide non-empty implementations.
You may call the super implementation at any point during your own awakeFromNib method.
你必須調用父類實現awakeFromNib來給父類來執行它們須要的任何額外的初始化的機會。
雖然這種方法的默認實現不作任何事情,許多UIKit類提供非空的實現。
你能夠調用本身的awakeFromNib方法中的任什麼時候候超級實現。
1五、推送的時候,
開啓Remote notificationsYou've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:],
but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.
解決方案:須要在Xcode 中修改應用的 Capabilities 開啓Remote notifications,請參考下圖:
1六、One of the two will be used. Which one is undefined.」
objc[5114]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices (0x1109a5910) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices (0x110738210). One of the two will be used. Which one is undefined.
在模擬器中、發現「One of the two will be used. Which one is undefined.」日誌
1七、Invalid Bundle - The asset catalog at 'Payload/XXXXX/Assets.car'
can't contain 16-bit or P3 assets if the app supports iOS 9.3 or earlier
在 Xcode 8 中,當你資源文件中[含有16位圖]或者[圖片顯示模式γ值爲'P3']且iOS targets設定爲iOS 9.3如下就會出現這個問題. 若是你的app須要支持廣色域顯示的話,那你必須得把target設置成iOS 9.3+,相反,若是你的app不須要支持廣色域且你想兼容 iOS 9.3 以前的項目,你就得把全部的16位的或者顯示模式爲'P3'圖片全都替換成8位模式的SRGB顏色的圖片。
你能夠經過運行「assetutil」在iTunes Connect的錯誤信息中找到16-bit 或 P3 資源文件。離線的解決方案以下:
1.導出項目的 ipa 文件
2.定位到該ipa文件修改後綴名.ipa 爲 .zip.
3. 解壓該 .zip 文件. 解壓後的目錄裏面會有一個包含着你的 app bundle 文件的 Payload 文件夾.
4. 打開終端病切換到你的app的Payload文件夾下的 .app bundle 文件夾內,形式以下:
cd path/to/Payload/your.app
5. 用 find 命令定位到 Assets.car 文件 .app bundle , 形式以下:
find . -name 'Assets.car'
6. 使用 assetutil 命令找到任何包含着 16-bit or P3 的資源文件, 對每一個 Assets.car 之行如下命令 :
sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
7. 打開上一步生成的 /tmp/Assets.json 文件並查找包含有 「DisplayGamut": 「P3」 或者相關的內容. 這段json的"Name"字段對應的值就是16位或顯示的γ值爲P3的資源文件名.
8. 找到這個資源文件修改成 8位的sRGB形式,從新編譯上傳你的app便可.
1八、This version does not support documents saved in the Xcode 8 format. Open this document with Xcode 8 or later
編輯項目時默認使用Xcode8打開,致使我用Xcode7打開Xib是報錯:
This version does not support documents saved in the Xcode 8 format. Open this document with Xcode 8.0 or later
致使用Xcode8打開的Xib所有打不開,只能用編輯器將Xib裏面的下面一句話刪除掉才能打開:
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>