@capacitor/google-maps
Capacitor 上的 Google 地图
安装
npm install @capacitor/google-maps
npx cap sync
API 密钥
要在任何平台上使用 Google Maps SDK,需要关联已启用计费功能的账户的 API 密钥。这些密钥可以从 Google Cloud Console 获取。Android、iOS 和 Javascript 三个平台都需要此操作。关于获取这些 API 密钥的更多信息,可以在每个平台的 Google Maps 文档 中找到。
iOS
Google Maps SDK 支持通过 enableCurrentLocation(bool) 显示用户当前位置。为此,Apple 要求在 Info.plist 中指定隐私描述:
NSLocationWhenInUseUsageDescription(使用期间的定位权限描述)
请阅读 iOS 指南 中的 配置 Info.plist 章节,了解有关在 Xcode 中设置 iOS 权限的更多信息。
TypeScript 配置
你的项目还需要在 tsconfig.json 中将 skipLibCheck 设置为 true。
从旧版本迁移
主 Google Maps SDK 现在支持在 Apple Silicon Mac 的模拟器上运行,但请确保你已安装最新版本的 Google-Maps-iOS-Utils。
如果你之前添加了获取未发布版本的临时解决方案,现在可以通过从 ios/App/Podfile 中删除以下行来移除它:
pod 'Google-Maps-iOS-Utils', :git => 'https://github.com/googlemaps/google-maps-ios-utils.git', :commit => '637954e5bcb2a879c11a6f2cead153a6bad5339f'
然后在 ios/App/ 文件夹中运行 pod update Google-Maps-iOS-Utils:
cd ios/App
pod update Google-Maps-iOS-Utils
Android
Android 的 Google Maps SDK 要求你将 API 密钥添加到项目的 AndroidManifest.xml 文件中。
<meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_API_KEY_HERE"/>
要使用某些位置功能,SDK 还需要在 AndroidManifest.xml 中添加以下权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
变量
此插件将使用以下项目变量(定义在你的应用的 variables.gradle 文件中):
googleMapsPlayServicesVersion:com.google.android.gms:play-services-maps的版本(默认值:19.2.0)googleMapsUtilsVersion:com.google.maps.android:android-maps-utils的版本(默认值:3.19.1)googleMapsKtxVersion:com.google.maps.android:maps-ktx的版本(默认值:5.2.1)googleMapsUtilsKtxVersion:com.google.maps.android:maps-utils-ktx的版本(默认值:5.2.1)kotlinxCoroutinesVersion:org.jetbrains.kotlinx:kotlinx-coroutines-android和org.jetbrains.kotlinx:kotlinx-coroutines-core的版本(默认值:1.10.2)androidxCoreKTXVersion:androidx.core:core-ktx的版本(默认值:1.17.0)kotlin_version:org.jetbrains.kotlin:kotlin-stdlib的版本(默认值:2.2.20)
使用
Google Maps Capacitor 插件附带一个 Web 组件,必须在应用中用于渲染地图,因为它能更有效地在 iOS 上嵌入原生视图。插件会自动注册此 Web 组件供你的应用使用。
对于 Angular 用户,你会收到一个警告,提示此 Web 组件对 Angular 编译器是未知的。可以通过修改声明组件的模块以允许自定义 Web 组件来解决。
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
@NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
在 HTML 中包含此组件并为其分配一个 ID,以便稍后可以轻松查询该元素引用。
<capacitor-google-map id="map"></capacitor-google-map>
在 Android 上,地图在 WebView 下方渲染,并使用此组件在滚动事件期间管理其定位。这意味着作为开发者,你 必须 确保 WebView 在各层中都是透明的,直至最底层。在典型的 Ionic 应用中,这意味着在 IonContent 和根 HTML 标签等元素上设置透明度,以确保地图可见。如果在 Android 上看不到地图,这应该是你首先检查的地方。
在 iOS 上,我们直接将地图渲染到 WebView 中,因此不需要相同的透明效果。我们仍在研究 Android 的替代方法,希望在未来的更新中更好地解决这个问题。
Google Map 元素本身没有样式,因此你应该为其设置样式以适配页面布局。由于我们在此插槽中渲染视图,元素本身没有宽度或高度,请务必显式设置它们。
capacitor-google-map {
display: inline-block;
width: 275px;
height: 400px;
}
接下来,我们应该创建地图引用。这需要从 Capacitor 插件导入 GoogleMap 类并调用 create 方法,传入所需参数。
import { GoogleMap } from '@capacitor/google-maps';
const apiKey = 'YOUR_API_KEY_HERE';
const mapRef = document.getElementById('map');
const newMap = await GoogleMap.create({
id: 'my-map', // 此地图实例的唯一标识符
element: mapRef, // capacitor-google-map 元素的引用
apiKey: apiKey, // 你的 Google Maps API 密钥
config: {
center: {
// 地图渲染的初始位置
lat: 33.6,
lng: -117.9,
},
zoom: 8, // 地图渲染的初始缩放级别
},
});