Как определить среду CloudKit во время выполнения?
Есть ли программный способ узнать, поддерживает ли мое приложение среду разработки или разработки CloudKit?
(Я знаю, что могу посмотреть на com.apple.developer.icloud-container-environment
введите Entitlements.plist, чтобы сделать разумное предположение, но это не совсем доказывает, какую среду я использую.)
3 ответа
На данный момент вы можете использовать расширение на 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 способа сделать это:
Вы можете создать настройки recordType и добавить переменную окружения. Затем убедитесь, что в нем есть только 1 запись, как по производству, так и по разработке. При разработке установите переменную среды для разработки, а для производства установите эту переменную для производства. Затем в своем приложении просто прочитайте эту запись, чтобы увидеть, в какой среде вы находитесь.
Существует способ, который не зависит от манипулирования данными, и заключается в следующем: попробуйте создать новое случайное имя поля в фиктивном recordType. На разработке это будет просто работать. На производстве вы получите ошибку.
В документации 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
}