如何在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
相关产品推荐
相关产品推荐

