![](/img/trans.png)
[英]React-Native-Maps: Map is empty. Only shows Google logo and Marker
[英]React-native-maps Blank page Only google logo
我一直在尝试为 react-native 安装谷歌地图一个星期,但仍然没有成功。 我已经搜索并尝试了 react-native-maps github 问题中的解决方案,但我仍然得到一个空白页面。
我所做的:
react-native init myapp
npm install
yarn add react-native-maps
react-native link react-native-maps
在谷歌控制台 APIs -> 创建新项目 -> 启用谷歌地图 Android API,谷歌地图 JavaScript API 和地点 API -> 创建凭证
在 AndroidManifest.xml
<application>
....
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="XXX"/>
</application>
package.json
{
"name": "maps",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"test": "jest"
},
"dependencies": {
"react": "16.0.0",
"react-native": "0.50.4",
"react-native-maps": "^0.18.3"
},
"devDependencies": {
"babel-jest": "21.2.0",
"babel-preset-react-native": "4.0.0",
"jest": "21.2.1",
"react-test-renderer": "16.0.0"
},
"jest": {
"preset": "react-native"
}
}
应用程序.js
import React, { Component } from 'react';
import {
StyleSheet,
Text,
View
} from 'react-native';
import MapView from 'react-native-maps'
export default class App extends Component {
render() {
return (
<View style={styles.container}>
<MapView
style={styles.map}
region={{
latitude: 37.78825,
longitude: -122.4324,
latitudeDelta: 0.015,
longitudeDelta: 0.0121,
}}
>
</MapView>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
...StyleSheet.absoluteFillObject,
alignItems: 'center',
},
map: {
...StyleSheet.absoluteFillObject,
},
});
编辑:因为有些人问我堆栈跟踪:示例 1
您能否提供一些堆栈跟踪,以便我们可以更好地了解您的问题? 您的问题描述听起来像是您的手机未连接到互联网,这就是未呈现地图的原因。
无论如何,这里有一些技巧可以根据我过去的经验来运行react-native-maps
。
react-native-maps
是否与您的react-native
版本兼容。latlong
对象注入initialRegion
道具,以便地图知道要关注的位置。给那些拥有带有Google 徽标的空白地图视图的朋友的建议。 我花了一整天的时间来解决这个问题。 最后我意识到,地图实际上可以工作,但在第一次运行时完全缩放。 我以为它是空白页,但实际上它是空白区域 :) 仅供参考
确保您在 Google Console 中启用 API 密钥以与Maps SDK for Android
,如果您想为 iOS 启用Maps SDK for iOS
我花了一整天尝试谷歌提供的解决方案,但似乎遗留元数据对我不起作用,所以我在AndroidManifest.xml
更改了下面的行
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="Your Google maps API Key Here"/>
到
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="Your Google maps API Key Here"/>
最后地图出现了。
当然Maps SDK for Android
必须在Google Api Console 中启用。 以下是为初学者启用Maps SDK for Android
的步骤:
在屏幕的左上角,就在Google Apis
徽标的右侧,您会看到您的项目名称,选择正确的项目名称,然后在项目名称下方,您会看到一个蓝色文本+ ENABLE APIS AND SERVICES
。 点击它。
在打开的网页中,向下滚动以找到Maps SDK for Android
。 单击以启用它。
我一直在努力应对 Android 和 iOS 平台的本机地图。
在 Android 上有 Google API 版本。 我尝试使用 Google API 27 不起作用,但 API 26 很好。
我在以下位置找到的提示: https : //github.com/react-community/react-native-maps/issues/1877#issuecomment-353261669
在 iOS 上是包版本:当我使用 CRNA 创建应用程序时,安装了 react-native@0.52.0 并且与 react-native-maps@0.20.1 不兼容所以我将 react-native 更改为版本 0.53.0 并且解决了在构建时应用程序崩溃并出现错误的问题:条目,“:CFBundleIdentifier”,不存在。
为我工作。 可能它也适合你。
1) 移除 containerStyle 和 View。 使用下面的代码
mapStyle: {
height: 400,
top: 0,
left: 0,
right: 0,
bottom: 0,
},
2) mapView 代码替换为
<MapView
provider={PROVIDER_GOOGLE} // remove if not using Google Maps
style={mapStyle}
zoomEnabled={true}
region={{
latitude: 22.258,
longitude: 71.19,
latitudeDelta: 0.0922,
longitudeDelta: 0.0421,
}}
>
<Marker
coordinate={{ latitude: 22.258, longitude: 71.19 }}
title={"title"}
description={"test"}
icon={image}
/>
</MapView>
经过一周的搜索和环顾,我通过从 android 项目目录生成 SHA1 指纹解决了这个问题
keytool -list -v -keystore /Users/username/ProjecFolder/android/app/debug.keystore -alias androiddebugkey -storepass android -keypass android
代替
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
我遇到了同样的问题。最后,我在将 minsdkVersion 设置为 18 之后得到了它,之前是 19。 这对我有用。
我花了几天时间才弄明白这一点。 就我而言(Expo 项目),它缺少SHA-1 证书指纹,即 Play Console 中的指纹。 我在那里只有世博会。
TL; 博士
根据部署到播放商店部分的文档,我不得不添加另一个 SHA-1 证书指纹。 不仅来自expo fetch:android:hashes
命令输出的,还有来自Google Play Console -> Your App -> Release management -> App signature 的。
所以现在我的记录中有两条记录: GCP 凭据-> 我的Maps SDK for Android API 密钥 -> 将使用限制到您的 Android 应用程序部分,两者都带有我的应用程序包名称。
我一直在尝试所有可能的解决方案,就我而言,应用程序在 Expo 中,问题在于 API KEY 的配置。
解决方案
在 Google Play Console 中的 API Key 配置中,包括两个约束:
一个包含使用expo fetch: android: hashes
生成的指纹expo fetch: android: hashes
另一个包含使用keytool -list -v -keystore "% USERPROFILE% \\. Android \\ debug.keystore "-alias androiddebugkey -storepass android -keypass android
生成的指纹
两个限制具有相同的包名很重要
我遇到了同样的问题。 但我在任何地方都找不到正确的解决方案。
我在弹出 form expo 后遇到了这个问题。
我的问题与地图键有关。 我在android studio的日志中清楚地发现了这一点。 然后我从 Google 的凭据管理中删除所有限制。 (将应用程序限制设置为无)
如果你看到此时可以看到地图,50% 就完成了。
就我而言,这是“包名称和 SHA-1 签名证书”的问题,我运行了默认的,即
"keytool -list -v -keystore "%USERPROFILE%.android\\debug.keystore" -alias androiddebugkey -storepass android -keypass android"
我为其他项目获得的结果(我认为)然后我转到项目目录(项目 root\\android\\app)中的 app 文件夹,在那里我看到了“debug.keystore”文件。 然后我跑了这个
keytool -list -v -keystore "debug.keystore" -alias androiddebugkey -storepass android -keypass android
我得到了不同的结果。 我将它应用于限制,它对我有用。
我认为这可能对某些人有所帮助。
Go 到您的
Android
iOS
经过一番研究,发现这段代码对我有用。 我注意到不同之处在于创建了一个useRef()
object 并将其添加为依赖项。 我也将initialRegion
更改为region
:
import React, {useState, useEffect, useRef} from 'react';
import {StyleSheet, Text} from 'react-native';
import MapView, {Marker, PROVIDER_GOOGLE} from 'react-native-maps';
import Geolocation from 'react-native-geolocation-service';
const GeoScreen = () => {
const [newPosition, setNewPosition] = useState({
latitude: 37.12,
longitude: -122.1,
latitudeDelta: 0.0421,
longitudeDelta: 0.0421,
});
const mapRef = useRef();
useEffect(() => {
Geolocation.getCurrentPosition(pos => {
const coord = pos.coords;
console.log({coord: coord});
setNewPosition({
latitude: coord.latitude,
longitude: coord.longitude,
latitudeDelta: 0.1421,
longitudeDelta: 0.1421,
});
});
}, [mapRef]);
console.log({newPosition: newPosition});
return (
<MapView
ref={mapRef}
provider={PROVIDER_GOOGLE}
style={styles.map}
region={newPosition}
showsUserLocation={true}
showsMyLocationButton={true}
>
<Marker
title="Your title"
coordinate={newPosition}
/>
</MapView>
);
};
const styles = StyleSheet.create({
map: {
...StyleSheet.absoluteFillObject,
},
});
export default GeoScreen;
✅ 我的疏忽错误是我在没有替换占位符 API 键的情况下复制粘贴代码。 来自官方文档: https://github.com/react-native-maps/react-native-maps/blob/master/docs/installation.md
1. npm i react-native-maps
2.重要提示:不要忘记在 Google 云平台上为Android启用Map SDK,为 iOS启用 Map SDK
3.将API 密钥添加到清单文件 ( android/app/src/main/AndroidManifest.xml ):
<application>
<!-- You will only need to add this meta-data tag, but make sure it's a child of application -->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="Your Google maps API Key Here"/> // ***HERE I NEED TO REPLACE MY KEY AND I FORGET
</application>
4.这是快速片段代码,使其可见
import MapView, { PROVIDER_GOOGLE, Marker } from 'react-native-maps'; // remove PROVIDER_GOOGLE import if not using Google Maps
<MapView
provider={PROVIDER_GOOGLE} // remove if not using Google Maps
style={{
height: 400,
top: 0,
left: 0,
right: 0,
bottom: 0,
}}
zoomEnabled={true}
region={{
latitude: 22.258,
longitude: 71.19,
latitudeDelta: 0.0922,
longitudeDelta: 0.0421,
}}
>
<Marker
coordinate={{ latitude: 22.258, longitude: 71.19 }}
title={"title"}
description={"test"}
/>
</MapView>
让我知道这是否有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.