当前位置: 代码迷 >> 综合 >> CloudKit快速入门之 使用CloudKit 设置核心数据 (SwiftUI iCloud CloudKit中文文档手册教程)
  详细解决方案

CloudKit快速入门之 使用CloudKit 设置核心数据 (SwiftUI iCloud CloudKit中文文档手册教程)

热度:5   发布时间:2024-02-09 20:22:56.0

使用CloudKit 设置核心数据

设置将您的商店同步到CloudKit的类和功能。

总览

要将您的核心数据存储同步到CloudKit,请为您的应用启用CloudKit功能。您还使用持久性容器设置了核心数据堆栈,该容器能够管理一个或多个由CloudKit私有数据库支持的本地持久性存储。

配置一个新的Xcode项目
创建新项目时,可以指定是否要直接从项目设置界面使用CloudKit添加对Core Data的支持。生成的项目会在您的应用的委托中实例化一个。在项目中启用CloudKit后,即可使用此容器来管理由CloudKit数据库支持的一个或多个本地存储。NSPersistentCloudKitContainer

选择“文件”>“新建”>“项目”以创建一个新项目。

选择一个项目模板用作您的项目的起点,然后单击“下一步”。

选择使用核心数据和使用CloudKit复选框。

输入任何其他项目详细信息,然后单击“下一步”。

指定项目的位置,然后单击“创建”。

截屏2020-08-11 下午8.33.16.png

并非所有项目模板都支持核心数据。如果要使用的模板不支持Core Data,请按照“ 设置Core Data堆栈”中的说明将Core Data添加到项目中。然后,如更新现有Xcode项目中所述,使用CloudKit添加Core Data 。

启用iCloud

使用CloudKit的核心数据要求您的应用具有特定的权利才能与服务器通信。首先将iCloud功能添加到您的Xcode项目中。

  1. 在项目设置中,选择“签名和功能”选项卡。

  2. 确保选择“自动管理签名”。

  3. 指定您的开发团队。

  4. 单击+功能按钮,然后在添加功能编辑器中搜索iCloud并选择该功能。

截屏2020-08-11 下午8.38.20.png

启用CloudKit和推送通知
CloudKit的核心数据使用CloudKit服务访问您团队的容器。要启用CloudKit,请配置iCloud功能。

在项目设置中,选择“签名和功能”选项卡。

在“ iCloud”部分的“服务”下,选中“ CloudKit”复选框。此选择还会添加推送通知,以在远程内容更改时通知您的应用程序。

在“容器”下,将选择保留为“使用默认容器”。

截屏2020-08-11 下午8.39.22.png

Xcode会检查您的开发团队是否支持Push Notification和iCloud功能,然后注册您的应用程序的包标识符并管理配置文件。

有关使用CloudKit容器和设置配置文件的更多信息,请参阅在应用程序中启用CloudKit。

在后台启用远程通知

为了让CloudKit在可用新内容时以静默方式通知您的应用程序,而不会显示用户通知(例如警报,声音或徽章),您需要启用远程通知背景模式。

  1. 在项目设置中,选择“签名和功能”选项卡。

  2. 单击+功能按钮,然后在“添加功能”编辑器中搜索“后台模式”,然后选择该功能。

  3. 选择“远程通知”复选框。

截屏2020-08-11 下午8.40.10.png

更新现有的Xcode项目

如果要将CloudKit中的Core Data添加到已经使用Core Data的应用中,则需要修改项目的配置及其一些代码。

首先,如前所述,在后台启用iCloud,CloudKit,推送通知和远程通知。然后,将持久容器替换为的实例。NSPersistent<wbr data-v-7fb764c1="" style="quotes: &quot;“&quot; &quot;”&quot;; font-style: normal;">Cloud<wbr data-v-7fb764c1="" style="quotes: &quot;“&quot; &quot;”&quot;; font-style: normal;">Kit<wbr data-v-7fb764c1="" style="quotes: &quot;“&quot; &quot;”&quot;; font-style: normal;">Container

例如,如果您是通过iOS Single View App模板创建的项目,并且选中了“使用核心数据”复选框,则以下代码将出现在应用程序的委托中:

class AppDelegate: UIResponder, UIApplicationDelegate {// ...lazy var persistentContainer: NSPersistentContainer = {let container = NSPersistentContainer(name: "Earthquakes")container.loadPersistentStores(completionHandler: { (storeDescription, error) inif let error = error as NSError? {fatalError("Unresolved error \(error), \(error.userInfo)")}})return container}()// ...
}

NSPersistentContainer仅支持本地持久存储。要添加将本地存储同步到CloudKit数据库的功能,请替换为子类。NSPersistentContainerNSPersistentCloudKitContainer

  let container = NSPersistentCloudKitContainer(name: "Earthquakes")

管理多个商店

您可能希望使用CloudKit镜像一部分数据,同时将其他数据完全保留在本地。您可以将配置添加到模型中,以在单独的存储中组织数据,然后选择要同步到CloudKit的存储。

打开项目的.xcdatamodeld文件。

选择“编辑器>添加配置”。

将每个实体拖动到配置中。

选择要同步到CloudKit的配置,然后在数据模型编辑器中选择“与CloudKit一起使用”复选框。对要同步的每个配置重复上述步骤。

截屏2020-08-11 下午8.43.33.png

对于没有配置的应用程序,将第一个商店描述与权利中的第一个CloudKit容器标识符匹配。NSPersistentCloudKitContainer

对于具有配置的应用程序,您需要告诉它每个商店要使用哪个CloudKit容器(如果有)。对于每种配置,请对容器设置进行以下更改:

创建一个。NSPersistentStoreDescription

设置商店描述的配置。

如果此配置应同步到CloudKit,请将商店描述设置为的实例。在初始化程序中提供CloudKit容器的容器标识符。cloudKitContainerOptionsNSPersistentCloudKitContainerOptions

在加载商店之前,将商店描述添加到持久性容器中。

以下示例代码创建两个商店描述:一个用于“本地”配置,另一个用于“ Cloud”配置。然后,它设置云商店描述以使其与其CloudKit容器匹配。最后,它更新容器的持久性商店描述列表,以包括所有本地和云支持的商店描述,并加载两个商店。cloudKitContainerOptions

lazy var persistentContainer: NSPersistentCloudKitContainer = {let container = NSPersistentCloudKitContainer(name: "Earthquakes")// Create a store description for a local storelet localStoreLocation = URL(fileURLWithPath: "/path/to/local.store")let localStoreDescription =NSPersistentStoreDescription(url: localStoreLocation)localStoreDescription.configuration = "Local"// Create a store description for a CloudKit-backed local storelet cloudStoreLocation = URL(fileURLWithPath: "/path/to/cloud.store")let cloudStoreDescription =NSPersistentStoreDescription(url: cloudStoreLocation)cloudStoreDescription.configuration = "Cloud"// Set the container options on the cloud storecloudStoreDescription.cloudKitContainerOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "com.my.container")// Update the container's list of store descriptionscontainer.persistentStoreDescriptions = [cloudStoreDescription,localStoreDescription]// Load both storescontainer.loadPersistentStores { storeDescription, error inguard error == nil else {fatalError("Could not load persistent stores. \(error!)")}}return container
}()

技术交流

QQ:3365059189
SwiftUI技术交流QQ群:518696470

  相关解决方案