目录
1. 获取AK
在百度地图开放平台lbs.baidu.com,新建项目选iOS,填好信息,成功后有AK。注意填写过程中 Bundler ID需要在XCode配置开发者信息后查看,具体参考百度地图文档:
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,还是能用)。
还有人说(没试)
在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. 真机运行测试
模拟器里测试半天,地图页面闪退,真机却显示网络授权后正常显示,唉(也许是开发环境网络代理改来改去造成的)。反正真机测试,早点看点成果