2015-09-08 28 views
4

有沒有一種編程方式來發現我的應用程序是否正在與CloudKit Development或Production環境進行對話?如何在運行時確定CloudKit環境?

(我知道我可以看看Entitlements.plist的com.apple.developer.icloud-container-environment鍵做出明智的猜測,但並沒有真正我使用-prove-處於何種環境。)

回答

2

我能想到的2方法如下:

  1. 您可以創建一個設置recordType並添加一個環境變量。然後確保其中只有1條記錄,包括生產和開發。在開發中,將環境變量設置爲開發,並在生產環境中將該變量設置爲生產。然後,在您的應用程序中,只需閱讀該記錄即可瞭解您所處的環境。

  2. 有一種不依賴數據操作的方式,就是這樣:嘗試在虛擬recordType中創建新的隨機字段名稱。在發展,只會工作。在生產中你會得到一個錯誤。

+1

像第一個解決方法,仍然是奇怪的它不存在任何系統方法 –

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 
    } 
0

截至目前你可以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