iOS接入谷歌地图SDK

前言

最近在开发国际版APP时需要用到谷歌地图,由于资料比较少,所以这里记录一下接入过程和基本的地图功能的使用。

1.获取API key

需要有去墙外进入谷歌地图开放平台:https://cloud.google.com/maps-platform/?hl=zh-CN 这个是中文语言的地址,先登录谷歌账号,然后点击使用入门,按照步骤:选择产品 --->设置结算信息(这里需要按照提示绑定国外的信用卡,这一步是必须的,否则无法使用谷歌地图) ,做完这两步后即可启用谷歌地图api,然后获取到apiKey

这是谷歌地图的文档地址https://developers.google.com/maps/documentation/ios-sdk/get-api-key

image

可以看到这句话,这里提示的是上一步设置结算信息是必须的,只有设置了这个才能获取到API key

2.添加API key到APP中

pod导入谷歌地图,我导入了地图API 和地图位置API,如果只需要图层和定位功能,可能就不需要GooglePlaces

#谷歌地图

    pod'GoogleMaps'

    pod'GooglePlaces'

在AppDelegate.m文件中添加以下代码,key是相同值


@import GoogleMaps;
@import GooglePlaces;



//配置谷歌地图

[GMSServices provideAPIKey:@"YOUR_API_KEY"];

[GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];

3.开始使用谷歌地图API

这里是谷歌地图的demo,有需要的可以直接下载下来

https://github.com/googlemaps/maps-sdk-for-ios-samples

1)初始化mapView

 //设置地图view,这里是随便初始化了一个经纬度,在获取到当前用户位置到时候会直接更新的

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868

                                                            longitude:151.2086

                                                                 zoom:12];

    _mapView= [GMSMapViewmapWithFrame:CGRectZerocamera:camera];

    _mapView.delegate = self;

    _mapView.settings.compassButton = YES;

    _mapView.frame = self.view.frame;

    [self.view addSubview:_mapView];

2)初始化locationManager


    // 1、判断设备是否开启定位服务

    if (![CLLocationManager locationServicesEnabled]) {

        // 弹框提示

        [NSObject mh_showAlertViewWithTitle:@"温馨提示"message:@"您的设备暂未开启定位服务!"confirmTitle:@"确定"];

        return;

    }


    // 2、初始化定位服务

    _locationManager = [[CLLocationManager alloc] init];

    // 3、请求定位授权*

    // 请求在使用期间授权(弹框提示用户是否允许在使用期间定位),需添加NSLocationWhenInUseUsageDescription到info.plist

    [_locationManager requestWhenInUseAuthorization];

    // 请求在后台定位授权(弹框提示用户是否允许不在使用App时仍然定位),需添加NSLocationAlwaysUsageDescription添加key到info.plist

    [_locationManager requestAlwaysAuthorization];

    // 4、设置定位精度

    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    // 5、设置定位频率,每隔多少米定位一次

    //_locationManager.distanceFilter = 10.0;

    // 6、设置代理

    _locationManager.delegate = self;

    // 7、开始定位

    // 注意:开始定位比较耗电,不需要定位的时候最好调用 [stopUpdatingLocation] 结束定位。

    [_locationManager startUpdatingLocation];

3)CLLocationManagerDelegate


// 位置更新

- (void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray *)locations {

    if(!_firstLocationUpdate){

        _firstLocationUpdate = YES;//只定位一次的标记值

        // 获取最新定位

        CLLocation*location = locations.lastObject;

        // 打印位置信息

        NSLog(@"经度:%.2f, 纬度:%.2f", location.coordinate.latitude,location.coordinate.longitude);

        // 停止定位

        [_locationManager stopUpdatingLocation];

        //如果是国内,就会转化坐标系,如果是国外坐标,则不会转换。

        _coordinate2D = [JZLocationConverter wgs84ToGcj02:location.coordinate];

        //移动地图中心到当前位置

        _mapView.camera = [GMSCameraPosition cameraWithTarget:_coordinate2D

                                                         zoom:14];

    }

}

这里用到了一个开源库 JZLocationConverter,它是用来处理在国内定位,获取到的坐标系和国外定位坐标系的转化问题,可以查看相关资料了解有关定位坐标系的知识。

https://github.com/JackZhouCn/JZLocationConverter

4) GMSMapViewDelegate


//地图移动后的代理方法,我这里的需求是地图移动需要刷新网络请求,查找附近的店铺

-(void)mapView:(GMSMapView*)mapView idleAtCameraPosition:(GMSCameraPosition*)position{

}

5)GMSAutocompleteViewControllerDelegate

我这里有用到谷歌地图的位置搜索,它这里是封装好的VC,可以直接使用,可以自定义等有很多功能,具体可以看上面发过的谷歌地图demo地址

在点击搜索位置按钮的方法里可以写如下代码:

    //记得要#import <GooglePlaces/GooglePlaces.h>
    GMSAutocompleteViewController*autocompleteViewController =

    [[GMSAutocompleteViewController alloc] init];

    autocompleteViewController.delegate=self;

    [self presentViewController:autocompleteViewController animated:YES completion:nil];


//选择了位置后的回调方法

- (void)viewController:(GMSAutocompleteViewController*)viewController

didAutocompleteWithPlace:(GMSPlace*)place {

    //移动地图中心到选择的位置

    _mapView.camera = [GMSCameraPosition cameraWithTarget:place.coordinate

                                                     zoom:14];

    // Dismiss the view controller and tell our superclass to populate the result view.

    [viewControllerdismissViewControllerAnimated:YES completion:nil];

}
//失败回调
- (void)viewController:(GMSAutocompleteViewController *)viewController
didFailAutocompleteWithError:(NSError *)error {
    // Dismiss the view controller and notify our superclass of the failure.
    [viewController dismissViewControllerAnimated:YES completion:nil];
    //[self autocompleteDidFail:error];
}
//取消回调
- (void)wasCancelled:(GMSAutocompleteViewController *)viewController {
    // Dismiss the controller and show a message that it was canceled.
    [viewController dismissViewControllerAnimated:YES completion:nil];
    //[self autocompleteDidCancel];
}

6)添加marker


-(void)addMarkers{

    // Add a custom 'glow' marker around Sydney.

    NSArray * latArr = @[@(_coordinate2D.latitude +0.004),@(_coordinate2D.latitude +0.008),@(_coordinate2D.latitude +0.007),@(_coordinate2D.latitude -0.0022),@(_coordinate2D.latitude -0.004)];

    NSArray * lngArr = @[@(_coordinate2D.longitude+0.007),@(_coordinate2D.longitude+0.001),@(_coordinate2D.longitude+0.003),@(_coordinate2D.longitude+0.003),@(_coordinate2D.longitude-0.008)];

    for(int i =0;i < latArr.count; i++){

        GMSMarker*sydneyMarker = [[GMSMarkeralloc]init];

        sydneyMarker.title=@"Sydney!";

        sydneyMarker.icon= [UIImageimageNamed:@"marker"];

        sydneyMarker.position=CLLocationCoordinate2DMake([latArr[i]doubleValue], [lngArr[i]doubleValue]);

        sydneyMarker.map=_mapView;

    }

}

总结

本篇主要是介绍了作者接入谷歌地图的步骤,和实现一些需求所用到的地图的部分功能。

谷歌地图还封装好了显示当前定位信息的方法,可以直接启用定位,然后使用kvo监听定位成功回调,不过这里我未找到能让它暂停定位的方法,为了APP的省电原因,所以采用了系统的CoreLocation来实现定位功能


_mapView.settings.myLocationButton = YES;

有其他需求,可参照谷歌地图demo工程

期待

1.文章若对您有些许帮助,请给个喜欢,毕竟码字不易;若对您没啥帮助,请给点建议,切记学无止境。

2.针对文章所述内容,阅读期间任何疑问;请在文章底部评论指出,我会火速解决和修正问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 写在前面 :请求谷歌API,您可以通过请求 http://maps.googleapis.com/(对于中国用户,...
    li_礼光阅读 4,869评论 3 8
  • 朋友张君,牛逼的很,属于高大全! 想想若干年前,张君在农村,没有水,喝水需要去几里路以外去挑,一亩田要熬几个晚上,...
    往事不再随风阅读 268评论 0 1
  • 顶着感冒,拖着疲惫的身躯,完整的走完了从高中开始到如今你为人妻为人母的婚礼,听闻你和姐夫的长跑爱情,瞬间就让我佩服...
    苏初见阅读 280评论 0 0
  • 四周空气忽然凝固,亚索的脸色抑制不住地变换,似在努力压抑内心之中的愤怒,久久,他神情冷漠地说。 “今日吾使命在身,...
    化浊阅读 272评论 0 0
  • 林间松韵,石上泉声,静里听来,识天地自然鸣珮;草际烟光,水心云影,闲中观去,见乾坤最上文章。
    江南莫之阅读 888评论 12 29