【问题标题】:Building with Xcode 13 (iOS 15 SDK) is not longer backward compatible with iOS 14.x targets使用 Xcode 13 (iOS 15 SDK) 构建不再向后兼容 iOS 14.x 目标
【发布时间】:2021-11-11 08:25:13
【问题描述】:

刚刚发现使用 CloudKit 时,使用新的 iOS 15 SDK (Xcode 13 RC) 构建应用不再向后兼容 iOS 14.x 目标。

重现步骤:

  1. Xcode 13 RC 中的新项目(检查 Core Data + CloudKit 选项)

  2. 将 iOS 部署目标设置为 14.0

  3. 修改生成的 Persistence.swift 文件并添加一个私有 CK 存储,如下所示:

    让 cloudStoreDescription = NSPersistentStoreDescription(url: url.appendingPathComponent("(privateCloudStoreName).sqlite")) cloudStoreDescription.configuration = "privateCkStoreName" var privateCloudKitContainerOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "CKIDENTIFIFER") privateCloudKitContainerOptions.databaseScope = .private cloudStoreDescription.cloudKitContainerOptions = privateCloudKitContainerOptions

  4. 在装有 iOS 15 的 iPhone 上运行 -> 可以工作

  5. 下载更多模拟器运行时并添加 iOS 14.5

  6. 在装有 iOS 14.5 的 iPhone 上运行 -> 将失败并显示:

dyld:库未加载:/System/Library/Frameworks/_CoreData_CloudKit.framework/_CoreData_CloudKit 引用自:/Users/andrei/Library/Developer/CoreSimulator/Devices/8554B734-4894-4DD0-A8FA-6C20983F3A49/data/Containers/Bundle/Application/1317D63A-F14B-4EA2-8F18-8EA623D358AB/testapp.app/testapp 原因:找不到图片

由于下周 iOS 15 将向公众发布,我该如何缓解这种情况?

可重复的示例here。 反馈小助手id:FB9630276

【问题讨论】:

  • 好的,此时我可以使用 XCODE 13 构建并在 iOS 15 sim 上运行,也可以使用 XCODE 12 构建并在 iOS 14 sim 上运行。如何以这种方式将新版本分发给苹果?
  • 是的,但是根据这个线程:developer.apple.com/forums/thread/682925?page=1#687848022,Apple“今年对 Core Data 进行了许多更改,以将 CloudKit 类与非 cloudkit 客户端隔离开来,其中一个引入了这个新模块。”针对 iOS sdk 14 构建是否有效?它会直接从设备中选择新模块吗:
  • 是的,我已经提出了 FB9630276。对于 Stack Overflow,我的问题是,一旦 iOS 15 向公众发布后,如何缓解此问题以避免崩溃。
  • 不,我用 iOS 14 模拟器测试了 XCode 12 -> 工作,我没有构建 Xcode 12 并将构建放在 iOS 15 模拟器上。我以前没有这样做过,也许它可以从命令行实现

标签: ios xcode core-data cloudkit ios15


【解决方案1】:

解决方案一直在我眼前:

只需删除以下行:

privateCloudKitContainerOptions.databaseScope = .private 

删除该行将具有与默认私有范围相同的效果,并且也将删除导入 CloudKit 的需要。

通过这样做,iOS 14.x 上不再出现崩溃

如果您想使用 .public 范围,根据 Apple Frameworks Enginner,修复方法如下:

let options = NSPersistentCloudKitContainerOptions(containerIdentifier: id)
options.setValue(1, forKey: "databaseScope") // .public == 1 // options.databaseScope = CKDatabase.Scope.public
description.cloudKitContainerOptions = options

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多