Как определить окружение TestFlight, Simulator, AppStore, Device в iOS
04.06.2021
56

Как определить окружение TestFlight, Simulator, AppStore, Device в iOS

Работая над iOS приложениями необходимо разделять логику/запросы в зависимости от запущенной среды. 


Когда мы работаем с рантайме запуская тестовую фичу в симуляторе или на устройстве через XCode можно определить Environment vars через разные схемы. Получив доступ к переменным через 

ProcessInfo.processInfo.environment["key"] или вовсе используя #if DEBUG. Подобный подход не сработает при билде, нужен другой велосипед.


Когда мы загружаем версию для релиза в TestFlight, билд обязан работать по development правилам, иначе тестировщики не смогут проверить подписки, сломают аналитику и наворотят других дел.


Начиная с версии Swift 4.1 можно определить запущенный билд через симулятор помощи условия 

#if targetEnvironment(simulator)


Для того чтобы определить запущенную сборку из TestFlight или Xcode на своем устройстве, достаточно обратит внимание на путь к чекам подписок, Bundle.main.appStoreReceiptURL?.lastPathComponent == "sandboxReceipt"


В результате для определения Development или Production окружения возможно добиться подобным способом:


enum Environment: String {
    case production = "production"
    case development = "development"
}

func env() -> Environment {
    // TestFLight, Xcode
    if Bundle.main.appStoreReceiptURL?.lastPathComponent == "sandboxReceipt" {
        return .development
    }
    
    // Simulator
    #if targetEnvironment(simulator)
        return .development
    #else
        return .production
    #endif
}
Источник: ZetRider