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

如何在Compose Multiplatform(Android、iOS)中打开Google Maps等外部应用

在Jetpack Compose Multiplatform中跨Android/iOS打开Google Maps

1. 处理平台特定代码的正确方式

Jetpack Compose Multiplatform官方推荐用expect/actual机制处理这类平台差异逻辑。核心思路是在通用(common)模块定义一个抽象的功能接口/函数,然后在Android和iOS各自的平台模块中实现具体的原生逻辑,通用代码里就能统一调用,不用关心底层平台差异。

2. 是否有统一库?

目前没有专门的Compose Multiplatform库封装这个功能——打开外部应用属于平台原生能力,系统间实现逻辑差异较大,因此还是需要通过expect/actual分别编写平台特定代码。

示例代码

第一步:在Common模块定义期望函数

在commonMain的源码中创建工具类,定义expect函数:

// commonMain/kotlin/com/yourpackage/MapUtils.kt
expect object MapUtils {
    fun openGoogleMaps(latitude: Double, longitude: Double)
}

第二步:Android平台实现(actual)

在androidMain中用Intent实现跳转逻辑,同时做兼容性检查避免崩溃:

// androidMain/kotlin/com/yourpackage/MapUtils.kt
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.compose.ui.platform.LocalContext

actual object MapUtils {
    actual fun openGoogleMaps(latitude: Double, longitude: Double) {
        val context = LocalContext.current
        // 构造Google Maps的geo协议URI
        val uri = Uri.parse("geo:$latitude,$longitude?q=$latitude,$longitude")
        val intent = Intent(Intent.ACTION_VIEW, uri).apply {
            // 指定优先打开Google Maps应用
            setPackage("com.google.android.apps.maps")
        }
        // 检查是否有应用能处理该Intent
        if (intent.resolveActivity(context.packageManager) != null) {
            context.startActivity(intent)
        } else {
            // 无Google Maps时跳转网页版
            val webUri = Uri.parse("https://www.google.com/maps?q=$latitude,$longitude")
            context.startActivity(Intent(Intent.ACTION_VIEW, webUri))
        }
    }
}

第三步:iOS平台实现(actual)

在iosMain中用UIApplication处理URL跳转,注意需要配置Info.plist权限:

// iosMain/kotlin/com/yourpackage/MapUtils.kt
import platform.UIKit.UIApplication
import platform.Foundation.NSURL

actual object MapUtils {
    actual fun openGoogleMaps(latitude: Double, longitude: Double) {
        // 构造Google Maps的APP Scheme链接
        val mapsUrl = NSURL.URLWithString("comgooglemaps://?q=$latitude,$longitude")
        val application = UIApplication.sharedApplication()
        if (application.canOpenURL(mapsUrl)) {
            application.openURL(mapsUrl)
        } else {
            // 未安装Google Maps时跳转网页版
            val webUrl = NSURL.URLWithString("https://www.google.com/maps?q=$latitude,$longitude")
            application.openURL(webUrl)
        }
    }
}

第四步:在Compose UI中调用

在通用Compose代码里直接调用工具类函数即可:

// commonMain/kotlin/com/yourpackage/MapScreen.kt
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable

@Composable
fun MapScreen() {
    Column {
        Button(onClick = {
            // 传入目标经纬度,示例为北京天安门坐标
            MapUtils.openGoogleMaps(39.9042, 116.4074)
        }) {
            Text(text = "打开Google Maps")
        }
    }
}

iOS额外配置

需要在iOS项目的Info.plist中添加以下配置,允许应用查询Google Maps的Scheme:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>comgooglemaps</string>
</array>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:45:00