有沒有一種編程方式來發現我的應用程序是否正在與CloudKit Development或Production環境進行對話?如何在運行時確定CloudKit環境?
(我知道我可以看看Entitlements.plist的com.apple.developer.icloud-container-environment
鍵做出明智的猜測,但並沒有真正我使用-prove-處於何種環境。)
有沒有一種編程方式來發現我的應用程序是否正在與CloudKit Development或Production環境進行對話?如何在運行時確定CloudKit環境?
(我知道我可以看看Entitlements.plist的com.apple.developer.icloud-container-environment
鍵做出明智的猜測,但並沒有真正我使用-prove-處於何種環境。)
我能想到的2方法如下:
您可以創建一個設置recordType並添加一個環境變量。然後確保其中只有1條記錄,包括生產和開發。在開發中,將環境變量設置爲開發,並在生產環境中將該變量設置爲生產。然後,在您的應用程序中,只需閱讀該記錄即可瞭解您所處的環境。
有一種不依賴數據操作的方式,就是這樣:嘗試在虛擬recordType中創建新的隨機字段名稱。在發展,只會工作。在生產中你會得到一個錯誤。
在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
}
截至目前你可以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
像第一個解決方法,仍然是奇怪的它不存在任何系統方法 –