【问题标题】:How can CloudKit environment be determined at runtime?CloudKit 环境如何在运行时确定?
【发布时间】:2015-09-08 18:24:23
【问题描述】:

是否有一种编程方式来发现我的应用是在与 CloudKit 开发环境还是生产环境对话?

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

【问题讨论】:

    标签: ios cloudkit cloudkit-environments


    【解决方案1】:

    到目前为止,您可以在 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 类未公开。

    您可以使用如下键值编码访问环境属性:

    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. 您可以创建一个设置记录类型并添加一个环境变量。然后确保其中只有 1 条记录,包括生产和开发。在开发时将环境变量设置为开发,在生产时将该变量设置为生产。然后在您的应用中读取该记录以查看您所处的环境。

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

      【讨论】:

      • 像第一个解决方法,仍然奇怪的是没有系统方法存在
      【解决方案3】:

      在 CloudKit JS 文档中,容器上有一个名为“环境”的变量,所以我希望我们会在未来的版本中得到它。不过现在,它就在那里,您可以通过获取它的描述字符串来查看它。所以这暂时有效:

          let container = CKContainer(identifier: kContainerName)
          let containerDescription = String(describing: container)
          if containerDescription.contains("containerEnvironment=\"Sandbox\"") {
              showTestMode()  // or whatever you want to do differently
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 2019-07-11
        • 1970-01-01
        • 2015-04-13
        相关资源
        最近更新 更多