即使您不打算立即將 iOS 9 功能新增至應用程式,您也應該使用最新版本的 Xamarin 重建應用程式。
重要
此頁面上的信息適用於 App Store 中已以 iOS 8 或更早版本為目標的應用程式,且尚未提交 iOS 9 相容性更新的客戶。 如果您已經針對您的應用程式開發使用最新版本 - Xcode 7 和 Xamarin.iOS 9 - 請瀏覽 iOS 9 簡介。
出現第一個 iOS 9 Beta 版時,我們發現舊版 Xamarin 有兩個問題,這些 Xamarin 顯示為舊版應用程式無法在 iOS 9 上啟動:
- iOS 8 或更早版本的應用程式建置無法在 32 位裝置上啟動(包括使用 整合 API 建置的應用程式)。
- 未指定具有完整路徑的 P/Invoke 失敗。
將 Xamarin 安裝更新為最新的穩定通道版本,然後重建和重新部署您的應用程式,修正這兩個問題。
即使您不打算立即使用 iOS 9 功能更新應用程式,建議您使用最新版本的 Xamarin 重新建置,並重新提交至 App Store。
這可確保您的應用程式會在客戶升級之後於 iOS 9 上執行。 您可以繼續支援 iOS 8 - 使用最新版本重建不會影響應用程式目標版本。
如果您在 iOS 9 上測試現有的應用程式時有進一步的問題,請閱讀 下面的<改善相容性 >一節。
使用 Visual Studio 更新
建議您明確檢查 Visual Studio 是否已更新為最新的穩定版本。
元件、Nugets 和其他連結庫呢?
您不需要等候任何元件或 Nugets 的新版本,即可解決上述兩個問題。 只要使用最新的穩定版本 Xamarin.iOS 重新建置您的應用程式,即可修正這些問題。
同樣地,元件廠商和 NuGet 作者 不需要 提交新的組建,只是為了修正上述兩個問題。 不過,如果任何元件或 NuGet 使用UICollectionView或載入來自 Xib 檔案的檢視,可能需要更新才能解決下面所述的 iOS 9 相容性問題。
改善程式代碼中的相容性
在 iOS 9 中,有一些程式碼模式可用來在舊版 iOS 中斷中運作的程式代碼模式。 以下是在 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 無法以程式代碼器初始化
原因: 建 initWithCoder: 構函式是從介面產生器 Xib 檔案載入檢視時所呼叫的建構函式。 如果此建構函式未匯出 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 cache 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)。