本文提供數個在 Xamarin.iOS 應用程式中使用 iOS 9 的疑難解答秘訣。
iOS 8 模擬器在哪裡?
如果您已安裝 Xcode 7 (或更新版本),則預設會自動將所有 iOS 8 模擬器取代為 iOS 9 模擬器。 如果您仍然需要在 iOS 8 上進行測試,您可以啟動 Xcode,然後下載並安裝 iOS 8 模擬器。
在 Xcode 中 ,選取 [Xcode ] 功能表,然後 選取 [喜好設定...>下載:
選取 [ 立即檢查] 按鈕以重新安裝 iOS 8 模擬器。
具有左/右屬性錯誤的版面配置條件約束
在 iOS 8(和先前版本),分鏡腳本中的 UI 元素可以在相同的版面配置中使用左右屬性(& NSLayoutAttributeLeft& ) NSLayoutAttributeTrailing和前置和尾端屬性的組合。NSLayoutAttributeRightNSLayoutAttributeLeading
如果在 iOS 9 中執行相同的分鏡腳本,則會產生下列格式的例外狀況:
因未攔截例外狀況 'NSInvalidArgumentException' 而終止應用程式,原因: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]:無法在前置/尾端屬性與右/左屬性之間建立條件約束。 針對兩者或兩者都使用前置/尾端。
iOS 9 會強制執行版面配置,以使用 Right 和 Left 或 Leading & Trailing 屬性,但不能同時使用兩者。 若要修正此問題,請變更所有版面配置條件約束,以在 Storyboard 檔案內使用相同的屬性集。
如需詳細資訊,請參閱 iOS 9 條件約束錯誤 Stack Overflow 討論。
錯誤 ITMS-90535:非預期的 CFBundleExecutable 密鑰
切換至 iOS 9 之後,從應用程式使用第三方元件(特別是我們現有的 Google Maps 元件)在 iOS 8(或更早版本)上編譯並執行,嘗試將新組建提交至 iTunes Connect 時,您可以在窗體中收到錯誤:
錯誤 ITMS-90535:非預期的 CFBundleExecutable 密鑰。 'Payload/app-name.app/component.bundle' 的套件組合不包含套件組合可執行檔...
通常可以藉由在項目中尋找具名套件組合來解決這個問題,就像錯誤訊息所建議的那樣,藉由移除CFBundleExecutable密鑰來編輯Info.plist套件組合中的 。 金鑰 CFBundlePackageType 也應該設定為 BNDL 。
進行這些變更之後,請執行全新並重建整個專案。 進行這些變更之後,您可以提交至 iTunes Connect,而不會發生問題。
如需詳細資訊,請參閱此 Stack Overflow 討論。
CFNetwork SSLHandshake 失敗 (-9824) 錯誤
嘗試直接或從 iOS 9 中的 Web 檢視連線到因特網時,您可能會在表單中收到錯誤:
2015-09-04 14:38:05.757 FormsWebViewiOS[2553:30362] CFNetwork SSLHandshake failed (-9824)
2015-09-04 14:38:05.758 FormsWebViewiOS[2553:30363] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)
或者,格式如下:
2015-09-04 14:39:17.881 FormsWebViewiOS[2568:30974] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
Temporary exceptions can be configured via your app's Info.plist file.
在 iOS9 中,應用程式傳輸安全性 (ATS) 會在因特網資源(例如應用程式的後端伺服器)和您的應用程式之間強制執行安全連線。 此外,ATS 需要使用通訊協定和高階 API 通訊進行通訊 HTTPS ,才能使用 TLS 1.2 版進行轉寄密碼加密。
由於針對 iOS 9 和 OS X 10.11 (El Capitan) 建置的應用程式預設會啟用 ATS,因此所有使用 NSURLConnection、 CFURL或 NSURLSession 的連線都將受限於 ATS 安全性需求。 如果您的連線不符合這些需求,這些連線將會失敗,但發生例外狀況。
如需如何解決此問題的資訊,請參閱應用程式傳輸安全性指南的 ATS 退出宣告一節。
我現有的應用程式不會在 iOS 9 上執行
如需重建和重新部署現有應用程式以在 iOS 9 上執行的指示,請參閱我們的 iOS 9 相容性資訊 。
建構函式中的UICollectionViewCell.ContentView為 Null
原因: 在 iOS 9 中, initWithFrame: 建構函式現在是必要的,因為 iOS 9 的行為變更為 UICollectionView 文件狀態。 如果您註冊了指定標識符的類別,而且必須建立新的儲存格,則現在會藉由呼叫其 方法初始化該 initWithFrame: 儲存格。
修正: 新增如下所示的建 initWithFrame: 構函式:
[Export ("initWithFrame:")]
public YourCellClassName (CGRect frame) : base (frame)
{
Initialize (); // refactor initialize code into a method
}
相關範例: MotionGraph、 TextKitDemo
從 Xib/Nib 載入檢視時,UIView 無法從 Coder 使用 Init
原因: 從介面產生器 Xib 檔案載入檢視時,會呼叫建 initWithCoder: 構函式。 如果未匯出此建構函式,Unmanaged 程式代碼就無法呼叫它的 Managed 版本。 先前(例如在 iOS 8 中)已叫用建 IntPtr 構函式來初始化檢視。
修正: 建立和導出 initWithCoder: 建構函式,如下所示:
[Export ("initWithCoder:")]
public YourClassName (NSCoder coder) : base (coder)
{
Initialize (); // refactor initialize code into a method
}
相關範例: 聊天
Dyld 訊息:沒有名稱為的快取映射...
您可能會在記錄檔中遇到下列資訊當機:
Dyld Error Message:
Dyld Message: no cach image with name (/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore)
原因: 這是Apple原生連結器中的Bug,當它們公開私人架構時,就會發生(在iOS 7中公開JavaScriptCore之前,這是私人架構),而應用程式部署目標適用於私人架構時的iOS版本。 在此情況下,Apple 的連結器會與架構的私人版本連結,而不是公用版本。
修正: 這會針對iOS 9解決此問題,但有一個簡單的因應措施,您可以同時自行套用:只要以您專案中較新的iOS 版本為目標(在此案例中可以嘗試 iOS 7)。 其他架構可能會顯示類似的問題,例如 WebKit 架構是在 iOS 8 中公開的(因此以 iOS 7 為目標會導致此錯誤;您應該將 iOS 8 設為在應用程式中使用 WebKit)。
不受信任的企業開發人員
嘗試在實際的 iOS 硬體上執行 Xamarin.iOS 應用程式的 iOS 9 版本時,您可能會收到訊息,指出您的開發人員帳戶在裝置上尚未受到信任。 例如:
若要解決此問題,請執行下列動作:
在開發 Mac 上啟動 Xcode (最新的 Beta 版本)。
從 [視窗] 選單中選取 [裝置],以開啟 [裝置] 視窗:
在 [ 裝置 ] 端面板中,選取您的裝置,以滑鼠右鍵按下,然後選取 [ 顯示布建配置檔...] :
選取裝置上目前每個佈建設定檔,然後選取 - 要刪除它的按鈕:
從 [Xcode] 功能表中,選取 [喜好設定...] 和 [帳戶]:
按下 [ 檢視詳細數據... ] 按鈕,然後選取 [ 下載所有 ] 按鈕:
當清單完成更新時,請選取 [完成 ] 按鈕並關閉 [喜好設定] 視窗。
從 iOS 裝置移除您嘗試測試的現有 Xamarin.iOS 應用程式版本。
返回 Visual Studio for Mac,執行全新組建,並嘗試在裝置上重新執行應用程式。
您可能必須停止並重新啟動 Visual Studio for Mac,才能看到 Xcode 載入的新佈建配置檔。 您可能也必須調整 Xamarin.iOS 應用程式的 iOS 套件組合簽署 選項,以選取新的佈建配置檔。
啟動畫面問題
iOS 9 現在會強制執行啟動畫面需求,因此無法再重複使用相同的啟動影像來支援不同的介面方向。 如需詳細資訊,請參閱Apple的 UILanchImage參考 。
您可以選擇性地使用分鏡腳本檔案來呈現應用程式的啟動畫面,而不是使用一組 .png 圖像檔。 這是蘋果展示啟動畫面的慣用方式。 如需詳細資訊,請參閱整合分鏡腳本簡介指南。
最後,您的應用程式必須使用分鏡腳本檔案作為啟動畫面,並支援所有四個介面方向(直向、倒置直向、橫向向左和橫向右方),才能考慮在 [投影片上方] 面板或 [分割檢視] 模式中執行。 若要深入瞭解 iOS 9 的新多任務處理能力,請參閱 iPad 的多任務處理指南。
NSInternalInconsistencyException 例外狀況
在編譯和執行適用於 iOS 9 的現有 Xamarin.iOS 應用程式時,您可能會收到下列格式的錯誤:
Objective-C 擲回例外狀況。 名稱:NSInternalInconsistencyException 原因:應用程式窗口預期會在應用程式啟動結束時有根檢視控制器
因為應用程式 Windows 預期會在應用程式啟動結束時有根檢視控制器,而且現有的應用程式不會引發此錯誤。
此問題至少有兩種可能的因應措施:
- 更新應用程式以使用分鏡腳本檔案,
xib而不是檔案來定義其使用者介面。 這需要很多時間才能更正,視您的應用程式大小而定,以及如何使用 Xcode 的介面產生器來配置分鏡腳本的知識。 如需詳細資訊,請參閱整合 分鏡腳本 簡介檔。 RootViewController在類別中FinishedLaunchingAppDelegate設定 app Window 的 屬性,以指向您 app UI 中的檢視控制器。
初始化檢視和檢視控制器的時機
使用 Xamarin.iOS 時,可能會讓檢視或檢視控制器在建構函式內初始化,這些建構函式會在 Managed 程式代碼中公開某些專案時呼叫,但會中斷 iOS 設計。
一般而言,您不應該初始化任何可以從建構函式呼叫程式 Objective-C 代碼的專案,因為您無法確定何時呼叫它。 這也表示有更好的位置(其他 .ctor)或呼叫覆寫(如 Objective-C 沒有事件),應該執行此初始化。


![[裝置] 視窗](troubleshooting-images/untrusted02.png)



