一、写在前面
好久不见~最近接手了一个flutter的项目,需求是接入百度地图的定位插件。但是按照官网的文档来做,安卓没有问题,但是ios就惨了,各种编译报错。
flutter_bmflocation: ^3.6.0 集成报错 ‘BMKLocationManager.h’ file not found
有需要的可以直接拉最下面,看解决方案。
我也没写过原生开发的语言,所以这个对我一个写前端的来说还是有那么一丢丢难度。
关注公众号“笔优站长”可阅读全部文章哟。
二、报错的内容
xcode的报错
三、解决方案
百度官方的方案(我试了几次,一点卵用都没得,避坑!!!)
然后提了工单,来来回回很久了。还是没得一点卵用
最后的解决方案,我去看了一下源码和引用。就试着把头文件这里替换为
注意 #import <BMKLocationkit/BMKLocationComponent.h> 的BMKLocationkit的k要大写!!
#import <BMKLocationKit/BMKLocationComponent.h>
原文是去看的ios的原生定位开发文档,下面的原文链接:
https://lbs.baidu.com/faq/api?title=ios-locsdk/guide/get-location/once
四、实测
测试Android 定位
测试 ios
一切正常,编译也不会报错了。大功告成~
再附上一部分源码
import 'dart:async';
import 'dart:io';
import 'package:fl_location/fl_location.dart';
import 'package:flutter_bmflocation/flutter_bmflocation.dart';
import 'package:sem/common/utils/models/logger.dart';
///
/// 位置服务相关
///
class BMLocation{
///
/// 检查是否开启了位置权限
///
static Future<bool> checkAndRequestPermission({
bool? background,
}) async {
if (!await FlLocation.isLocationServicesEnabled) {
return false;
}
var locationPermission = await FlLocation.checkLocationPermission();
if (locationPermission == LocationPermission.deniedForever) {
// Cannot request runtime permission because location permission is denied forever.
return false;
} else if (locationPermission == LocationPermission.denied) {
// Ask the user for location permission.
locationPermission = await FlLocation.requestLocationPermission();
if (locationPermission == LocationPermission.denied ||
locationPermission == LocationPermission.deniedForever) {
return false;
}
}
// Location permission must always be allowed (LocationPermission.always)
// to collect location data in the background.
if (background == true && locationPermission == LocationPermission.whileInUse) {
return false;
}
// Location services has been enabled and permission have been granted.
return true;
}
///
/// 要获取当前位置,请使用该getLocation函数。
///
static Future<Location?> getLocation({
bool showToast = false,
String tips = '',
Function? onConfirm,
Function? onCancel
}) async {
if (await checkAndRequestPermission()) {
try {
final LocationFlutterPlugin location = LocationFlutterPlugin();
// 调用此方法前,应用启动的时候一定要先设置隐私协议,否则无法使用... 这里是例子, setAgreePrivacy 建议是应用启动的时候用户同意相关隐私的时候就直接设置了.
// location.setAgreePrivacy(true);
await location.prepareLoc({
'needAddress': true
}, {
'needAddress': true
});
if(Platform.isAndroid){
await location.startLocation();
Completer<BaiduLocation> completer = Completer<BaiduLocation>();
// 接受定位回调
location.seriesLocationCallback(callback: completer.complete);
BaiduLocation locationData = await completer.future;
location.stopLocation();
return Location.fromJson({
'latitude': locationData.latitude,
'longitude': locationData.longitude
});
}
if(Platform.isIOS){
await location.singleLocation({'isReGeocode': true, 'isNetworkState': true});
Completer<BaiduLocation> completer = Completer<BaiduLocation>();
// 接受定位回调
location.singleLocationCallback(callback: completer.complete);
BaiduLocation locationData = await completer.future;
return Location.fromJson({
'latitude': locationData.latitude,
'longitude': locationData.longitude
});
}
} catch (e) {
// SMToast.error(text: "获取当前位置出错");
SMLog.e("获取当前位置出错:${e.toString()}");
}
}
return null;
}
}
五、写在后面
百度地图的flutter的坑是相当的多,我是踩了好几个了,需要注意的是flutter的开发文档不如原生的文档齐全,需要参考双端的原生文档更为稳妥。。。
有问题请留言或者@博主,谢谢支持o( ̄︶ ̄)o~
感谢您的阅读,如果此文章或项目对您有帮助,请扫个二维码点个关注吧,若可以的话再给个一键三连吧!
公众号阅读的朋友可以点一下右下角的在看和分享哦。
GitHub有开源项目,需要的小伙伴可以顺手star一下!
GitHub: https://github.com/langyuxiansheng
更多信息请关注公众号: “笔优站长”