是否有一种编程方式来发现我的应用是否与CloudKit开发或生产环境进行通信?
(我知道我可以查看Entitlements.plist中的com.apple.developer.icloud-container-environment
键来进行智能猜测,但这并不能真正证明我正在使用的环境。)
答案 0 :(得分:2)
我可以想到两种方法:
您可以创建设置recordType并添加环境变量。然后确保其中只有1条记录,包括生产和开发。在开发时,将环境变量设置为开发和生产,将该变量设置为生产。然后在您的应用中阅读该记录,看看您所处的环境。
有一种方法不依赖于数据操作,就是这样:尝试在虚拟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