flutter集成百度地图定位 ‘BMKLocationManager.h‘ file not found报错
一、写在前面
好久不见~最近接手了一个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
更多信息请关注公众号: “笔优站长”