1.Notification(通知)
自從Notification被引入之后,蘋果就不斷的更新優(yōu)化讨跟,但這些更新優(yōu)化只是小打小鬧,直至現在iOS 10開始真正的進行大改重構,這讓開發(fā)者也體會到UserNotifications的易用趣苏,功能也變得非常強大。
iOS 9 以前的通知
1.在調用方法時梯轻,有些方法讓人很難區(qū)分食磕,容易寫錯方法,這讓開發(fā)者有時候很苦惱喳挑。
2.應用在運行時和非運行時捕獲通知的路徑還不一致彬伦。
3.應用在前臺時,是無法直接顯示遠程通知伊诵,還需要進一步處理单绑。
4.已經發(fā)出的通知是不能更新的,內容發(fā)出時是不能改變的曹宴,并且只有簡單文本展示方式搂橙,擴展性根本不是很好。
iOS 10 開始的通知
1.所有相關通知被統一到了UserNotifications.framework框架中笛坦。
2.增加了撤銷份氧、更新唯袄、中途還可以修改通知的內容。
3.通知不在是簡單的文本了蜗帜,可以加入視頻恋拷、圖片,自定義通知的展示等等厅缺。
4.iOS 10相對之前的通知來說更加好用易于管理蔬顾,并且進行了大規(guī)模優(yōu)化,對于開發(fā)者來說是一件好事湘捎。
5.iOS 10開始對于權限問題進行了優(yōu)化诀豁,申請權限就比較簡單了(本地與遠程通知集成在一個方法中)。
iOS 10 通知學習相關資料:
UserNotifications: 蘋果官方文檔-蘋果官方視頻1-蘋果官方視頻2-蘋果官方視頻3
活久見的重構 - iOS 10 UserNotifications 框架解析
WWDC2016 Session筆記 - iOS 10? 推送Notification新特性
2.ATS的問題
iOS 9中默認HTTP的網絡是不推薦使用的窥妇,當然我們也可以把NSAllowsArbitraryLoads設置為YES禁用ATS舷胜。不過iOS 10從2017年1月1日起蘋果不允許我們通過這個方法跳過ATS,也就是說強制我們用HTTPS活翩,如果不這樣的話提交App可能會被拒絕烹骨。但是我們可以通過NSExceptionDomains來針對特定的域名開放HTTP可以容易通過審核。
參考學習文章如下:
3.iOS 10 隱私權限設置
iOS 10 開始對隱私權限更加嚴格材泄,如果你不設置就會直接崩潰沮焕,現在很多遇到崩潰問題了,一般解決辦法都是在info.plist文件添加對應的Key-Value就可以了拉宗。
以上Value值峦树,圈出的紅線部分的文字是展示給用戶看的,需要自己添加規(guī)范的提示說明旦事,不能為空魁巩。目前解決辦法基本都一樣,參考學習文章如下:
4.Xcode 8 運行一堆沒用的logs解決辦法
上圖我們看到姐浮,自己新建的一個工程啥也沒干就打印一堆爛七八糟的東西谷遂,我覺得這個應該是Xcode 8的問題,具體也沒細研究单料,解決辦法是設置OS_ACTIVITY_MODE : disable如下圖:
相關問題連接:
5.iOS 10 UIStatusBar方法過期:
在我們開發(fā)中有可能用到UIStatusBar一些屬性,在iOS 10 中這些方法已經過期了点楼,如果你的項目中有用的話就得需要適配扫尖。上面的圖片也能發(fā)現,如果在iOS 10中你需要使用preferredStatusBar比如這樣:
//iOS 10- (UIStatusBarStyle)preferredStatusBarStyle {returnUIStatusBarStyleDefault;}
6.iOS 10 UICollectionView 性能優(yōu)化
隨著開發(fā)者對UICollectionView的信賴掠廓,項目中用的地方也比較多换怖,但是還是存在一些問題,比如有時會卡頓蟀瞧、加載慢等沉颂。所以iOS 10 對UICollectionView進一步的優(yōu)化条摸,因為敘述起來比較復雜耗費時間,在這里只提供學習參考文章如下:
WWDC2016 Session筆記 - iOS 10 UICollectionView新特性
7.iOS 10 UIColor 新增方法
以下是官方文檔的說明:
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)alphaNS_AVAILABLE_IOS(10_0);- (UIColor*)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alphaNS_AVAILABLE_IOS(10_0);
8.iOS 10 UITextContentType
// The textContentType property is to provide the keyboard with extra information about the semantic intent of the text document.@property(nonatomic,copy)UITextContentTypetextContentTypeNS_AVAILABLE_IOS(10_0);// default is nil
在iOS 10UITextField添加了textContentType枚舉钙蒙,指示文本輸入區(qū)域所期望的語義意義。
使用此屬性可以給鍵盤和系統信息间驮,關于用戶輸入的內容的預期的語義意義躬厌。例如,您可以指定一個文本字段竞帽,用戶填寫收到一封電子郵件確認uitextcontenttypeemailaddress扛施。當您提供有關您期望用戶在文本輸入區(qū)域中輸入的內容的信息時,系統可以在某些情況下自動選擇適當的鍵盤抢呆,并提高鍵盤修正和主動與其他文本輸入機會的整合煮嫌。
9.iOS 10 字體隨著手機系統字體而改變
當我們手機系統字體改變了之后,那我們App的label也會跟著一起變化抱虐,這需要我們寫很多代碼來進一步處理才能實現昌阿,但是iOS 10 提供了這樣的屬性adjustsFontForContentSizeCategory來設置。因為沒有真機恳邀,具體實際操作還沒去實現懦冰,如果理解錯誤幫忙指正。
UILabel*myLabel = [UILabelnew];/*
UIFont 的preferredFontForTextStyle: 意思是指定一個樣式谣沸,并讓字體大小符合用戶設定的字體大小刷钢。
*/myLabel.font=[UIFontpreferredFontForTextStyle: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;
10.iOS 10 UIScrollView新增refreshControl
iOS 10 以后只要是繼承UIScrollView那么就支持刷新功能:
@property(nonatomic,strong, nullable)UIRefreshControl*refreshControlNS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;
11.iOS 10 判斷系統版本正確姿勢
判斷系統版本是我們經常用到的,尤其是現在大家都有可能需要適配iOS 10乳附,那么問題就出現了内地,如下圖:
我們得到了答案是:
//值為 1[[[[UIDevicecurrentDevice] systemVersion] substringToIndex:1] integerValue]//值為10.000000[[UIDevicecurrentDevice] systemVersion].floatValue,//值為10.0[[UIDevicecurrentDevice] systemVersion]
所以說判斷系統方法最好還是用后面的兩種方法,哦~我忘記說了[[UIDevice currentDevice] systemVersion].floatValue這個方法也是不靠譜的赋除,好像在8.3版本輸出的值是8.2阱缓,記不清楚了反正是不靠譜的,所以建議大家用[[UIDevice currentDevice] systemVersion]這個方法举农!
Swift判斷如下:
if#available(iOS 10.0, *) {// iOS 10.0print("iOS 10.0");? ? ? ? }else{ }
參考文章如下:
12.Xcode 8 插件不能用的問題
大家都升級了Xcode 8荆针,但是對于插件依賴的開發(fā)者們,一邊哭著一邊去網上尋找解決辦法。那么下面是解決辦法:
但是看到文章最后的解釋航背,我們知道如果用插件的話喉悴,可能安全上會有問題、并且提交審核會被拒絕玖媚,所以建議大家還是不要用了花履,解決辦法總是有的糙申,比如在Xcode中添加注釋的代碼塊也是很方便的扮念。
13.iOS 10開始項目中有的文字顯示不全問題
我用Xcode 8和Xcode 7.3分別測試了下什黑,如下圖:
Xcode 8
Xcode 7
創(chuàng)建一個Label然后讓它自適應大小,字體大小都是17最后輸出的寬度是不一樣的涡贱,我們再看一下咏删,下面的數據就知道為什么升級iOS 10之后App中有的文字顯示不全了:
Xcode 8打印Xcode 7.3打印
1個文字寬度:17.51個文字寬度:17
2個文字寬度:352個文字寬度:34
3個文字寬度:523個文字寬度:51
4個文字寬度:69.54個文字寬度:68
5個文字寬度:875個文字寬度:85
6個文字寬度:1046個文字寬度:102
7個文字寬度:121.57個文字寬度:119
8個文字寬度:1398個文字寬度:136
9個文字寬度:1569個文字寬度:153
10個文字寬度:173.510個文字寬度:170
英文字母會不會也有這種問題,我又通過測試问词,后來發(fā)現英文字母沒有問題督函,只有漢字有問題。目前只有一個一個修改控件解決這個問題激挪,暫時沒有其他好辦法來解決辰狡。
14.Xcode 8使用Xib awakeFromNib的警告問題
(本條更新于:2016-09-18)
在Xcode 8之前我們使用Xib初始化- (void)awakeFromNib {}都是這么寫也沒什么問題,但是在Xcode 8會有如下警告:
如果不喜歡這個警告的話垄分,應該明確的加上[super awakeFromNib];我們來看看官方說明:
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.
15.Xcode 8編譯過慢的問題
(本條更新于:2016-09-20)
很多人都反映Xcode 8沒有之前編譯快了宛篇,甚至有些人慢的辣眼睛。但是我的沒有感覺很慢薄湿,跟之前差不多叫倍,我覺得跟電腦應該有一些聯系吧,有的開發(fā)者幾個月不重啟電腦豺瘤,電腦里運行一堆線程吆倦,一堆沒用的垃圾。下面是加速Xcode編譯的方法坐求,感興趣的可以去看一下:
16.iOS 10 ImagePickerController.cameraViewTransform問題
(本條更新于:2016-09-21)
很多人反映自定義相機出現了問題蚕泽,cameraViewTransform不能用了,其實網上關于這個的資料不是很多桥嗤,在這里提供參考辦法如下:
通過監(jiān)聽AVCaptureSessionDidStartRunningNotification來解決
//#import //監(jiān)聽[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(cameraNotification:) name:AVCaptureSessionDidStartRunningNotificationobject:nil];//監(jiān)聽方法- (void)cameraNotification:(NSNotification*)notification {dispatch_async(dispatch_get_main_queue(), ^{// 這里實現imagePickerController.cameraViewTransform=CGAffineTransformMakeTranslation(50,50);? ? ? });? }
使用AVFoundation框架
看來UIImagePickerController視乎不在適用于iOS 10了须妻。所以說可以選擇AVFoundation來解決這個問題。
下面是參考學習:
UIImagePickerController's cameraViewTransform
本文只為整理iOS 10 相關資料泛领,也參考部分網上的文章荒吏,還會陸續(xù)更新其他iOS 10 相關資料,以及開發(fā)中遇到的問題等等师逸。
本文章首發(fā)地址:http://www.reibang.com/p/0cc7aad638d9