iOS 10 'String' 领域崩溃

Realm crash on iOS 10 with 'String'

我最近发布了我们应用程序的新版本,在 Beta 测试期间,它在所有 iOS 10 台设备上崩溃,但在其他版本上没有。由于我们有 Crashlytics,我们在后端发现了一条奇怪的崩溃消息,我们可以确认这是所有 iOS 10 崩溃的原因,因为它是 100% iOS 10 并且有大约 40 个。

全文如下:

致命异常:RLMException 属性 Article.id 被声明为字符串,它不是受支持的托管对象 属性 类型。如果它不应该是托管 属性,请将其添加到 ignoredProperties() 或不要将其声明为 @objc dynamic。有关详细信息,请参阅 https://realm.io/docs/swift/latest/api/Classes/Object.html

这是对象:

class Article: Object {
    
    @objc dynamic var id: String = UUID().uuidString
    // others...

    override static func primaryKey() -> String? {
        return "id"
    }
}

如您所见,这是完全正常的,在其他 iOS 上运行良好。在 Realm 的文档中,字面意思是将 String 与 @objc dynamic 一起使用,而且它不可能不受支持。我怀疑 Article.id 没有什么特别之处,因为 ArticleA 开头,它恰好是所有领域对象的第一个字符串 属性。也许不知何故所有字符串在 iOS 10?

上停止工作

谁能提供一些建议或见解?(请不要说放弃 iOS 10 支持之类的话。现在,我们需要它。)

我们 运行 多次陷入同一个问题,试图将 Realm 完全拖入 Swift。这并不是真正的 答案,而是我们在需要向后兼容性时成功使用的解决方法。

它是一个 ObjC 对象,而不是 Swift。

桥接发生了一些事情,可能符合 NSCopy'ing 或类似的东西,所以只需将其更改为阅读

@objc dynamic var id = NSUUID().uuidString

请参阅 Models 部分中的入门指南,其中要求使用 NSUUID

NSUUID: An object representing a universally unique value that bridges to UUID; use NSUUID when you need reference semantics or other Foundation-specific behavior.

原来是 Realm 的 bug。我们碰巧有另一个应用程序在 iOS 10 上运行得很好,经过一些检查我们意识到它使用的是 Realm 4.3.2,而不是 4.4.1。我们将 Realm 降级到 4.3.2 后,这个问题就消失了。