CloudKit快速入门之 使用CloudKit 设置核心数据

2022-04-12 00:00:00 选择 项目 配置 容器 您的

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

使用CloudKit 设置核心数据
设置将您的商店同步到CloudKit的类和功能。

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

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

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

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

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

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

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


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

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

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

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

指定您的开发团队。

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


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

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

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

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


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

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

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

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

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

选择“远程通知”复选框。
————————————————
版权声明:本文为CSDN博主「知识大胖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iCloudEnd/article/details/107944240


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

首先,如前所述,在后台启用iCloud,CloudKit,推送通知和远程通知。然后,将持久容器替换为的实例。NSPersistent<wbr data-v-7fb764c1="" style="quotes: "“" "”"; font-style: normal;">Cloud<wbr data-v-7fb764c1="" style="quotes: "“" "”"; font-style: normal;">Kit<wbr data-v-7fb764c1="" style="quotes: "“" "”"; 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) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()

// ...
}

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

let container = NSPersistentCloudKitContainer(name: "Earthquakes")
1
管理多个商店
您可能希望使用CloudKit镜像一部分数据,同时将其他数据完全保留在本地。您可以将配置添加到模型中,以在单独的存储中组织数据,然后选择要同步到CloudKit的存储。

打开项目的.xcdatamodeld文件。

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

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

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


对于没有配置的应用程序,将个商店描述与权利中的个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 store
let localStoreLocation = URL(fileURLWithPath: "/path/to/local.store")
let localStoreDescription =
NSPersistentStoreDescription(url: localStoreLocation)
localStoreDescription.configuration = "Local"

// Create a store description for a CloudKit-backed local store
let cloudStoreLocation = URL(fileURLWithPath: "/path/to/cloud.store")
let cloudStoreDescription =
NSPersistentStoreDescription(url: cloudStoreLocation)
cloudStoreDescription.configuration = "Cloud"

// Set the container options on the cloud store
cloudStoreDescription.cloudKitContainerOptions =
NSPersistentCloudKitContainerOptions(
containerIdentifier: "com.my.container")

// Update the container's list of store descriptions
container.persistentStoreDescriptions = [
cloudStoreDescription,
localStoreDescription
]

// Load both stores
container.loadPersistentStores { storeDescription, error in
guard error == nil else {
fatalError("Could not load persistent stores. \(error!)")
}
}

return container
}()


————————————————

原文链接:https://blog.csdn.net/iCloudEnd/article/details/107944240


相关文章