You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM重构JetBrains Compose:iOS端接收传入链接与默认设置问题

KMM JetBrains Compose iOS端链接处理解决方案

一、iOS端接收传入链接(替代Android的appLinkData)

iOS没有直接对应Android appLinkData的API,需通过原生系统回调捕获链接后传递到共享Kotlin层:

  • 在iOS的SceneDelegate或AppDelegate中实现系统链接回调方法,拿到URL后调用共享代码的处理逻辑。
  • 共享层定义链接处理单例,接收iOS端传递的URL并分发到Compose UI中。

代码示例:

  1. 共享Kotlin代码:
object LinkHandler {
    private var linkCallback: ((String) -> Unit)? = null

    fun registerCallback(callback: (String) -> Unit) {
        linkCallback = callback
    }

    fun handleIncomingLink(url: String) {
        linkCallback?.invoke(url)
    }
}
  1. iOS端Swift代码(SceneDelegate):
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    URLContexts.forEach { context in
        guard let urlString = context.url.absoluteString else { return }
        LinkHandler.shared.handleIncomingLink(url: urlString)
    }
}
  1. Compose iOS入口处理链接:
fun MainViewController() = ComposeUIViewController {
    LinkHandler.registerCallback { url ->
        // 在这里处理链接,比如触发导航逻辑
        println("Received link: $url")
    }
    MyComposeApp()
}

二、iOS端默认设置链接

根据需求分两种场景实现:

1. 启动时传入固定默认链接

在iOS端场景初始化回调中主动调用共享层的链接处理方法:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // 固定默认链接
    let defaultUrl = "https://your-app-default-link.com"
    LinkHandler.shared.handleIncomingLink(url: defaultUrl)
    // 其他初始化逻辑
}

2. 用户可配置的默认链接

通过expect/actual实现跨平台存储,在Compose UI中提供设置界面,启动时读取并生效:

  • 共享Kotlin代码:
expect class AppPreferences {
    fun saveDefaultLink(url: String)
    fun getDefaultLink(): String?
}
  • iOS端actual实现:
actual class AppPreferences {
    private val defaults = NSUserDefaults.standardUserDefaults

    actual fun saveDefaultLink(url: String) {
        defaults.setObject(url, forKey: "app_default_link")
    }

    actual fun getDefaultLink(): String? {
        return defaults.stringForKey("app_default_link")
    }
}
  • Compose启动时读取:
fun MainViewController() = ComposeUIViewController {
    val preferences = AppPreferences()
    preferences.getDefaultLink()?.let { url ->
        LinkHandler.handleIncomingLink(url)
    }
    MyComposeApp()
}

内容的提问来源于stack exchange,提问作者Lucker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:05:25