標籤:
相容iOS 10 資料整理筆記源文:http://www.jianshu.com/p/0cc7aad638d91.Notification(通知)
自從Notification被引入之後,蘋果就不斷的更新最佳化,但這些更新最佳化只是小打小鬧,直至現在iOS 10開始真正的進行大改重構,這讓開發人員也體會到UserNotifications的易用,功能也變得非常強大。
iOS 9 以前的通知
1.在調用方法時,有些方法讓人很難區分,容易寫錯方法,這讓開發人員有時候很苦惱。
2.應用在運行時和非運行時捕獲通知的路徑還不一致。
3.應用在前台時,是無法直接顯示遠程通知,還需要進一步處理。
4.已經發出的通知是不能更新的,內容發出時是不能改變的,並且只有簡單文本展示方式,擴充性根本不是很好。
iOS 10 開始的通知
1.所有相關通知被統一到了UserNotifications.framework架構中。
2.增加了撤銷、更新、中途還可以修改通知的內容。
3.通知不在是簡單的文本了,可以加入視頻、圖片,自訂通知的展示等等。
4.iOS 10相對之前的通知來說更加好用易於管理,並且進行了大規模最佳化,對於開發人員來說是一件好事。
5.iOS 10開始對於許可權問題進行了最佳化,申請許可權就比較簡單了(本地與遠程通知整合在一個方法中)。
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可以容易通過審核。
參考學習文章如下:
關於 iOS 10 中 ATS 的問題
3.iOS 10 隱私使用權限設定
iOS 10 開始對隱私許可權更加嚴格,如果你不設定就會直接崩潰,現在很多遇到崩潰問題了,一般解決辦法都是在info.plist檔案添加對應的Key-Value就可以了。
以上Value值,圈出的紅線部分的文字是展示給使用者看的,需要自己添加規範的提示說明,不可為空。目前解決辦法基本都一樣,參考學習文章如下:
相容iOS 10:配置擷取隱私資料許可權聲明
4.Xcode 8 運行一堆沒用的logs解決辦法
我們看到,自己建立的一個工程啥也沒幹就列印一堆爛七八糟的東西,我覺得這個應該是Xcode 8的問題,具體也沒細研究,解決辦法是設定OS_ACTIVITY_MODE : disable如:
相關問題串連:
stackoverflow問答
5.iOS 10 UIStatusBar方法到期:
在我們開發中有可能用到UIStatusBar一些屬性,在iOS 10 中這些方法已經到期了,如果你的項目中有用的話就得需要適配。上面的圖片也能發現,如果在iOS 10中你需要使用preferredStatusBar比如這樣:
//iOS 10 - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleDefault;}
6.iOS 10 UICollectionView 效能最佳化
隨著開發人員對UICollectionView的信賴,項目中用的地方也比較多,但是還是存在一些問題,比如有時會卡頓、載入慢等。所以iOS 10 對UICollectionView進一步的最佳化,因為敘述起來比較複雜耗費時間,在這裡只提供學習參考文章如下:
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)alpha NS_AVAILABLE_IOS(10_0);- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_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) UITextContentType textContentType NS_AVAILABLE_IOS(10_0); // default is nil
在iOS 10 UITextField添加了textContentType枚舉,指示文本輸入地區所期望的語義意義。
使用此屬性可以給鍵盤和系統資訊,關於使用者輸入的內容的預期的語義意義。例如,您可以指定一個文字欄位,使用者填寫收到一封電子郵件確認uitextcontenttypeemailaddress。當您提供有關您期望使用者在文本輸入地區中輸入的內容的資訊時,系統可以在某些情況下自動選擇適當的鍵盤,並提高鍵盤修正和主動與其他文本輸入機會的整合。
9.iOS 10 字型隨著手機系統字型而改變
當我們手機系統字型改變了之後,那我們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;
10.iOS 10 UIScrollView新增refreshControl
iOS 10 以後只要是繼承UIScrollView那麼就支援重新整理功能:
@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;
11.iOS 10 判斷系統版本正確姿勢
判斷系統版本是我們經常用到的,尤其是現在大家都有可能需要適配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 { }
參考文章如下:
iOS 日常工作之常用宏定義大全
12.Xcode 8 外掛程式不能用的問題
大家都升級了Xcode 8,但是對於外掛程式依賴的開發人員們,一邊哭著一邊去網上尋找解決辦法。那麼下面是解決辦法:
讓你的 Xcode8 繼續使用外掛程式
但是看到文章最後的解釋,我們知道如果用外掛程式的話,可能安全上會有問題、並且提交審核會被拒絕,所以建議大家還是不要用了,解決辦法總是有的,比如在Xcode中添加註釋的代碼塊也是很方便的。
13.iOS 10開始項目中有的文字顯示不全問題
我用Xcode 8 和Xcode 7.3分別測試了下,如:
Xcode 8
Xcode 7
建立一個Label然後讓它自適應大小,字型大小都是17最後輸出的寬度是不一樣的,我們再看一下,下面的資料就知道為什麼升級iOS 10 之後App中有的文字顯示不全了:
| Xcode 8列印 |
Xcode 7.3列印 |
| 1個文字寬度:17.5 |
1個文字寬度:17 |
| 2個文字寬度:35 |
2個文字寬度:34 |
| 3個文字寬度:52 |
3個文字寬度:51 |
| 4個文字寬度:69.5 |
4個文字寬度:68 |
| 5個文字寬度:87 |
5個文字寬度:85 |
| 6個文字寬度:104 |
6個文字寬度:102 |
| 7個文字寬度:121.5 |
7個文字寬度:119 |
| 8個文字寬度:139 |
8個文字寬度:136 |
| 9個文字寬度:156 |
9個文字寬度:153 |
| 10個文字寬度:173.5 |
10個文字寬度:170 |
英文字母會不會也有這種問題,我又通過測試,後來發現英文字母沒有問題,只有漢字有問題。目前只有一個一個修改控制項解決這個問題,暫時沒有其他好辦法來解決。
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沒有之前編譯快了,甚至有些人慢的辣眼睛。但是我的沒有感覺很慢,跟之前差不多,我覺得跟電腦應該有一些聯絡吧,有的開發人員幾個月不重啟電腦,電腦裡運行一堆線程,一堆沒用的垃圾。下面是加速Xcode編譯的方法,感興趣的可以去看一下:
提高Xcode編譯速度
16.iOS 10 ImagePickerController.cameraViewTransform問題
(本條更新於:2016-09-21)
很多人反映自訂相機出現了問題,cameraViewTransform不能用了,其實網上關於這個的資料不是很多,在這裡提供參考辦法如下:
- 通過監聽
AVCaptureSessionDidStartRunningNotification來解決
//#import <AVFoundation/AVFoundation.h> //監聽 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cameraNotification:) name:AVCaptureSessionDidStartRunningNotification object:nil]; //監聽方法 - (void)cameraNotification:(NSNotification *)notification { dispatch_async(dispatch_get_main_queue(), ^{ // 這裡實現 imagePickerController.cameraViewTransform = CGAffineTransformMakeTranslation(50, 50); }); }
- 使用
AVFoundation架構
看來UIImagePickerController視乎不在適用於iOS 10了。所以說可以選擇AVFoundation來解決這個問題。
下面是參考學習:
UIImagePickerController‘s cameraViewTransform
iOS開發 適配iOS10以及Xcode8源文:http://www.jianshu.com/p/9756992a35ca
現在在蘋果的官網上,我們已經可以下載到Xcode8的GM版本了,加上9.14日淩晨,蘋果就要正式推出iOS10系統的推送了,在此之際,iOS10的適配已經迫在眉睫啦,不知道Xcode8 beat版本,童鞋們有木有下載過來試試呢?就我的使用來說,總體覺得蘋果還是坑不斷,但是也在一直進步的啦。下面我就來說說,iOS10的適配以及Xcode8使用上的一些注意點。
一、認證管理
用Xcode8開啟工程後,比較明顯的就是了,這個是蘋果的新特性,可以協助我們自動管理憑證。建議大家勾選這個Automatically manage signing(Ps.但是在beat2版本我用的時候,完全不可以,GM版本竟然神奇的又好了。)
QQ20160913-8.png-96.9kB
下面我來說說可能會出現的問題:
1.Xcode未設定開發人員帳號情況下的
QQ20160913-0.png-38.5kB
解決辦法是:大家在Xcode的喜好設定中,添加蘋果帳號,即可。
2.裝置機器未添加進開發人員的Device情況下的
QQ20160913-2.png-33.7kB
解決辦法是:大家在官網將裝置添加進開發機後,陪下描述檔案重新下個描述檔案即可。
3.正常情況:Xcode配置登入開發人員帳號後的圖片,耐心等待即可。
QQ20160913-1.png-25.1kB
等待完成之後的圖
QQ20160913-3.png-27kB二、Xib檔案的注意事項
使用Xcode8開啟xib檔案後,會出現的提示。
QQ20160913-9.png-41.7kB
大家選擇Choose Device即可。
之後大家會發現布局啊,frame亂了,只需要更新一下frame即可。如
QQ20160913-11.png-113.2kB
- 注意:如果按上面的步驟操作後,在用Xcode7開啟Xib會報一下錯誤,
QQ20160913-12.png-32.3kB
三、代碼及Api注意
使用Xcode8之後,有些代碼可能就編譯不過去了,具體我就說說我碰到的問題。
1.UIWebView的代理方法:
**注意要刪除NSError前面的 nullable,否則報錯。
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{ [self hideHud];}
四、代碼注釋不能用的解決辦法
這個是因為蘋果解決xcode ghost,把外掛程式屏蔽了。
解決方案
開啟終端,命令運行: sudo /usr/libexec/xpccachectl
然後必須重啟電腦後生效
注意:Xcode8內建了開啟注釋的功能,位置在這裡
QQ20160914-3.png
快速鍵的設定在這裡
QQ20160914-2.png
貌似Xcode8取消了三方外掛程式的功能,具體可以查閱下Xcode8 Source Editor
五、許可權以及相關設定
注意,添加的時候,末尾不要有空格
我們需要開啟info.plist檔案添加相應許可權的說明,否則程式在iOS10上會出現崩潰。
具體如:
QQ20160914-0.png
麥克風許可權: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 我們需要通過您的地理位置資訊擷取您周邊的相關資料
定位的需要這麼寫,防止上架被拒。
六、字型變大,原有frame需要適配
經有的朋友提醒,發現程式內原來2個字的寬度是24,現在2個字需要27的寬度來顯示了。。
希望有解決辦法的朋友,評論告我一下耶,謝謝啦
七、推送
如的部分,不要忘記開啟。所有的推送平台,不管是極光還是什麼的,要想收到推送,這個是必須開啟的喲??
QQ20160914-4.png
之後就應該可以收到推送了。另外,極光推送也推出新版本了,大家也可以更新下。
PS.蘋果這次對推送做了很大的變化,希望大家多查閱查閱,處理推送的代理方法也變化了。
// 推送的代理[<UNUserNotificationCenterDelegate>]
iOS10收到通知不再是在
[application: didReceiveRemoteNotification:]方法去處理, iOS10推出新的代理方法,接收和處理各類通知(本地或者遠程)
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { //應用在前台收到通知 NSLog(@"========%@", notification);}- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler { //點擊通知進入應用 NSLog(@"response:%@", response);}
稍後我會更新文章,對推送做一個詳細的講解。
8.屏蔽雜亂無章的bug
更新Xcode8之後,建立立工程,都會列印一堆莫名其妙看不懂的Log.
如這些
subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1,
屏蔽的方法如下:
Xcode8裡邊 Edit Scheme-> Run -> Arguments, 在Environment Variables裡邊添加
OS_ACTIVITY_MODE = Disable
QQ20160914-8.png
如果寫了之後還是列印log,請重新勾選對勾,就可以解決了
iOS10以及xCode8相關資料收集