Swift iOS Intent 扩展:无法读取数据,因为它的格式不正确

Posted

技术标签:

【中文标题】Swift iOS Intent 扩展:无法读取数据,因为它的格式不正确【英文标题】:Swift iOS Intent Extension: The data couldn't be read because it isn't in the correct format 【发布时间】:2019-03-01 16:43:45 【问题描述】:

我一直在尝试将 ios Siri Intent Extension 添加到我的应用中。主应用程序和扩展程序之间有一个共享类,在该类中它创建一个对象数组,然后根据需要使用 UserDefaults 保存/加载它们。这在主应用程序中运行良好,但在运行扩展程序时会引发以下错误:

“无法读取数据,因为它的格式不正确。”

我在两者之间启用了应用程序组,并根据需要共享所有文件。我在这里和其他地方读到的所有内容都说它应该像这样简单,但我无法弄清楚为什么当它使用同一个类在两个地方加载/保存时数据的格式会错误。使用断点,我可以看到两个应用程序之间的数据对象大小相同,但如果我查看内容,它看起来确实不同。我还尝试使用 containerURL(forSecurityApplicationGroupIdentifier: "group.xxxx") 将数据存储到磁盘,但遇到了同样的问题。

感谢任何帮助!

var arrayOfObjects = [MyObject]()

func save() 
    do 
        guard let defaults: UserDefaults = UserDefaults(suiteName: "group.xxxx") else 
            fatalError("Error loading user defaults")
        

        let data = try NSKeyedArchiver.archivedData(withRootObject: arrayOfObjects, requiringSecureCoding: false)

        defaults.set(data, forKey: "objects")
        defaults.synchronize()
     catch 
        print("Error: \(error.localizedDescription)")
    


func load() 
    do 
        guard let defaults: UserDefaults = UserDefaults(suiteName: "group.xxxx") else 
            fatalError("Error loading user defaults")
        

        if let data = defaults.data(forKey: "objects") 

            guard let objectData = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [MyObject] else 
                fatalError("Error reading data from archive")
            
            arrayOfObjects = objectData
        

     catch 
        print("Error: \(error.localizedDescription)")
    

【问题讨论】:

【参考方案1】:

我认为你不能unarchiveTopLevelObjectWithData是因为它们在不同的应用程序中。

您应该使用 JSON 格式字符串在您的应用和扩展程序之间共享数据。

【讨论】:

知道了,我可以看到。我一直在使用 NSKeyedArchiver,所以我只是希望不要重写它,但 JSON 至少还不错:) 谢谢!

以上是关于Swift iOS Intent 扩展:无法读取数据,因为它的格式不正确的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Swift 中使用网络扩展框架 iOS 8 设置 *** 连接

无法从 onActivityReenter 中的 Intent 读取 Parcelable

Swift Extension 计算变量在协议中声明之前无法正确读取

iOS 10 - Swift 仍然通知 CloudKit:应用程序未启动,在 didFinishLaunchingWithOptions 之后读取通知

Swift PKPass 错误“无法读取通行证,因为它无效”

无视频输出和 [MC] 从公共有效用户设置中读取。 Swift/iOS 11 中的错误