在运行时切换 iCloud 同步

问题描述 投票:0回答:2

我有一个 SwiftUI 应用程序,用户可以通过应用内购买来购买一些高级功能。其中一项功能是在更多设备上进行 iCloud 同步。我正在使用 CoreData 来保存用户数据。 我的持久容器:

lazy var persistentContainer: NSPersistentCloudKitContainer = {
        let container = NSPersistentCloudKitContainer(name: "store name")
        let description: NSPersistentStoreDescription? = container.persistentStoreDescriptions.first
        let remoteChangeKey: String = "NSPersistentStoreRemoteChangeNotificationOptionKey"
        if(description != nil) {
            description!.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
            description!.setOption(true as NSNumber, forKey: remoteChangeKey)
        }

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

我的问题是当用户购买订阅时如何打开/关闭云同步。我不希望用户必须重新启动应用程序。 我还希望用户可以在应用程序内设置中切换此设置。

谢谢

swift xcode icloud nspersistentcloudkitcontainer
2个回答
4
投票

将变量声明为

NSPersistentContainer
而不是
NSPersistentCloudKitContainer
。启动时,如果用户有云同步,则加载云套件持久容器,否则加载非云套件。

切换开关后,重新加载容器,遵循相同的规则。要重新加载容器,我会将该属性添加到管理器对象,其中我会添加一些根据用户设置重新加载容器的方法。


0
投票

根据Apple工程师给出的答案, 正确的方法是当您想要禁用 iCloud 同步时将

cloudKitContainerOptions
设置为 nil。

if isSyncEnabled {
    storeDescription.cloudKitContainerOptions = .init(containerIdentifier: "iCloud.your.identifier")
} else {
    storeDescription.cloudKitContainerOptions = nil
}

© www.soinside.com 2019 - 2024. All rights reserved.