iOS GoogleMaps的集成和详细使用

作者: ZHANGKAILUN_ | 来源:发表于2017-07-19 16:41 被阅读1093次

陆陆续续工作也快2年了,国内的一些sdk也用了不少,刚开工作的时候还是学习阶段,总是在论坛学习,还从来没有写过一篇像样的文章拿去和同行分享,初来乍到许多东西接触也只是皮毛,慢慢的才会深究,想来写了也是没什么可以拿去分享,最近新入职了一家公司,接触到了一些从来没用过的SDK,包括一些地图和海外支付的SDK,这篇文章主要讲一下如果集成GoogleMaps并将其使用到我们的项目中,小哥哥初来乍到,才疏学浅,有些东西还不是很熟练,而且书写的格式可能不是很正规,各位大神看过之后,请多多指教,直言不讳,THX~


NO.1 集成GoogleMaps

在iOS里面集成一个SDK的方式有很多种,我就不一一列出了,我大都是手动导入和Cocoapods导入,两种各有各的好处,举个例子,例如现在你的项目中导入了某个三方库需要修改而且不希望和你一起工作的同事因为手滑不小心update一下,建议使用手动导入,如果是特别官方的三方库,例如AFN和高德GoogleMaps这种,人家内部已经做的很成熟了,也无需进行改进,主要进行一些简单封装,更好的划分业务逻辑即可。

Cocoapods导入GoogleMaps,一些最基本的Cocoapods用法在此不进行赘述,pod search 你要加入的三方库,然后查看最新版本,在Podfile里面按照格式加入代码,回到终端 pod install即可,如果发现导入的并非官方给出最新的SDK,可以从更新pod源和pod xxxsdk update 入手,百试不厌...


NO.2 初始化CLLocationManager和GoogleMapsSDK

使用GoogleMaps和使用其他官方SDK一样需要appid或者Key或者secret,用你申请好的key在APPdelegate.m文件中进行初始化。代码如下

有木有很简单,一句代码即可,对比极光啊什么乱七八糟的很简单,嘻嘻,||0.0其实高德也差不多啦~但是和高德以及百度GoogleMaps最不同的地方,就是他要用apple官方给出的corelocation库进行定位,然后获取当前UserLocation,用location的latitude和longitude去显示用户的位置,这里有一些细节需要优化,按照博主的方法来,不需要走弯路,就在APPdelegate.m里面初始化CoreLocationManager最好,这样可以在你的HomePage界面进行监听用户的定位事件给出对应的处理,不需要再次初始化,做一个全局的Manager变量最好,代码如下

在此启动CLLocationManager即可

NO.3用GoogleMps展示当前用户的位置

展示用户当前位置是一个地图SDK最基本也是最简单功能,当然GoogleMaps也不例外,让我惊喜的是GoogleMaps已经在内部给使用者做好了定位点的朝向处理,不需要开发者自己处理,这个我在用高德地图已经开发过,如果有需要的同学可以在评论给回复,博主偷闲看到会答复哒~

核心代码如下

取到全局的CLLocationManager

根据CLLocationManager获取当前用户的经纬度

拿到userlocation去初始化GoogleMaps

看到这里给读者介绍一下GMSCameraPosition这个类,和高德百度等国内地图又一个不同的是,GoogleMaps视角引用的是一个Camera的概念,很好理解,就是你希望看的视角是怎样的,都可以用这个类GMSCameraPosition去设定,比如你希望你看到地图的缩放范围,中心是哪里,通通可以用这个类去处理,是不是很nice!!读到这里,就可以看到当前的所处位置啦,没图说杰宝是吧,上图~

因为我的手机是en语言环境,所以显示的都是英文,可以根据手机的语言环境进行修改地标的显示语言。

NO.4 GoogleMaps的主要代理方法

4.1 点击地图调用

4.2 map移动之后调用

4.3 map将要移动调用

4.4 点击map上的大头针调用

4.5点击GMSMarker的InfoWindow调用

我给出只是几个简单的代理方法,不要小瞧这几个代理方法,你需要的功能例如添加大头针,点大头针实现固定的Action,或者点击大头针规划路线等等等一系列Action,这些代理方法都可以帮你解决,具体看你如何运用,不做赘述,下面讲一下如果利用GoogleMaps进行线路规划。

NO.5 线路规划

用过高德和百度的小伙伴应该有用过线路规划这个功能,应用场景很多,例如用户想查看当前位置和目的地之间的线路,并且显示距离和时间等信息等等。但是GoogleMaps又很不同的,GoogleMaps很傲娇的没有和国内的地图SDK一样给出SDK接口,但是无妨,GoogleMaps API里面有提供公共的接口去供开发者使用。https://maps.googleapis.com/maps/api/directions/json?%@&origin=%@&destination=%@&mode=walking

加上如此url即可,%@作为占位,替换你需要填写的参数,StackOverFlow解决方法如此,origin是用户当前的位置的经纬度,destination是目的地的经纬度,mode代表你的交通方式,像我这种低碳出门方式的上班族当然是walking,虽然我有灰机,但是从来不开,嘻嘻~

在博主这里,我给这个方法封装了一下,供读者参考,如下~

具体的googlemap api的返回数据json我就不在此做赘述,读者可以自己去亲测一下,记得要开VPN,天朝用不了GoogleMaps很尴尬。。。

博主这样写是取到了距离(distance)和时间(duration),而且根据json中的路径编码绘制路径,代码如下~

这里有有一些业务逻辑代码,可以忽略掉。

NO.6 Ending

这是博主第一次写帖子,因为百度这种搜索GoogleMaps的讲解帖子很少,我起初做的时候也是搜了很多,但是看完感觉并没有完全解决了我想要的问题,在做这次项目的时候,基本是到国外网站去查找解决方法,这篇帖子旨在解决大家的问题和大家一齐进步,有些东西在没有接触的情况下,先去api文档作了解是最好的,先了解这个三方库的一些类和方法,再去着手项目,就会有了大体的思路。

NO.7 想说的话

我曾经看过一篇帖子,看到结尾之前觉得全文无亮点,但是看到结尾处亮了全文,我想repost一下

在技术学习的道路上,阅读量和代码量绝不能现行提升你的技术水平。同样写文章也如此,作者所写的文章完全是基于自己对技术的理解,在写作时也力求形象不抽象,绝不copy充数,所以也欢迎大家关注和参与讨论。技术学习绝不能孤胆英雄独闯天涯,而应该是一群人在一起的交流碰撞,享受智慧火花的狂欢。希望我的文章能成为你的盛宴,也渴望你的建议能成为我的大餐。

博主还会不定时更新,下篇文章具体讲解海外支付Stripe!

good luck!

相关文章

网友评论

  • 12345上山打老虎丶:给博主补充个小问题 可能有些人没碰到 但是 我肯定 有一小部分人就碰到了 , 废话不多说
    就是给谷歌地图做路线规划的时候电脑和手机必须翻墙(这大家应该都知道,后面是重点),手机和电脑必须在同一个节点,意思就是手机和电脑连接的vpn必须是同一个,否则是请求不到数据的,会一直请求超时。这个问题我整了俩小时 才整明白,分享给大家。大神勿喷。
    ZHANGKAILUN_:@12345上山打老虎丶 刚想回复您是vpn的问题,就看到这条评论:joy::joy:
  • 12345上山打老虎丶:NSURL *url = [NSURL URLWithString:@"https://maps.googleapis.com/maps/api/directions/json?origin=40.0523232,116.2956745&destination=39.856519,116.357574&sensor=false&mode=driving"];
    NSURLSessionDataTask *fetchDirectionsTask = [[NSURLSession sharedSession]dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
    NSLog(@"json = %@",json);
    NSLog(@"json失败 = %@",error);


    }];
    [fetchDirectionsTask resume];

    博主 看看 为什么这个写的总是请求超时啊?
  • 22aa2e428a07:大神,请问用户当前位置的图标怎么修改,
    ZHANGKAILUN_:这个还没有涉及,要多看Google Maps的文档,抱歉哦
  • f4178bd64de1:https://maps.googleapis.com/maps/api/directions/json

    博主 我用这个请求路线的时候 发现按照返回数据画出来的线不准确
    博主有遇到这个问题吗?
    就是画的线没在路上
    ZHANGKAILUN_:@f4178bd64de1 我只是猜想,接口返回的不是火星坐标系,中国用的是火星坐标系,不是GPRS
  • 扛支枪:哥们,我用网页请求那个url是有数据的,但是在app中请求routes字段里边就空了,会是什么原因呢?有遇到吗?是我google地图的权限没开吗?
    f4178bd64de1:https://maps.googleapis.com/maps/api/directions/json

    博主 我用这个请求路线的时候 发现按照返回数据画出来的线不准确
    博主有遇到这个问题吗?
    就是画的线没在路上
    扛支枪:@ZHANGKAILUN_ 你理解错了,我说的是这个url:maps.googleapis.com/maps/api/directions/json?origin=31.237587%2c121.477773&destination=31.737587%2c121.977773&sensor=false&mode=walking,我用浏览器是有数据的,但是app拿到的数据里边routes字段的数组是空的,请问你那边设置什么了吗?
    ZHANGKAILUN_:@kangxx 那个rotes是个加密的字符串,你要用googlemap的一个方法去解析一下会得到一个google封装的polyline,我方法里面有贴出来
  • 丨不學無術丨:最好还是提供一个 Demo
    提供的代码部分包含了很多其他未提供的内容;
    所以实际上,提供的代码参考意义不是很好
    ZHANGKAILUN_:@丨不學無術丨 好的,有时间我贴个demo上去
  • b3aebe49fe2a:博主怎么自定义弹出视图,没看明白,求指导
    ZHANGKAILUN_:@wen_lao iOS里面我没有在GoogleMaps官方文档中找到自定义window相关的材料,但是安卓可以,你可以再去文档中找找,GoogleMaps中对于iOS和安卓两个平台有些东西并非完全一致,仔细看一下文档就知道了,记得翻墙哦
    b3aebe49fe2a:@ZHANGKAILUN_ 就是点击大头针弹出的自定义视图
    ZHANGKAILUN_:你指的是marker的自定义window??
  • Lee0528:博主有没有demo,正在做导航的功能。。
    ZHANGKAILUN_:@Lee0528 这个没有做,你可以参考谷歌的api文档,根据我文章中贴出来的获取路线的方法,把walking对应的换成你设定的出行方式,然后再api返回的json数据里面会有对应的信息,包括一些路段多长经起始点和终点的经纬度之类的都有的,具体的详细看一下
    Lee0528:@ZHANGKAILUN_ 你这个demo里有没有做在不同的出行模式下它的路线是怎么画的,比如坐公交或地铁的情况下,有没有做显示出在哪换乘的标记,还是只有一条路线的?
    ZHANGKAILUN_:demo里面比较关键的都贴到文章里面了,具体问题评论区可以在评论区问我

本文标题:iOS GoogleMaps的集成和详细使用

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