react-native-baidu-map iOS端集成

作者: 冷洪林 | 来源:发表于2017-03-22 10:26 被阅读5555次

    最近有很多网友在问RN上怎么集成百度地图,我在之前两个项目中都有使用到react-native-baidu-map,觉得其中的步骤稍微有点复杂,如果哪一步有点疏漏,就很容易报错,接下来我就从零新建一个项目,一步一步记录下我安装的过程,希望能帮助到大家~


    成都React-Native交流群,进群给管理,先到先得哦


    react-native-baidu-map github地址


    1.新建一个RN项目:(BaiDuMapTest)


    图片.png

    出现以下界面,就表示新建项目成功了

    图片.png

    2.安装react-native-baidu-map(注意:一定要在项目根目录下进行安装):


    在终端输入:
    npm install react-native-baidu-map --save

    图片.png

    3.Xcode配置:


    图片.png 图片.png

    Build Phases->Link Binary With Libraries 加入 libRCTBaiduMap.a

    图片.png

    Build Settings->Search Paths, Framework search paths 添加$(PROJECT_DIR)/../node_modules/react-native-baidu-map/ios/lib,Header search paths 添加 $(SRCROOT)/../node_modules/react-native-baidu-map/ios/RCTBaiduMap

    图片.png 图片.png

    添加依赖, react-native-baidu-map/ios/lib 下的全部 framwordk:

    图片.png

    方法:

    图片.png 图片.png 图片.png 图片.png

    然后继续添加: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)
    例如:

    图片.png

    全部添加完后:

    图片.png

    接下来添加 BaiduMapAPI_Map.framework/Resources/mapapi.bundle

    图片.png 图片.png 图片.png

    4.AppDelegate.m init 初始化


    #import "RCTBaiduMapViewManager.h"
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        ...
        [RCTBaiduMapViewManager initSDK:@"api key"];//这里的api key 一定要在官网和APP的Bundle identifier对应,否则地图会显示失败
        ...
    }
    
    图片.png

    5.build一下,看看是否配置成功


    此时可能会报这个错误:

    图片.png

    解决办法:

    #import "RCTViewManager.h"
    #import "RCTConvert+CoreLocation.h"
    

    改成

    #import <React/RCTViewManager.h>
    #import <React/RCTConvert+CoreLocation.h>
    

    如图:

    图片.png

    然后就build success啦~

    6.到此为止,配置已经完成,我们可以在RN来玩一玩百度地图~


    这里我们就参照官网的Demo给大家展示一下:

    index.ios.js:

    /**
     * Sample React Native App
     * https://github.com/facebook/react-native
     * @flow
     */
    
    import React, { Component } from 'react';
    import {
      AppRegistry,
      StyleSheet,
      Text,
      View
    } from 'react-native';
    
    import BaiduMapDemo from './BaiduMapDemo';
    
    export default class BaiDuMapTest extends Component {
      render() {
        return (
          <BaiduMapDemo />
        );
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
      },
      welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
      },
      instructions: {
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
      },
    });
    
    AppRegistry.registerComponent('BaiDuMapTest', () => BaiDuMapTest);
    
    

    BaiduMapDemo.js

    /**
     * @author lovebing
     */
    
    import React, {
      Component,
      PropTypes
    } from 'react';
    
    import {
      MapView,
      MapTypes,
      Geolocation
    } from 'react-native-baidu-map';
    
    import {
      Button,
      AppRegistry,
      StyleSheet,
      Text,
      View,
      TouchableHighlight
    } from 'react-native';
    
    import Dimensions from 'Dimensions';
    
    export default class BaiduMapDemo extends Component {
    
      constructor() {
        super();
    
        this.state = {
          mayType: MapTypes.NORMAL,
          zoom: 15,
          center: {
            longitude: 113.981718,
            latitude: 22.542449
          },
          trafficEnabled: false,
          baiduHeatMapEnabled: false,
          markers: [{
            longitude: 113.981718,
            latitude: 22.542449,
            title: "Window of the world"
          },{
            longitude: 113.995516,
            latitude: 22.537642,
            title: ""
          }]
        };
      }
    
      componentDidMount() {
      }
    
      render() {
        return (
          <View style={styles.container}>
            <MapView 
              trafficEnabled={this.state.trafficEnabled}
              baiduHeatMapEnabled={this.state.baiduHeatMapEnabled}
              zoom={this.state.zoom}
              mapType={this.state.mapType}
              center={this.state.center}
              marker={this.state.marker}
              markers={this.state.markers}
              style={styles.map}
              onMarkerClick={(e) => {
                console.warn(JSON.stringify(e));
              }}
              onMapClick={(e) => {
              }}
            >
            </MapView>
    
            <View style={styles.row}>
              <Button title="Normal" onPress={() => {
                this.setState({
                  mapType: MapTypes.NORMAL
                });
              }} />
              <Button style={styles.btn} title="Satellite" onPress={() => {
                this.setState({
                  mapType: MapTypes.SATELLITE
                });
              }} />
    
              <Button style={styles.btn} title="Locate" onPress={() => {
                console.warn('center', this.state.center);
                Geolocation.getCurrentPosition()
                  .then(data => {
                    console.warn(JSON.stringify(data));
                    this.setState({
                      zoom: 15,
                      marker: {
                        latitude: data.latitude,
                        longitude: data.longitude,
                        title: 'Your location'
                      },
                      center: {
                        latitude: data.latitude,
                        longitude: data.longitude,
                        rand: Math.random()
                      }
                    });
                  })
                  .catch(e =>{
                    console.warn(e, 'error');
                  })
              }} />
            </View>
    
            <View style={styles.row}>
              <Button title="Zoom+" onPress={() => {
                this.setState({
                  zoom: this.state.zoom + 1
                });
              }} />
              <Button title="Zoom-" onPress={() => {
                if(this.state.zoom > 0) {
                  this.setState({
                    zoom: this.state.zoom - 1
                  });
                }
                
              }} />
            </View>
    
            <View style={styles.row}>
              <Button title="Traffic" onPress={() => {
                this.setState({
                  trafficEnabled: !this.state.trafficEnabled
                });
              }} />
    
              <Button title="Baidu HeatMap" onPress={() => {
                this.setState({
                  baiduHeatMapEnabled: !this.state.baiduHeatMapEnabled
                });
              }} />
            </View>
          </View>
        );
      }
    }
    
    const styles = StyleSheet.create({
      row: {
        flexDirection: 'row',
        height: 40
      },
      container: {
        flex: 1,
        justifyContent: 'flex-start',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
      },
      map: {
        width: Dimensions.get('window').width,
        height: Dimensions.get('window').height - 200,
        marginBottom: 16
      }
    });
    
    

    效果图:

    图片.png

    希望这篇文章能帮助到大家,谢谢~


    相关文章

      网友评论

      • 云深不知处a:将node_modules\react-native-baidu-map\js\MapView.js中的

        import React, {
        Component,
        PropTypes
        } from 'react';
        1
        2
        3
        4
        对PropTypes的引用修改为

        import PropTypes from 'prop-types'
      • 我的昵称好听吗:666666666666666666666666666666666666666666666666666666
      • 私小甲鱼:大大灰常感谢你, 集成了, :sparkling_heart: :sparkling_heart: :sparkling_heart: :sparkling_heart:
        冷洪林:@私小甲鱼 不用谢哈 这几个月太忙了,都没时间一一回复大家的问题,抱歉~
      • 墨_d48e:楼主 按照您的流程走了一遍,报 Redefinition of 'RCTMethodInfo'的错,配置流程应该没问题,请指教~("react-native": "0.52.0", "react-native-baidu-map": "^0.6.0")
        寒心恨雪:你这个问题 改了吗?怎么改的,我也遇到这个问题了
        寒心恨雪:@冷洪林 不使用低版本 这个bug怎么改啊,,求大神指导
        冷洪林:这个是RN升级后的bug,建议使用低版本RN
      • 天使爱打盹:楼主您好,我在android端都配置好之后,出现了地图黑屏的现象,也没有报错编译都通过了 ,有没有遇到过类似的问题
      • 唐_亮:楼主您好,写的真不错,我按照你的步骤下来,到追后就是要改
        #import <RCTViewManager.h>
        #import <RCTConvert+CoreLocation.h>,
        改完还是编译不过去,RCT--not found。
        环境:"dependencies": {
        "react": "16.0.0-alpha.6",
        "react-native": "0.44.3",
        "react-native-baidu-map": "^0.6.0",
        "react-native-pull": "^2.0.2",
        "react-native-swiper": "^1.5.12",
        "react-native-vector-icons": "^4.4.0",
        "react-navigation": "^1.0.0-beta.11"
        },
        c2a04b50c074:修改为#import <React/RCTViewManager.h>就行了
        类似的抱错之用在前边加上“React/”就行了
        唐_亮:@冷洪林 好的谢谢
        冷洪林:@唐_47bc 多配两次,步骤要正确哈
      • e0c9fcad7508:按步骤做,出现Redefinition of 'RCTMethodInfo',求如何解决
        Janine_:删除BaseModule.h里面的引用#import "RCTBridgeModule.h"
        Janine_:你解决了吗,我没看见哪里进行了重定义
        冷洪林:@Alex_CL 重定义了的,检查下那里配置重复了
      • DryMartini_ca04:感谢楼主分享@~
        冷洪林:@DryMartini_ca04 :smile:
      • Rocky_92d5:npm install react-native-baidu-map --save
        后,会清除react-native,需要重新执行一次npm install

        这两句改一下,就可以编译通过。
        #import "React/RCTViewManager.h"
        #import "React/RCTConvert+CoreLocation.h"

        但我运行后,只看到地图上的两个大头针,这是怎么回事?
        冷洪林:@Rocky_92d5 建议不要写成绝对路径,这样在其他电脑上又要重新设置路径
        Rocky_92d5:Framework search paths和Header search paths路径的写法有点不对,可以写成绝对路径。
        Rocky_92d5:申请key时,需要选择iOS SDK,就可以显示出来地图了。
      • no_0405:楼主,我的React-Native版本是0.46.1,报错Warning: Native component for "RCTBaiduMapView" does not exist该怎么调整路径呢,小白求指示。
        还有报RCTBundleURLProvider.h文件找不到的错误,该怎么去解决呢
        冷洪林:@no_0405 最新版本的引用路径很有可能又有变化 你按照提示改下路径即可
      • no_0405:Warning: Native component for "RCTBaiduMapView" does not exist
        楼主,我报这个错误,并且地图为空
        no_0405:楼主,我的React-Native版本是0.46.1,该怎么调整路径呢,小白求指示。
        还有报RCTBundleURLProvider.h文件找不到的错误,该怎么去解决呢
        冷洪林:@no_0405 React-Native不同的版本插件的路径会有所改变,你调整下路径就行了
      • 陈秀伊qq:成功了,感谢楼主啊,其他教程包括github上介绍的都很简陋,只有楼主这个最详细了
        冷洪林:@jjzxcjj123 :blush:
        jjzxcjj123:感谢楼主,搞了一天,最后在你的文章帮助下成功了。
        冷洪林:@陈秀伊qq 恩恩 搞定了就好,之前也是有朋友说网上找不到详细的,所以我就写了篇
      • dc0db66b3d58:我只需要调用他的API,也需要集成到项目里吗?现在没有集成到项目里,调用getCurrentPosition一直报错
        冷洪林:@kynethy 你要用百度的API,那是肯定要集成的
      • Vector_Wings:你好,请问marker的样式可以自定义吗?:smile:
        Vector_Wings:@冷洪林 好的,谢谢:smile:
        冷洪林:@Vector_Wings 目前还不行,蓝点显示也不行,建议参考百度地图API,然后在这个插件上二次开发~
      • 梦瑶_42c4:react-native-baidu-map 安装完后项目中 node_modles 中的react_native 里面就什么都没了
      • dispatch_async:这里有Android端集成的教程 顺便贴出来
        http://blog.csdn.net/sinat_17775997/article/details/68936837
        冷洪林:@梦瑶_42c4 米的RN是什么版本的?
        梦瑶_42c4:楼主,我报错的地方和你说的不是一个位置啊
        我是找不到它
        #import <RCTBundleURLProvider.h>
        冷洪林:@dispatch_async :+1:
      • dispatch_async:成功了 谢谢楼主 :blush:
      • 小郑507:按着指示做,一直出现Object is not a constructor(evaluating 'new Map()')错误,求如何解决。
        小郑507:@冷洪林 已解决,把根目录名字Map改为其他,但是地图出来是网格,api key申请了,在项目里面填进去了
        小郑507:@冷洪林 现在用的react-native 版本是0.44,文档里面没有MapView这个组件了,会不会是这个的影响。
        冷洪林:@小郑507 跟着步骤一般不会出问题的,仔细看看哪里配置错了

      本文标题:react-native-baidu-map iOS端集成

      本文链接:https://www.haomeiwen.com/subject/tdgnnttx.html