Baidu Map Flutter Plugin [iOS]

本文详细介绍了如何在iOS项目中集成百度地图SDK,包括获取AK、配置Podfile、安装SDK、集成插件、添加和请求定位权限、初始化SDK以及真机运行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

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. 真机运行测试

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

<think>嗯,用户之前问过关于.xcodeproj目录中没有的问题,现在他们又遇到了使用Flutter创建插件时没有生成xcodeproj的问题。我需要先理解用户的具体情况。 用户执行的命令是`flutter create --template=plugin --platforms=ios gaode_map_flutter`,创建了一个Flutter插件,但生成的iOS目录下缺少.xcodeproj文件。可能的原因是什么? 首先,Flutter插件项目结构。通常,Flutter插件在iOS端会有`ios`目录,里面应该包含.xcodeproj或.xcworkspace。但根据用户描述,没有生成这个文件,这可能是因为Flutter版本的问题。比如,新版本的Flutter可能默认使用Swift Package Manager(SPM)而不是Xcode项目文件,或者模板有变化。 另外,检查用户是否正确地执行了命令。是否在创建插件时指定了正确的平台?用户指定了`--platforms=ios`,所以应该生成iOS相关的文件。有没有可能用户没有进入正确的目录?比如,创建插件后,需要进入`gaode_map_flutter/ios`目录查看,而不是在根目录。 还有一种可能,用户使用的Flutter版本较新,可能插件模板的结构发生了变化,导致.xcodeproj未被生成,而改为使用.xcworkspace或其他方式管理。这时候需要检查Flutter的官方文档或更新日志,看看是否有相关变更。 另外,如果用户之前创建过插件,可能存在缓存问题,导致生成的文件不完整。可以建议用户尝试清除Flutter的缓存,或者升级Flutter到最新版本,再重新创建插件。 还可能存在权限问题,导致生成文件失败。需要检查用户是否有足够的权限在目标目录下创建文件,或者是否目录路径中有特殊字符导致生成失败。 此外,用户可能需要手动生成Xcode项目。比如,进入`ios`目录后,运行`pod install`或使用Xcode来创建项目文件。或者,检查是否有隐藏的文件,比如.xcodeproj被错误地忽略了,比如在.gitignore文件中被排除。 最后,需要建议用户检查Flutter doctor的输出,确认开发环境没有问题,比如Xcode是否安装正确,命令行工具是否配置妥当,这些也可能影响项目文件的生成。</think>当你使用 `flutter create --template=plugin --platforms=ios gaode_map_flutter` 命令创建 Flutter 插件时,生成的 iOS 模块默认应包含 `.xcodeproj` 文件(位于 `ios/` 目录下)。如果发现缺失,可能是以下原因及解决方案: --- ### **1. 检查 Flutter 版本与插件模板兼容性** - **问题原因**:旧版本的 Flutter 可能在生成插件时存在模板配置问题。 - **解决方案**: 升级 Flutter 到最新稳定版本: ```bash flutter upgrade ``` 重新生成插件: ```bash rm -rf gaode_map_flutter # 删除旧插件目录 flutter create --template=plugin --platforms=ios gaode_map_flutter ``` --- ### **2. 确认是否生成在正确目录** - **问题原因**:`.xcodeproj` 文件应位于 `ios/` 子目录中,而非项目根目录。 - **验证步骤**: ```bash cd gaode_map_flutter/ios # 进入 iOS 子目录 ls -la # 查看是否存在 .xcodeproj 文件 ``` 如果 `ios/` 目录缺失,可能因创建插件时未正确指定平台。 --- ### **3. 手动生成 Xcode 项目文件** - **问题原因**:Flutter 插件模板可能因配置问题未自动生成 Xcode 项目。 - **解决方案**: 1. 进入 iOS 目录: ```bash cd gaode_map_flutter/ios ``` 2. 初始化 Podfile(若未生成): ```bash pod init ``` 3. 安装 CocoaPods 依赖: ```bash pod install ``` 4. 此时应生成 `.xcworkspace` 文件(优先使用此文件打开项目),但若仍需 `.xcodeproj`,可尝试直接通过 Xcode 创建新项目并关联代码。 --- ### **4. 检查 Flutter 插件模板配置** - **问题原因**:Flutter 插件默认生成的 iOS 模块可能依赖 CocoaPods 或 Swift Package Manager,而非直接提供 `.xcodeproj`。 - **验证步骤**: 检查 `ios/` 目录下是否存在 `Podfile` 或 `.xcworkspace` 文件。若存在,说明依赖 CocoaPods: 1. 通过 `.xcworkspace` 打开项目(而非 `.xcodeproj`): ```bash open gaode_map_flutter/ios/Runner.xcworkspace ``` 2. 若需显式生成 `.xcodeproj`,可尝试在 Xcode 中手动创建项目并导入代码。 --- ### **5. 清理缓存并重新生成** - **问题原因**:缓存或文件残留导致生成失败。 - **解决方案**: 1. 清理 Flutter 构建缓存: ```bash flutter clean ``` 2. 删除 `ios` 目录并重新生成: ```bash rm -rf gaode_map_flutter/ios flutter create --template=plugin --platforms=ios gaode_map_flutter ``` --- ### **6. 验证 Flutter 开发环境** - **问题原因**:Xcode 或命令行工具未正确安装。 - **解决方案**: 运行以下命令检查环境: ```bash flutter doctor ``` 确保输出中无 iOS 相关警告(如 Xcode 未安装或许可证未接受)。 --- ### **总结步骤** 1. 升级 Flutter 到最新版本。 2. 确认 `ios/` 目录存在,并检查内部文件。 3. 使用 CocoaPods 生成 `.xcworkspace`(优先于 `.xcodeproj`)。 4. 若需手动生成 Xcode 项目,通过 Xcode 新建并关联代码。 如果问题仍未解决,建议提供以下信息以便进一步排查: - `flutter doctor -v` 的输出。 - `gaode_map_flutter/ios` 目录的完整结构截图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值