使用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在可用新内容时以静默方式通知您的应用程序,而不会显示用户通知(例如警报,声音或徽章),您需要启用远程通知背景模式。
-
在项目设置中,选择“签名和功能”选项卡。
-
单击+功能按钮,然后在“添加功能”编辑器中搜索“后台模式”,然后选择该功能。
-
选择“远程通知”复选框。
更新现有的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) 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一起使用”复选框。对要同步的每个配置重复上述步骤。
对于没有配置的应用程序,将第一个商店描述与权利中的第一个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