iOS 十、Xcode 8 遇到部分問題解決記錄

 

今天把iphone 6 升級到ios10 後,用Xcode 7進行真機調試的時候提示:html

Could not find Developer Disk Imageios

果斷準備升級到Xcode 8 。可是想保留Xcode 7,解決方法:sql

一、打開Finder,進入「應用程序」文件夾,新建一個文件夾命名爲「Xcode 7」。

二、將原來的Xcode7程序拖進剛纔建立的文件夾。

三、安裝Xcode8以前,首先要把系統升級到10.11.6

四、接下來安裝Xcode8。爲方便之後升級,把Xcode8直接安裝在「應用程序」文件夾內。或者直接經過AppStore下載安裝。

五、至此,安裝完成。打開Launchpad,能夠見到有兩個Xcode,且都能正常打開。

六、打開xcodeproj文件時,系統會默認使用Xcode8


升級之後出現的各類問題記錄以下:

一、升級到Xcode8 後,真機調試,原來的描述文件出問題了(一堆問題,可能每一個人的問題不同,我就不列舉了,反正就是有關描述文件的問題)

發現:Deprecated (以下)

 

而後:Target -  General - 勾選 Xcode8 新增的Automatically manage signing ,xcode

進行team選擇等app

後面:Target -  BuildSeting 就能夠以下配置:iphone

經過打包測試,徹底沒有問題。ide

2. Xcode8 在 Target -  General下有個Signing ,  Xcode新增的Automatically manage signing會自動管理須要的配置文件和證書。咱們只須要在Xcode的Account中登陸咱們的AppleID帳號便可,配置證書變得如此簡單.測試

Provisioning Profile 文件選取,已經從Buiid Settings移動到了General中,Buiid Settings中已經標識了 Deprecated(說白了,能夠不用弄了),之前添加設備以後須要從新生成描述文件,而後下載安裝,很麻煩,如今省事多了。ui

固然你也能夠選擇手動管理配置文件,除此以外,若是簽名證書有任何問題Xcode都會及時提示你.this

三、一切都配置好了之後,真機調試的時候仍是出現如下問題:

The certificate used to sign "你的項目名稱" has either expired or has been revoked. An updated certificate is required to sign and install the application.

檢查一下,沒有問題啊,可是就是報這個錯誤。

解決:

原來測試證書的p12文件安裝了好幾回,上次的已經失效,影響了真機調試。在鑰匙竄中找到那些失效的證書刪掉便可。只留一個有效的證書。

 

四、升級到Xcode8(ios 10),發如今註冊remote notification的,獲取device token的時候失敗了,錯誤信息爲:

no valid 'aps-environment' entitlement string found for application

原來在Xcode7中,push notifications開關只有一個步驟:將push notifications加入到app id。


 

可是Xcode8中,打開push notifications開關有兩個步驟:
多了一步寫entitlements文件的步驟


 

因此,用Xcode8打開工程後,應該從新打開一次push notification開關,以後entitlements文件中會多出兩行:

<key>aps-environment</key> <string>development</string>

有了這兩行以後,才能夠正常註冊device token。

使用:codesign --display --entitlements :- ./myApp.app

命令,能夠看到app文件內的entitlement。

經發現:若是用production證書籤名,能夠看到:

<key>aps-environment</key> <string>production</string>

說明蘋果在簽名過程當中,會自動更新aps-environment字段。

五、IDFA可被用戶禁用

iOS10中,用戶能夠在設置-隱私-廣告-限制廣告追蹤中禁止app讀取IDFA,這時app讀取到的IDFA就是一串0。

官方文檔中這樣說:

In iOS 10.0 and later, the value of advertisingIdentifier is all zeroes when the user has limited ad tracking.

 

六、Info.plist增長權限字段

使用Xcode8構建的app,在使用相冊等系統權限時會崩潰。錯誤信息爲:

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

官方文檔中解釋:

Important: To protect user privacy, an iOS app linked on or after iOS 10.0, and which accesses the user’s photo library, must statically declare the intent to do so. Include the NSPhotoLibraryUsageDescription key in your app’s Info.plist file and provide a purpose string for this key. If your app attempts to access the user’s photo library without a corresponding purpose string, your app exits. 必須在Info.plist文件中增長NSPhotoLibraryUsageDescription鍵,而且填入合適的描述文本

還有不少其餘的權限,如相機等,也須要在Info.plist文件中聲明,具體可參考官方文檔。

有一個坑就是,若是string的值爲空,這行權限的聲明就會無效,遇到的時候仍是崩潰:

<key>NSPhotoLibraryUsageDescription</key> <string></string>

七、UITableView、UICollectionView生命週期適配

WWDC介紹了UITableViewUICollectionView的生命週期在iOS10中發生了改變。

在iOS9及以前,一個UICollectionViewCell被重用的過程是這樣的:

  • 一個cell即將出現的屏幕上
  • prepareForReuse
  • cellForItemAtIndexPath
  • willDisplayCell
  • ……
  • 一個cell徹底離開屏幕
  • didEndDisplayCell
  • 進入reuse queue

但在iOS10中,一個UICollectionViewCell被重用的過程變成了這樣:

  • 一個cell還沒出如今屏幕上
  • prepareForReuse
  • cellForItemAtIndexPath
  • 一個cell即將出現的屏幕上
  • ……
  • 一個cell徹底離開屏幕
  • didEndDisplayCell
  • 一段時間後再進入reuse queue

因此,iOS10後,cellForItemAtIndexPath被調用時,並不表示這個cell即將要出如今了屏幕上。仍是得老老實實使用willDisplayCelldidEndDisplayCell方法。

參考文章:http://www.jianshu.com/p/90680a4f5143
相關文章
相關標籤/搜索