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
}
相关示例:MotionGraph、TextKitDemo
从 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)。