iOS 9 兼容性

即使不打算立即向应用添加 iOS 9 功能,也应该使用最新版本的 Xamarin 重新生成应用。

重要

此页上的信息适用于已面向 iOS 8 或更早版本的 App Store 中的应用的客户,他们尚未提交 iOS 9 兼容性更新。 如果已使用最新版本(Xcode 7 和 Xamarin.iOS 9)进行应用开发,请访问 iOS 9 简介

出现第一个 iOS 9 beta 版本时,我们发现旧版 Xamarin 存在两个问题,表现为旧版应用程序无法在 iOS 9 上启动:

  • 适用于 iOS 8 或更早版本的应用无法在 32 位设备上启动(包括使用 Unified API 生成的应用)。
  • 未指定具有完整路径的 P/Invoke 失败。

将 Xamarin 安装更新到最新的稳定通道版本,然后重新生成和重新部署应用,修复了这两个问题。

即使不打算立即使用 iOS 9 功能更新应用,我们建议使用最新版本的 Xamarin 重新生成,并重新提交到 App Store

这将确保你的应用在客户升级后将在 iOS 9 上运行。 可以继续支持 iOS 8 - 使用最新版本重新生成不会影响应用程序目标版本。

如果在 iOS 9 上测试现有应用时遇到问题,请阅读下方“改进兼容性”部分。

使用 Visual Studio 进行更新

建议显式检查 Visual Studio 是否已更新到最新的稳定版本。

组件、Nugets 和其他库情况如何?

无需等待任何组件或 Nuget 的新版本来解决上述两个问题。 只需使用最新的 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
}

相关示例:MotionGraphTextKitDemo

从 Xib/Nib 加载视图时,UIView 无法与编码器进行初始化

原因: 从 Interface Builder Xib 文件加载视图时会调用 initWithCoder: 构造函数。 如果此构造函数未导出非托管代码,则无法调用其托管版本。 以前(例如在 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)。