问题描述
我最近发布了我们应用的新版本,并且在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
没什么特别的,并且由于Article
以A
开头,它恰好是所有领域对象的第一个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后,该问题消失了。