Baidu Map Flutter Plugin [iOS]

目录

1. 获取AK

2. 写一些简单的启动、引导界面

3. 编辑Podfile

3.1 platform目标iOS系统版本

3.2 在target开头的行,do后面加几行

4. 安装SDK

5. 集成插件

6.1 添加权限

6.2 动态申请权限

7. 初始化SDK

8. 显示地图

9. 真机运行测试


1. 获取AK

在百度地图开放平台lbs.baidu.com,新建项目选iOS,填好信息,成功后有AK。注意填写过程中 Bundler ID需要在XCode配置开发者信息后查看,具体参考百度地图文档:

iOS地图SDK | 百度地图API SDK

2. 写一些简单的启动、引导界面

确保正常项目运行。直到写地图界面

3. 编辑Podfile

不知道pod有没有必要,没有一路顺风,但是试过。

选择项目ios目录下的Podfile,

3.1 platform目标iOS系统版本

3.2 地图SDK

在target开头的行,do后面加几行(pod install提示版本号后改的最新版),如下

platform :ios, '13.0'

#...

target 'Runner' do
#   pod 'BaiduNaviKit-All', '6.5.8'
  pod 'BaiduMapKit/Map', '6.5.9'    # 集成地图Map包
#   pod 'BaiduMapKit/Search', '6.5.8' # 集成地图Search包
  pod 'BaiduMapKit/Utils', '6.5.9'  # 集成地图Utils包
  use_frameworks!

4. 安装SDK

在Terminal进入ios目录,运行

pod install

如果网络出错,可以试试git.com IP in etc/hosts 或者socks5 proxy for curl and git 

git config --global http.proxy socks5://127.0.0.1:1080
git config --global https.proxy socks5://127.0.0.1:1080


# 修改curl配置文件
vim ~/.curlrc
# 写入
socks5 = "127.0.0.1:1080"

再运行pod install --repo-update时, Installing OpenCV 好像要一两个小时(最终没下完,Podfile不要Navi-all,还是能用)。

还有人说(没试)

CDN: trunk URL couldn‘t be downloaded SSL connect error_cdn: trunk url couldn't be downloaded: firebase.po-CSDN博客

在podfile中添加

source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'

5. 集成插件

pubspec.yaml

dependencies:
#  ...

  flutter_bmflocation: ^3.5.0
  flutter_baidu_mapapi_map: ^3.5.0
#  flutter_baidu_mapapi_search: ^3.5.0
  flutter_baidu_mapapi_utils: ^3.5.0
  permission_handler: ^8.1.2

点击Pub  get

6.1 添加权限

Info.plist添加

	<key>io.flutter.embedded_views_preview</key>
	<string>YES</string>
	<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>鹰眼DEMO需要后台定位</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>鹰眼DEMO需要后台定位</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>鹰眼DEMO需要前台定位</string>
    <key>UIBackgroundModes</key>
    <array>
    <string>location</string>
    </array>
    <key>NSLocationTemporaryUsageDescriptionDictionary</key>
    <dict>
        <key>WantsToTrace</key>
        <string>鹰眼DEMO需要精确定位</string>
    </dict>

6.2 动态申请权限

 class ... extends State<...>  initState() 里动态申请定位权限

import 'package:permission_handler/permission_handler.dart';

class _PageViewWidgetState extends State<PageViewWidget>{
  @override
  void initState() {
    super.initState();

    /// 动态申请定位权限
    checkPermissions();
  }
//判断是否有权限
  void checkPermissions() async {
    Permission permission = Permission.locationAlways;
    PermissionStatus status = await permission.status;
    print('检测权限$status');
    if (status.isGranted) {
      //权限通过
    } else if (status.isDenied) {
      //权限拒绝, 需要区分IOS和Android,二者不一样
      requestPermission(permission);
    } else if (status.isPermanentlyDenied) {
      //权限永久拒绝,且不在提示,需要进入设置界面
      openAppSettings();
    } else if (status.isRestricted) {
      //活动限制(例如,设置了家长///控件,仅在iOS以上受支持。
      openAppSettings();
    } else {
      //第一次申请
      requestPermission(permission);
    }
  }
  //申请权限
  void requestPermission(Permission permission) async {
    PermissionStatus status = await permission.request();
    debugPrint('权限状态$status');
    if (!status.isGranted) {
      openAppSettings();
    }
  }
class _PageViewWidgetState extends State<PageViewWidget>{
  AgreementController agreementController = Get.find<AgreementController>();
  int _currentIndex = 0;

  @override
  void initState() {
    super.initState();

    /// 动态申请定位权限
    checkPermissions();
  }
//判断是否有权限
  void checkPermissions() async {
    Permission permission = Permission.locationAlways;
    PermissionStatus status = await permission.status;
    print('检测权限$status');
    if (status.isGranted) {
      //权限通过
    } else if (status.isDenied) {
      //权限拒绝, 需要区分IOS和Android,二者不一样
      requestPermission(permission);
    } else if (status.isPermanentlyDenied) {
      //权限永久拒绝,且不在提示,需要进入设置界面
      openAppSettings();
    } else if (status.isRestricted) {
      //活动限制(例如,设置了家长///控件,仅在iOS以上受支持。
      openAppSettings();
    } else {
      //第一次申请
      requestPermission(permission);
    }
  }
  //申请权限
  void requestPermission(Permission permission) async {
    PermissionStatus status = await permission.request();
    debugPrint('权限状态$status');
    if (!status.isGranted) {
      openAppSettings();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Stack(

7. 初始化SDK

可以在地图页面initState里初始化

import 'dart:io' show Platform;
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
import 'package:flutter_bmflocation/flutter_bmflocation.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'
    show BMFCoordinate, BMFEdgeInsets, BMFMapSDK, BMF_COORD_TYPE;

class _MapPageWidgetState extends State<MapPageWidget>{
  @override
  void initState() {
    super.initState();
    /// 设置用户是否同意SDK隐私协议
    /// since 3.1.0 开发者必须设置
    BMFMapSDK.setAgreePrivacy(true);

    LocationFlutterPlugin myLocPlugin = LocationFlutterPlugin();
    myLocPlugin.setAgreePrivacy(true);
    // 百度地图sdk初始化鉴权
    if (Platform.isIOS) {
      String ak = "百度地图开放平台获取的AK";
      myLocPlugin.authAK(ak);
      BMFMapSDK.setApiKeyAndCoordType(ak, BMF_COORD_TYPE.BD09LL);
    }
  }

8. 显示地图

地图页面Build里用BMFMapWidget显示(可复制官网提供的实例代码)

  @override
  Widget build(BuildContext context) {
    var mapOptions = BMFMapOptions(
        center: BMFCoordinate(43.786082, 87.62464),
        zoomLevel: 12,
        mapPadding: BMFEdgeInsets(left: 30, top: 0, right: 30, bottom: 0));
    return Container(
      width: Get.width,
      height: Get.height,
      child: BMFMapWidget(
        onBMFMapCreated: (controller) {
          // onBMFMapCreated(controller);
        },
        mapOptions: mapOptions,
      ),
    );
  }

9. 真机运行测试

模拟器里测试半天,地图页面闪退,真机却显示网络授权后正常显示,唉(也许是开发环境网络代理改来改去造成的)。反正真机测试,早点看点成果

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值