Xcode8 適配iOS10時碰見的一些問題

一、證書管理

用Xcode8打開工程後,比較明顯的就是下圖了,這個是蘋果的新特性,能夠幫助咱們自動管理證書。建議你們勾選這個Automatically manage signing(Ps.可是在beat2版本我用的時候,徹底不能夠,GM版本居然神奇的又好了。)php


 

下面我來講說可能會出現的問題:css

1.Xcode未設置開發者帳號狀況下的截圖git




解決辦法是:你們在Xcode的偏好設置中,添加蘋果帳號,便可。github

2.設備機器未添加進開發者的Device狀況下的截圖web


 


解決辦法是:你們在官網將設備添加進開發機後,陪下描述文件從新下個描述文件便可。sql

3.正常狀況:Xcode配置登陸開發者帳號後的圖片,耐心等待便可。數組


 


等待完成以後的圖xcode


 

二、Xib文件的注意事項

使用Xcode8打開xib文件後,會出現下圖的提示。性能優化


 


你們選擇Choose Device便可。
以後你們會發現佈局啊,frame亂了,只須要更新一下frame便可。以下圖網絡


 
  • 注意:若是按上面的步驟操做後,在用Xcode7打開Xib會報一下錯誤,

 
  • 解決辦法:須要刪除Xib裏面
    <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    這句話,以及把< document >中的toolsVersion和< plugIn >中的version改爲你正常的xib文件中的值
    ,不過不建議這麼作,在Xcode8出來後,但願你們都快速上手,全員更新。這就跟Xcode5到Xcode6同樣,有變更,可是仍是要儘早學習,儘快適應喲!

三、代碼及Api注意

使用Xcode8以後,有些代碼可能就編譯不過去了,具體我就說說我碰到的問題。
1.UIWebView的代理方法:
**注意要刪除NSError前面的 nullable,不然報錯。

- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error { [self hideHud]; }

四、代碼註釋不能用的解決辦法

這個是由於蘋果解決xcode ghost,把插件屏蔽了。
解決方法
打開終端,命令運行: sudo /usr/libexec/xpccachectl
而後必須重啓電腦後生效

注意:Xcode8內置了開啓註釋的功能,位置在這裏


 

快捷鍵的設置在這裏



貌似Xcode8取消了三方插件的功能,具體能夠查閱下Xcode8 Source Editor

五、權限以及相關設置

注意,添加的時候,末尾不要有空格
咱們須要打開info.plist文件添加相應權限的說明,不然程序在iOS10上會出現崩潰。
具體以下圖:



麥克風權限: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的寬度來顯示了。。
但願有解決辦法的朋友,評論告我一下耶,謝謝啦

七、推送

以下圖的部分,不要忘記打開。全部的推送平臺,無論是極光仍是什麼的,要想收到推送,這個是必須打開的喲✌️



以後就應該能夠收到推送了。另外,極光推送也推出新版本了,你們也能夠更新下。

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 



若是寫了以後仍是打印log,請從新勾選對勾,就能夠解決了

9. 插件失效

 

Xcode 8 uses library validation. It won't load in-process plugins anymore.

 

這個是因爲蘋果已經重置插件這塊,但有部分優秀的插件已經內置在Xcode了,總體來講,對我影響並非那麼大。

本身尚未嘗試過, 由於聽說不是持久的解決方案,有須要和興趣再嘗試吧! 另外若是使用 MakeXcodeGr8Again 注意參考下這篇文章:如何讓 Xcode8 繼續支持 Plugin

  • 內置插件使用
    例如 註釋鍵這個插件,直接經過內置的使用就 OK 了

    VVDocument

    而後將該操做設置成本身熟悉的快捷鍵,而後這個以往的插件就成爲了咱們常規的快捷鍵啦

    設置成本身熟悉的快捷鍵
PS:
  • 一、Provisioning Profile 文件選取,已經從Buiid Settings移動到了General中,這樣更方便咱們選取啦

    General 中Provisioning Profile
  • 二、 日誌處增長了 過濾搜索條件,這樣讓咱們也能夠像安卓同窗那樣快速選取。另外刪除操做後暫時是沒有真正的刪除日誌的,還能夠經過點擊filter and空白日誌頁從新顯示出來。

 

10. ATS的問題

 

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。

如圖:

11.  iOS 10 UIStatusBar方法過時:

 

在咱們開發中有可能用到UIStatusBar一些屬性,在iOS 10 中這些方法已通過期了,若是你的項目中有用的話就得須要適配。

上面的圖片也能發現,若是在iOS 10中你須要使用preferredStatusBar好比這樣:

//iOS 10 - (UIStatusBarStyle)preferredStatusBarStyle {    return UIStatusBarStyleDefault; }

 

12. iOS 10 UICollectionView 性能優化

隨着開發者對UICollectionView的信賴,項目中用的地方也比較多,可是仍是存在一些問題,好比有時會卡頓、加載慢等。因此iOS 10 對UICollectionView進一步的優化。

  • UICollectionView cell pre-fetching預加載機制
  • UICollectionView and UITableView prefetchDataSource 新增的API
  • 針對self-sizing cells 的改進
  • Interactive reordering

  在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的,二之前是一行一行加載的,這樣就能夠提高不少性能;

    iOS 10 新增長的Pre-Fetching預加載

    這個是爲了下降UICollectionViewCell在加載的時候所花費的時間,在 iOS 10 中,除了數據源協議和代理協議外,新增長了一個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一樣適用.


 

13. 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寫了一套分類的話也可嘗試替換爲sRGBUIColor類中新增了兩個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。當您提供有關您指望用戶在文本輸入區域中輸入的內容的信息時,系統能夠在某些狀況下自動選擇適當的鍵盤,並提升鍵盤修正和主動與其餘文本輸入機會的整合。

 

14.  iOS 10 字體隨着手機系統字體而改變

當咱們手機系統字體改變了以後,那咱們Applabel也會跟着一塊兒變化,這須要咱們寫不少代碼來進一步處理才能實現,可是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;

 

1.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 { } 

 

原文連接:http://www.jianshu.com/p/9b3e5111924f 原文連接:http://www.jianshu.com/p/9756992a35ca 原文連接:https://my.oschina.net/gongzhiming/blog/748167
相關文章
相關標籤/搜索