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

时间:2015-09-08 18:24:24

标签: ios cloudkit cloudkit-environments

是否有一种编程方式来发现我的应用是否与CloudKit开发或生产环境进行通信?

(我知道我可以查看Entitlements.plist中的com.apple.developer.icloud-container-environment键来进行智能猜测,但这并不能真正证明我正在使用的环境。)

3 个答案:

答案 0 :(得分:2)

我可以想到两种方法:

  1. 您可以创建设置recordType并添加环境变量。然后确保其中只有1条记录,包括生产和开发。在开发时,将环境变量设置为开发和生产,将该变量设置为生产。然后在您的应用中阅读该记录,看看您所处的环境。

  2. 有一种方法不依赖于数据操作,就是这样:尝试在虚拟recordType中创建一个新的随机字段名称。关于开发将发挥作用。在制作时,您将收到错误。

答案 1 :(得分:2)

截至目前,您可以在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运行时标题(例如https://github.com/JaviSoto/iOS10-Runtime-Headers),你会发现有一个不公开的类CKContainerID

您可以使用键值编码访问environment属性,如下所示:

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 :(得分:0)

在CloudKit JS文档中,容器上有一个名为“environment”的变量,所以我希望在将来的版本中能够得到它。现在,它就在那里,你可以通过获取它的描述字符串来窥视它。所以现在这个有用了:

36000000000000000ns
libc++abi.dylib: terminating with uncaught exception of type  std::overflow_error: checked_convert