Как определить среду 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 способа сделать это:

  1. Вы можете создать настройки recordType и добавить переменную окружения. Затем убедитесь, что в нем есть только 1 запись, как по производству, так и по разработке. При разработке установите переменную среды для разработки, а для производства установите эту переменную для производства. Затем в своем приложении просто прочитайте эту запись, чтобы увидеть, в какой среде вы находитесь.

  2. Существует способ, который не зависит от манипулирования данными, и заключается в следующем: попробуйте создать новое случайное имя поля в фиктивном 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
    }
Другие вопросы по тегам