В Swift есть специальный механизм проверки доступности API на разных версиях ОС:
if #available(iOS 17.4, *) {
newAPI()
} else {
legacyAPI()
}
Это позволяет выполнять код только на определённых версиях ОС, где нужный API гарантированно существует.
Но, к сожалению, такого механизма нет в Kotlin Native при работе над KMP-проектами. И если мы хотим реализовать данную возможность только в Kotlin-коде, то придётся искать обходное решение.
В первую очередь понадобится метод для определения версии iOS:
internal fun isIosVersionAtLeast(major: Int, minor: Int = 0, patch: Int = 0): Boolean {
val target = cValue<NSOperatingSystemVersion> {
majorVersion = major.toLong()
minorVersion = minor.toLong()
patchVersion = patch.toLong()
}
return NSProcessInfo.processInfo.isOperatingSystemAtLeastVersion(target)
}
Однако само по себе это не поможет. Приложение всё равно будет крашиться при запуске на старых версиях ОС, если во фреймворке есть символы несуществующего класса.
Поэтому придётся добавить в настройки сборки shared-фреймворка специальный флаг линковки, который будет подключать указанный системный фреймворк только в том случае, если он доступен:
it.binaries.framework {
linkerOpts.addAll(listOf("-weak_framework", "AuthenticationServices"))
}
Однако если обратиться к несуществующему классу, то приложение всё равно упадет в рантайме. Поэтому для дополнительной безопасности можно также проверять наличие класса через
NSClassFromString("ClassName").