iOS 10上的'String'导致Realm崩溃

问题描述

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

内容如下:

致命异常:RLMException 属性Article.id声明为String,这不是受支持的托管对象属性类型。如果不应将其作为托管属性,请将其添加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开头,它恰好是所有领域对象的第一个String属性。也许所有的Strings都无法在iOS 10上运行?

任何人都可以提供一些建议或见解吗?(请不要说放弃iOS 10支持之类的东西。现在,我们需要它。)

解决方法

我们几次遇到同一问题,试图将Realm完全拖入Swift。这不是真正的答案,而是需要向后兼容时我们已经成功解决的更多解决方法。

这是一个ObjC对象,不是Swift。

桥接过程中可能发生了某些事情,可能是符合NSCopy的要求,或者是类似的事情,所以只需将其更改为

@objc dynamic var id = NSUUID().uuidString

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

NSUUID:一个对象,它代表桥接的通用唯一值 到UUID; 当您需要引用语义或其他语义时,请使用NSUUID 基金会特有的行为。

,

原来是领域的错误。我们碰巧有另一个可以在iOS 10上正常运行的应用程序,经过一番检查,我们意识到它使用的是Realm 4.3.2,而不是4.4.1。将Realm降级为4.3.2后,该问题消失了。