如何检测Kotlin Multiplatform iOS应用是否运行在模拟器上?
在KMM中判断应用是否运行在模拟器的实现方案
由于Kotlin没有宏定义机制,KMM中需要通过expect/actual跨平台抽象结合各平台的原生判断逻辑来实现类似Swift的模拟器检测功能,具体步骤如下:
1. 共享代码中声明抽象函数
在KMM共享模块的commonMain源码集里,定义一个expect函数作为跨平台统一接口:
expect fun isRunningOnSimulator(): Boolean
2. iOS平台实现实际判断逻辑
在iOS平台的iosMain源码集里,通过调用Swift原生判断逻辑实现actual函数:
首先在iOS的Swift代码中(比如iosApp模块的辅助类)编写模拟器检测方法:
import Foundation class PlatformHelper { static func isRunningOnSimulator() -> Bool { #if targetEnvironment(simulator) return true #else return false #endif } }
然后在Kotlin的iosMain中实现actual函数:
actual fun isRunningOnSimulator(): Boolean { return PlatformHelper.isRunningOnSimulator() }
3. Android平台实现实际判断逻辑
在Android平台的androidMain源码集里,通过Android系统Build类的特征判断模拟器:
import android.os.Build actual fun isRunningOnSimulator(): Boolean { return Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown") || Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK built for x86") || Build.MANUFACTURER.contains("Genymotion") || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) || "google_sdk" == Build.PRODUCT }
4. 在共享代码中统一调用
完成上述实现后,即可在KMM共享代码中直接使用该函数进行分支处理,效果等同于Swift的宏判断:
if (isRunningOnSimulator()) { // 模拟器环境执行逻辑(对应Swift中的foo) } else { // 真机环境执行逻辑(对应Swift中的bar) }
内容的提问来源于stack exchange,提问作者Anton V
相关产品推荐
相关产品推荐

