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

Gre*_*tic 6 ios cloudkit cloudkit-environments

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

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

Kla*_*aas 5

截至目前,您可以在CKContainer. 这对于调试和开发目的非常有帮助。

extension CKContainer {
    public var isProductionEnvironment:Bool {
        let containerID = self.value(forKey: "containerID") as! NSObject // CKContainerID
        return containerID.value(forKey: "environment")! as! CLongLong == 1
    }
}
Run Code Online (Sandbox Code Playgroud)

说明

扩展@garafajon 的回答。如果您查看 iOS 运行时标头(例如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)")
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Edw*_*eer 2

我可以想到两种方法来做到这一点:

  1. 您可以创建一个设置 recordType 并添加一个环境变量。然后确保其中只有 1 条记录,无论是生产还是开发。在开发时将环境变量设置为开发,在生产时将该变量设置为生产。然后在您的应用程序中只需读取该记录即可了解您所处的环境。

  2. 有一种不依赖数据操作的方法,那就是:尝试在虚拟记录类型中创建一个新的随机字段名称。在开发上,这将会起作用。在生产中你会得到一个错误。