KMM重构JetBrains Compose:iOS端接收传入链接与默认设置问题
KMM JetBrains Compose iOS端链接处理解决方案
一、iOS端接收传入链接(替代Android的appLinkData)
iOS没有直接对应Android appLinkData的API,需通过原生系统回调捕获链接后传递到共享Kotlin层:
- 在iOS的
SceneDelegate或AppDelegate中实现系统链接回调方法,拿到URL后调用共享代码的处理逻辑。 - 共享层定义链接处理单例,接收iOS端传递的URL并分发到Compose UI中。
代码示例:
- 共享Kotlin代码:
object LinkHandler { private var linkCallback: ((String) -> Unit)? = null fun registerCallback(callback: (String) -> Unit) { linkCallback = callback } fun handleIncomingLink(url: String) { linkCallback?.invoke(url) } }
- 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) } }
- 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
相关产品推荐
相关产品推荐

