react-native 使用百度地图

声明:本文使用的是作者未更新之前的低版本,不是最新的版本(看仔细在配置)

低版本号为:"react-native-baidu-map": "^0.6.0" ,前往1.0.6版

在 Xcode 9.4上运行,10.1运行编译有问题

GitHub:https://github.com/lovebing/react-native-baidu-map


先到百度地图创建应用:

react-native 使用百度地图_第1张图片

申请开发版SHA1:

打开终端,输入命令:cd .android,回车继续输入以下命令

keytool -list -v -keystore debug.keystore  

口令默认为 android

 

react-native 使用百度地图_第2张图片

得到开发版 SHA1

 

发布版 SHA1:以 Android Stutio 为例(Keytool生成看最下面):

打开 build => Generate Signed APK

react-native 使用百度地图_第3张图片

选择新建:

react-native 使用百度地图_第4张图片

 

一路 next  最后 finish,在项目 android/app 下生成一个 .keystore 文件

react-native 使用百度地图_第5张图片

继续在命令行中输入 

keytool -list -v -keystore   apk的keystore(文件路径)

接下来输入刚才的密码:

得到发布版 SHA1:

react-native 使用百度地图_第6张图片

 

Keytool -genkey -alias my-release-keystore.keystore -keyalg RSA -validity 20000 -keystore my-release-keystore.keystore

keytool工具是Java JDK自带的证书工具
-genkey参数表示:要生成一个证书(版权、身份识别的安全证书)
-alias参数表示:证书有别名,-alias fantongyo.keystore表示证书别名为:my-release-keystore
-keyalg RSA表示加密类型,RSA表示需要加密,以防止别人盗取
-validity 20000表示有效时间20000天
-keystore my-release-keystore.keystore表示要生成的证书名称为my-release-keystore

--------------------------------------------------------------------------------------------

输入命令:Keytool -genkey -alias my-release-keystore.keystore -keyalg RSA -validity 20000 -keystore my-release-keystore.keystore,到最后提示keytool 错误: java.io.FileNotFoundException: MyAndroidKey.keystore (Permission denied).

原因:缺少权限

方法一更改保存目录:就是讲jdk从c盘挪到其它盘。

方法二更改权限:以管理员身份运行CMD,MAC 下添加 sudo 

sudo Keytool -genkey -alias my-release-keystore.keystore -keyalg RSA -validity 20000 -keystore my-release-keystore.keystore

 

安装 npm i react-native-baidu-map --save

android配置:

在项目的 android/settings.gradle目录 下添加:

include ':react-native-baidu-map'
project(':react-native-baidu-map').projectDir = new File(settingsDir, '../node_modules/react-native-baidu-map/android')

 在android/app/build.gradle 中添加

    signingConfigs {
        release {
            storeFile file(MYAPP_RELEASE_STORE_FILE)
            storePassword MYAPP_RELEASE_STORE_PASSWORD
            keyAlias MYAPP_RELEASE_KEY_ALIAS
            keyPassword MYAPP_RELEASE_KEY_PASSWORD
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
    dependencies {
      implementation project(':react-native-baidu-map') // 添加的一行
      ...
    } 

在gradle.properties中添加

MYAPP_RELEASE_STORE_FILE=my-release-keystore.keystore
MYAPP_RELEASE_KEY_ALIAS=my-release-keystore.keystore (和自己之前起的文件名要一致)
MYAPP_RELEASE_STORE_PASSWORD=****** (自己设置的密码)
MYAPP_RELEASE_KEY_PASSWORD=******

在android/app/src/main/AndroidManifest.xml 中添加

    
    
    
    
    
    
    
    
    
    
    
    
    
    

 // 申请到的baidu地图app key 
  ...
  

MainApplication.java 中添加:

    import org.lovebing.reactnative.baidumap.BaiduMapPackage; //添加

    protected List getPackages() {
      return Arrays.asList(
          new MainReactPackage(),
              new BaiduMapPackage(getApplicationContext()) //add this
      );
    }

在node_modules/react-native-baidu-map中修改 MapView.js

修改前:
import React, {
  Component,
  PropTypes
} from 'react';

修改后:
import React, {
  Component,
} from 'react';
import PropTypes from 'prop-types'

在node_modules/react-native-baidu-map/android 下修改 BaiduMapPackage.java

删除或注释第 49 行的:@Override

 

ios 配置:

1、Project navigator->Libraries->Add Files to 选择 react-native-baidu-map/ios/RCTBaiduMap.xcodeproj

react-native 使用百度地图_第7张图片

2、Project navigator->Build Phases->Link Binary With Libraries 加入 libRCTBaiduMap.a

react-native 使用百度地图_第8张图片

继续添加依赖,点击 Add Other:

react-native 使用百度地图_第9张图片

 

3、Project navigator->Build Settings->Search Paths,

Framework search paths 添加 $(SRCROOT)/../node_modules/react-native-baidu-map/ios/lib,

Header search paths 添加 $(SRCROOT)/../node_modules/react-native-baidu-map/ios/RCTBaiduMap

(也可以在node_modules文件下将对应文件直接拖进去,感谢@_摩西_的提醒)

react-native 使用百度地图_第10张图片

4、添加依赖, react-native-baidu-map/ios/lib 下的全部 framwordk, CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework、libsqlite3.0.tbd(xcode7以前为 libsqlite3.0.dylib)、CoreTelephony.framework 、libstdc++.6.0.9.tbd(xcode7以前为libstdc++.6.0.9.dylib)

添加方法同第二步,

5、添加 BaiduMapAPI_Map.framework/Resources/mapapi.bundle

将node_modules/react-native-baidu-map/ios/lib/BaiduMapAPI_Map.framework/Resources/mapapi.bundle拖进xcode与项目同名的文件夹下

react-native 使用百度地图_第11张图片

6、AppDelegate.m init 初始化

#import "RCTBaiduMapViewManager.h"

//百度地图

  [RCTBaiduMapViewManager initSDK:@"api key"];

 

1、error: Redefinition of ‘RCTMethodInfo’ :

react-native 使用百度地图_第12张图片

2、error: 'RCTViewManager.h' file not found

react-native 使用百度地图_第13张图片

 

js代码:

import React, { Component } from 'react';

import {
    StyleSheet,
    Text,
    View,
    ScrollView,
    Platform,
} from 'react-native';

import { MapView,MapTypes,Geolocation} from 'react-native-baidu-map';

import Dimensions from 'Dimensions';
const { width,height } = Dimensions.get('window');

export default class BaiduMapDemo extends Component {
    constructor() {
        super();
        this.state = {
            zoomControlsVisible: true,
            trafficEnabled: false,
            baiduHeatMapEnabled: false,
            mapType: MapTypes.NORMAL,
            zoom: 15,
            center: {
                longitude: 113.896198,
                latitude: 22.959144,
            },
            markers: [
                {
                    longitude: 113.896198,
                    latitude: 22.959144,
                    title: 'title',
                }
            ],
            clickMessage: '',
            poiMessage: '',
        };
    }

    componentDidMount() {
        
    }

  render() {
        return (
            
                 { //地图加载事件
                        Geolocation.getCurrentPosition()
                            .then(data => {
                                console.log(data)
                                // this.setState({
                                //     center: {
                                //         longitude: data.longitude,
                                //         latitude: data.latitude
                                //     },
                                //     markers: [{
                                //         longitude: data.longitude,
                                //         latitude: data.latitude,
                                //         title: data.district + data.street
                                //     }]
                                // })
                            })
                            .catch(e =>{
                                console.warn(e, 'error');
                            })
                    }}
                    
                    onMarkerClick={(e) => { //标记点点击事件
                        console.log(e)
                    }}
                    onMapClick={(e) => { //地图空白区域点击事件,返回经纬度
                        let title = '';
                        Geolocation.reverseGeoCode(e.latitude,e.longitude)
                            .then(res => {
                                console.log(res)
                                Platform.OS == 'ios' ? 
                                    title = res.district + res.streetName
                                :
                                    title = res.district + res.street;
                                this.setState({
                                    center: {
                                        longitude: e.longitude,
                                        latitude: e.latitude,
                                    },
                                    markers: [{
                                        longitude: e.longitude,
                                        latitude: e.latitude,
                                        title: title,
                                    }],
                                    clickMessage: JSON.stringify(res)
                                })
                            })
                            .catch(err => {
                                console.log(err)
                            })
                        
                    }}
                    onMapPoiClick={(e) => { //地图已有点点击
                        Geolocation.reverseGeoCode(e.latitude,e.longitude)
                            .then(res => {
                                res = JSON.stringify(res)
                                this.setState({
                                    center: {
                                        longitude: e.longitude,
                                        latitude: e.latitude,
                                    },
                                    markers: [{
                                        longitude: e.longitude,
                                        latitude: e.latitude,
                                        title: e.name,
                                    }],
                                    poiMessage: res
                                })
                            })
                            .catch(err => {
                                console.log(err)
                            })
                    }}
                    style={styles.map}
                >
                

                
                    地图缩放控件状态: 
                    {this.state.zoomControlsVisible ? 
                         this.setState({zoomControlsVisible:false})}>显示
                        :
                         this.setState({zoomControlsVisible:true})}>关闭
                    }
                
                
                    交通线状态: 
                    {this.state.trafficEnabled ? 
                         this.setState({trafficEnabled:false})}>显示
                        :
                         this.setState({trafficEnabled:true})}>关闭
                    }
                
                
                    热力图状态: 
                    {this.state.baiduHeatMapEnabled ? 
                         this.setState({baiduHeatMapEnabled:false})}>显示
                        :
                         this.setState({baiduHeatMapEnabled:true})}>关闭
                    }
                
                
                    地图模式状态: 
                    {this.state.mapType == MapTypes.NORMAL ? 
                         this.setState({mapType:MapTypes.SATELLITE})}>普通
                        :
                         this.setState({mapType:MapTypes.NORMAL})}>卫星
                    }
                
                
                    地图空白区域点击信息: 
                
                
                    {this.state.clickMessage}
                
                
                    地图已有点点击信息: 
                
                
                    {this.state.poiMessage}
                
                
                     {
                        Geolocation.getCurrentPosition()
                            .then(data => {
                                console.log(data)
                                this.setState({
                                    center: {
                                        longitude: data.longitude,
                                        latitude: data.latitude
                                    },
                                    markers: [{
                                        longitude: data.longitude,
                                        latitude: data.latitude,
                                        title: data.district + data.street
                                    }]
                                })
                            })
                            .catch(e =>{
                                console.warn(e, 'error');
                            })
                    }}>当前位置
                
            
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#F5FCFF',
    },
    map: {
        width: width,
        height: height - 300,
        marginBottom: 5,
    },
    list: {
        flexDirection: 'row',
        paddingLeft: 10,
        marginBottom: 5,
    }
});

 

ios效果图:

react-native 使用百度地图_第14张图片

android效果图:

react-native 使用百度地图_第15张图片

 

 

你可能感兴趣的:(react,native)