如何在运行时确定CloudKit环境?

7
有没有一种编程方式可以发现我的应用程序是否正在与CloudKit开发或生产环境交互?
(我知道我可以查看Entitlements.plist中的com.apple.developer.icloud-container-environment键来做出明智的猜测,但这并不能真正证明我使用的是哪个环境。)
3个回答

10

现在你可以在CKContainer上使用扩展。这非常有助于调试和开发目的。

extension CKContainer {
    public var isProductionEnvironment:Bool {
        let containerID = self.value(forKey: "containerID") as! NSObject // CKContainerID
        return containerID.value(forKey: "environment")! as! CLongLong == 1
    }
}
解释: 扩展@ garafajon的回答。 如果您查看iOS Runtime Headers(例如https://github.com/JaviSoto/iOS10-Runtime-Headers),您将看到没有公开的CKContainerID类。
您可以使用键值编码访问环境属性,如下所示:
let container = CKContainer.default()
let containerID = container.value(forKey: "containerID") as! NSObject // CKContainerID
let environment = containerID.value(forKey: "environment")!
print("\(container)")
print("\(containerID)")
print("\(environment)")

com.apple.developer.icloud-container-environment=Production时输出:

<CKContainer: 0x60800017a040; containerID=<CKContainerID: 0x608000232ea0; containerIdentifier=iCloud.com.yourdomain.yourapp, containerEnvironment="Production">>
<CKContainerID: 0x608000232ea0; containerIdentifier=iCloud.com.yourdomain.yourapp, containerEnvironment="Production">
1

com.apple.developer.icloud-container-environment=Development 的情况下输出:

<CKContainer: 0x60800017a1c0; containerID=<CKContainerID: 0x618000035360; containerIdentifier=iCloud.com.yourdomain.yourapp, containerEnvironment="Sandbox">>
<CKContainerID: 0x618000035360; containerIdentifier=iCloud.com.yourdomain.yourapp, containerEnvironment="Sandbox">
2

2
我能想到两种方法来实现这个目标:
1. 你可以创建一个设置记录类型并添加一个环境变量。然后确保在生产和开发环境中都只有一条记录。在开发环境中将环境变量设置为开发,而在生产环境中将该变量设置为生产。然后在你的应用程序中只需读取该记录以查看你所处的环境。
2. 还有一种方法不依赖于数据操作,那就是:尝试在一个虚拟记录类型中创建一个新的随机字段名称。在开发环境中这将起作用,但在生产环境中会报错。

1
像第一个解决方法一样,仍然奇怪为什么没有系统方法存在。 - János

0
在CloudKit JS文档中,容器上有一个名为“environment”的变量,因此我期望我们将在未来的版本中得到它。不过,现在它已经存在了,您可以通过获取其描述字符串来查看它。所以现在这个方法是可行的:
    let container = CKContainer(identifier: kContainerName)
    let containerDescription = String(describing: container)
    if containerDescription.contains("containerEnvironment=\"Sandbox\"") {
        showTestMode()  // or whatever you want to do differently
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接