美文网首页iOS开发iOS地图
iOS百度地图+鹰眼SDK集成实录

iOS百度地图+鹰眼SDK集成实录

作者: 叶流月 | 来源:发表于2017-08-14 18:13 被阅读289次
    百度鹰眼

    鹰眼+地图百度官方的集成说明其实已经很详细了,然而有几个坑还是不踩不知道系列。我这里用的是鹰眼V3.0.3版本,列举一下自己集成过程中踩到的几个坑。

    鹰眼轨迹本身只负责搜集和显示用户的运动轨迹点信息,同时SDK可以完成抽稀,去噪,绑路的功能,但是经过处理后的信息依然是一个个的散落信息点,你需要自己结合百度地图SDK来将其呈现为可以直观理解的形式——比较好用的就是直接在地图上画折线图。

    所以你为了完整的使用全部功能,至少还要集成百度地图的base,map,location三个分包。集成过程跟着百度官方指导走。这里我们不提使用cocoapod导入的方式,那样不会出问题但是会导入很多不需要使用的部分,手动集成的话可以只使用三个分包,压缩APP大小。

    所使用的分包

    集成的时候,你需要将BaiduMapAPI_Base.framework、BaiduMapAPI_Location.framework、BaiduMapAPI_Map.framework三个分包拖入工程,base分包是所有功能包的依赖基础,必须引入。

    坑点A:在官方集成说明中,如果你只是将某个.m文件修改为.mm文件,而不是选择“或者在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++”的话,一路顺着做下去会报这个错误:

    image.png

    捣鼓半天以后也许你会像我一样尝试把编译方式改为Objective-C++,看起来没有红色编译错误了,但是一旦试图运行又会发现:

    image.png

    我猜你的内心应该是崩溃的。后来查阅了很多地方,最终在这里看到了一些稍微靠谱的解释,简单总结就是:自动编译模式(就是compile Source As 设置为Automatic)会根据资源文件的语言种类来自动选择编译方式,如果强行指定编译方式为C++,则部分第三方文件无法顺利编译通过。

    后来无奈之下一步一步的重试,发现Linker command failed with exit code错误是出现在.a静态库添加的这一步,而在这个时候编译方式是Automatic的。

    这里实际意义上的解决方式是:

    将.a文件复制到工程文件夹后再添加!

    将.a文件复制到工程文件夹后再添加!

    将.a文件复制到工程文件夹后再添加!

    如果只是按照官方指导文献的操作方法的话,.a静态库并没有被拷贝进工程中,只存在一个指向的逻辑地址,而在编译过程中工程是无法顺利对工程包以外的文件执行识别语言并编译的!

    编译成功

    将.a静态库复制进工程文件夹下并重新添加到Link Binary With Libraries下后,终于顺利完成了百度地图的引入工作。

    与百度地图的复杂相反,鹰眼SDK的引入则十分简单且友好,只需要关掉bitcode并且把framework拖入工程即可。不过我遇到一个问题是,官方给出的鹰眼demo可以在模拟器上运行,而官方提供的SDK却不能在模拟器运行。对比了一下两边的SDK包发现大小不一致,再使用lipo -info ./BaiduTraceSDK.framework/BaiduTraceSDK 指令去查阅SDK支持的架构,才想起我自己下载的SDK已经根据官方的合成CPU架构步骤去掉了模拟器的支持部分,所以SDK不能在模拟器上运行,原因如下:

    参考文献:关于iOS开发CPU架构的问题

    xcode模拟器其实是在电脑上的,所以iOS模拟器并没有使用arm指令集。它编译运行使用的是x86指令集(或者i386)。而在真机上使用的才是arm类型的指令集。

    image.png SDK对比

    集成工作到这里告一段落,现在开始coding。

    首先在Appdelegate.m中设置didFinishLaunchingWithOptions方法:

    
    #import "AppDelegate.h"
    #import <BaiduMapAPI_Base/BMKBaseComponent.h>
    #import <BaiduTraceSDK/BaiduTraceSDK.h>
    
    @interface AppDelegate () <BMKGeneralDelegate>
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        //设置鹰眼SDK的基础信息
        BTKServiceOption *basicInfoOption = [[BTKServiceOption alloc]initWithAK:@"你的鹰眼AK" mcode:@"你的鹰眼mcode" serviceID:100000 keepAlive:YES];
        [[BTKAction sharedInstance] initInfo:basicInfoOption];
        //初始化地图SDK
        BMKMapManager *mapManager = [[BMKMapManager alloc]init];
        if ([mapManager start:@"你的百度地图key" generalDelegate:self]) {
            NSLog(@"manager启动成功");
        }
        return YES;
    }
    
    
    -(void)onGetNetworkState:(int)iError {
        if (0 == iError) {
            NSLog(@"联网成功");
        } else{
            NSLog(@"onGetNetworkState %d",iError);
        }
    }
    
    - (void)onGetPermissionState:(int)iError {
        if (0 == iError) {
            NSLog(@"授权成功");
        } else {
            NSLog(@"onGetPermissionState %d",iError);
        }
    }
    

    接下来把后台定位权限打开,必须要打开,不然鹰眼会崩溃:

    打开后台定位权限

    然后到ViewController中调用相关功能:

    - (void)viewDidLoad {
        [super viewDidLoad];
        if (self.mapview == nil) {
            self.mapview = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 414, 414)];
        }
        [self.view addSubview:self.mapview];
        _mapview.showsUserLocation = YES;
        _mapview.userTrackingMode = BMKUserTrackingModeFollow;
        if (self.locationService == nil) {
            self.locationService = [[BMKLocationService alloc]init];
            self.locationService.delegate = self;
        }
        [_locationService startUserLocationService];
        
        BTKStartServiceOption *option = [[BTKStartServiceOption alloc]initWithEntityName:@"YYDemo"];
        [[BTKAction sharedInstance] startService:option delegate:self];
        [[BTKAction sharedInstance] startGather:self];
    
    }
    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        self.mapview.delegate = self;
        self.mapview.zoomLevel = 18.5;
    }
    -(void)viewWillDisappear:(BOOL)animated{
        [super viewWillDisappear:animated];
        _mapview.delegate = nil;
        [[BTKAction sharedInstance] stopGather:self];
        [[BTKAction sharedInstance] stopService:self];
    }
    

    最后,别忘了在Info.plist中加上允许获取定位权限和bundle display name两个条目,这样,基础的集成应该就顺利完成了。

    鹰眼轨迹默认的模式是每五秒采集一次地点,每三十秒进行一次上传,你可以根据你的需要去自定义这些参数,注意定位频率和精度的提高会大幅度提升耗电。

    说一下查询历史轨迹的方法:

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        // 构造请求对象
        BTKQueryTrackProcessOption *options = [[BTKQueryTrackProcessOption alloc]init];
        options.denoise = true;  //是否降噪
        options.vacuate = true; //是否抽稀
        options.mapMatch = true;  //是否绑路
        options.transportMode = BTK_TRACK_PROCESS_OPTION_TRANSPORT_MODE_WALKING;  //运动模式设定
        
        
        NSUInteger endTime = [[NSDate date] timeIntervalSince1970];  //查询过去24小时的轨迹
        BTKQueryHistoryTrackRequest *request = [[BTKQueryHistoryTrackRequest alloc] initWithEntityName:@"YYDemo" startTime:endTime - 86400 endTime:endTime  isProcessed:TRUE processOption:options supplementMode:BTK_TRACK_PROCESS_OPTION_SUPPLEMENT_MODE_RIDING outputCoordType:BTK_COORDTYPE_BD09LL sortType:BTK_TRACK_SORT_TYPE_DESC pageIndex:1 pageSize:50 serviceID:147404 tag:0];
        // 发起查询请求
        [[BTKTrackAction sharedInstance] queryHistoryTrackWith:request delegate:self];
    
    }
    

    然后这里是查询结果的回调方法,我利用查询到的历史轨迹点信息,结合百度地图上画折线的方法,从而实现在地图view上绘制历史轨迹图。

    -(void)onQueryHistoryTrack:(NSData *)response{
    
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingAllowFragments error:nil];
        NSLog(@"track history response: %@", dict);
        NSArray *arr = dict[@"points"];
        CLLocationCoordinate2D paths[arr.count];
        NSMutableArray *colors = [[NSMutableArray alloc]init];
        for (NSInteger i = 0; i < arr.count; i++) {
            NSDictionary *point = arr[i];
            paths[i] = CLLocationCoordinate2DMake([point[@"latitude"] doubleValue], [point[@"longitude"] doubleValue]);
            UIColor *color = [UIColor redColor];
            [colors addObject:color];
        }
        BMKPolyline *colorfulPloyLine = [BMKPolyline polylineWithCoordinates:paths count:arr.count];
        [_mapview addOverlay:colorfulPloyLine];
        
    }
    //根据overlay生成对应的View
    - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay
    {
        if ([overlay isKindOfClass:[BMKPolyline class]]) {
            BMKPolylineView* polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
            polylineView.lineWidth = 3;
            /// 使用分段颜色绘制时,必须设置(内容必须为UIColor)
            polylineView.strokeColor = [UIColor redColor];
            return polylineView;
        }
        return nil;
    }
    

    效果是这样的:

    降噪绑路前 降噪绑路后

    鹰眼SDK集成实录到此告一段落,感谢各位阅读。

    相关文章

      网友评论

        本文标题:iOS百度地图+鹰眼SDK集成实录

        本文链接:https://www.haomeiwen.com/subject/btahrxtx.html