iOS开发笔记(使用Google Map Service获取用户当前位置信息)
2014-05-10 13:10
826 查看
拿到Mac有一段时间了,也稍微学了一点iOS开发基础。
我现在已经能够使用control drag来创建outlet,创建segue,并且学会了如何在两个不同的view之间pushSegue programmatically.
由于我自己开发的app的需要,现在在研究Google Map Service,按照谷歌官网的文档一步一步做下来可以在自己的app上内嵌一个示例性的map view。
但我现在想要实现程序一打开就要定位到用户当前位置的功能。查了apple官方文档还有stackoverflow等几个问题的解答,我大致理出了思路。
一、集成谷歌SDK
首先按照谷歌官方文档的要求一步一步下来,能实现一个示例性的map view:https://developers.google.com/maps/documentation/ios/start?hl=zh-CN
谷歌官方文档写的比较详细,但有两点需要注意:
1.在文档里的{app key}实际上在写进程序的里的时候是没有那对花括号的。
2.如果运行应用能看到那个marker但是没有载入地图,不仅要检查你的app key是否输对,还要检查你的app bundle name是否正确, app bundle name和app key就像username 和 password的关系一样且Bundle name是case sensitive的。我就是因为大小写的问题一直没能载入,后来看到控制台输出的时候才发现问题。
二、了解KVO
在完成了第一步也就是你能运行起一个map view后,才能继续第二步。我们得知道什么是KVO,也就是key value observing。这里我先给个Mattt Thompsom写的一篇关于KVO解释的很好的文章:http://nshipster.com/key-value-observing/
KVO是一个是非正式的,定义了两个对象间的观察和通知的协议。KVO的神奇之处就在于,任何一个对象可以观察任何另一个对象的任何一个值,这也是objective-C dynamic binding特性的另一种体现吧。但是这样做的后果也是显而易见的——掌握不好会发生难以预料的后果。
在需要被观察的对象中调用以下方法:
其中observer参数是观察者对象,需要注意的是,在该对象里需要实现observeValueForKeyPath方法。
keyPath为需要观察的属性名称
options是掩码,取值有NSKeyValueObservingOptionNew、NSKeyValueObservingOptionOld、NSKeyValueObservingOptionInitial、NSKeyValueObservingOptionPrior。其中New表示的是有新的的状态出现的时候通知我,Old表示变化的状态要包含老的状态。其他两个暂时没看,因为最近用不到,有兴趣的读者可以自己看看,我就直接skip over了。
之后在观察者对象里实现observeValueForKeyPath方法:
这几个参数都是被观察对象的状态发生变化后传进来的。在这个函数的实现的时候可以通过传入的keyPath和object来判断传入的这个消息是否来自该观察者所监听的对象。
最后不要忘记还有一个注销的方法:
三、实战
有了以上两步知识的储备,我们可以开始实战了,依旧,我列出我的参考资料地址:http://stackoverflow.com/questions/15266118/about-positioning-myself-some-problems
按照stackoverflow里Robert Weindl大牛给出的方法写完程序后,我发现程序并没有直接定位到我所在城市(难道是开虚拟机调试的问题?),而是定位到了旧金山,好囧。这个问题留到以后解决,现在我先列出在写程序的时候遇到的几个问题:
1.我们是依照google的示例程序修改的,所以我们的mapView_是一个实例变量,我在使用.运算符取mapView_的时候Xcode提示错误,改成self->mapView_就可以运行了。
2.
在stack overflow中zoom这个参数的取值为projection.zoom, 然而事实上并没有这个属性,所以可以自己用一个常量代替(不推荐我这种直接把常量写进程序的写法,我这样写是因为这只是个示例程序,偷个小懒:D)。
我现在已经能够使用control drag来创建outlet,创建segue,并且学会了如何在两个不同的view之间pushSegue programmatically.
由于我自己开发的app的需要,现在在研究Google Map Service,按照谷歌官网的文档一步一步做下来可以在自己的app上内嵌一个示例性的map view。
但我现在想要实现程序一打开就要定位到用户当前位置的功能。查了apple官方文档还有stackoverflow等几个问题的解答,我大致理出了思路。
一、集成谷歌SDK
首先按照谷歌官方文档的要求一步一步下来,能实现一个示例性的map view:https://developers.google.com/maps/documentation/ios/start?hl=zh-CN
谷歌官方文档写的比较详细,但有两点需要注意:
1.在文档里的{app key}实际上在写进程序的里的时候是没有那对花括号的。
2.如果运行应用能看到那个marker但是没有载入地图,不仅要检查你的app key是否输对,还要检查你的app bundle name是否正确, app bundle name和app key就像username 和 password的关系一样且Bundle name是case sensitive的。我就是因为大小写的问题一直没能载入,后来看到控制台输出的时候才发现问题。
二、了解KVO
在完成了第一步也就是你能运行起一个map view后,才能继续第二步。我们得知道什么是KVO,也就是key value observing。这里我先给个Mattt Thompsom写的一篇关于KVO解释的很好的文章:http://nshipster.com/key-value-observing/
KVO是一个是非正式的,定义了两个对象间的观察和通知的协议。KVO的神奇之处就在于,任何一个对象可以观察任何另一个对象的任何一个值,这也是objective-C dynamic binding特性的另一种体现吧。但是这样做的后果也是显而易见的——掌握不好会发生难以预料的后果。
在需要被观察的对象中调用以下方法:
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
其中observer参数是观察者对象,需要注意的是,在该对象里需要实现observeValueForKeyPath方法。
keyPath为需要观察的属性名称
options是掩码,取值有NSKeyValueObservingOptionNew、NSKeyValueObservingOptionOld、NSKeyValueObservingOptionInitial、NSKeyValueObservingOptionPrior。其中New表示的是有新的的状态出现的时候通知我,Old表示变化的状态要包含老的状态。其他两个暂时没看,因为最近用不到,有兴趣的读者可以自己看看,我就直接skip over了。
之后在观察者对象里实现observeValueForKeyPath方法:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
这几个参数都是被观察对象的状态发生变化后传进来的。在这个函数的实现的时候可以通过传入的keyPath和object来判断传入的这个消息是否来自该观察者所监听的对象。
最后不要忘记还有一个注销的方法:
- (void)removeObserver:(NSObject *)object forKeyPath:(NSString *)keyPath如果有必要的话,使用try和catch来捕捉异常,因为上文已经提到KVO非常的灵活,任何对象可以观察其他对象,这就导致了我们无法用一个方法去检查这个observer是否已经被remove或者根本就没有register。
三、实战
有了以上两步知识的储备,我们可以开始实战了,依旧,我列出我的参考资料地址:http://stackoverflow.com/questions/15266118/about-positioning-myself-some-problems
按照stackoverflow里Robert Weindl大牛给出的方法写完程序后,我发现程序并没有直接定位到我所在城市(难道是开虚拟机调试的问题?),而是定位到了旧金山,好囧。这个问题留到以后解决,现在我先列出在写程序的时候遇到的几个问题:
1.我们是依照google的示例程序修改的,所以我们的mapView_是一个实例变量,我在使用.运算符取mapView_的时候Xcode提示错误,改成self->mapView_就可以运行了。
2.
[self->mapView_ animateToCameraPosition:[GMSCameraPosition cameraWithLatitude:self->mapView_.myLocation.coordinate.latitude longitude:self->mapView_.myLocation.coordinate.longitude zoom:15]];
在stack overflow中zoom这个参数的取值为projection.zoom, 然而事实上并没有这个属性,所以可以自己用一个常量代替(不推荐我这种直接把常量写进程序的写法,我这样写是因为这只是个示例程序,偷个小懒:D)。
相关文章推荐
- iOS项目开发实战——使用CoreLocation获取当前位置信息
- iOS项目开发实战——使用CoreLocation获取当前位置信息
- iOS 开发 如何获得用户当前位置(通过经纬度获得城市、省份等信息)
- iOS下获取用户当前位置的信息
- [IOS开发记录]ios10下使用Xcode8.2获取gps位置信息(swift3.0)
- IOS使用高德地图获取当前位置信息
- iOS开发中自动获取当前位置(GPS定位)
- Android开发之GPS获取当前位置信息
- iOS开发笔记 | 由使用Masonry布局不能立即获取到frame想到的一些问题
- 在iOS开发中自动获取当前的位置(GPS定位)
- 微信开发笔记——微信网页登录授权,获取用户信息
- 根据经纬度获取用户当前位置信息
- iOS开发获取用户位置及定位
- iOS---获取当前位置信息
- 【Android笔记 三】Location获取地理位置信息(中)Criteria类的简单使用
- iOS项目开发实战——使用用户首选项数据API存储信息
- ios项目开发(天气预报项目):使用正则获取 weather.com.cn网站信息
- 微信开发笔记——微信网页登录授权,获取用户信息
- 微信服务号开发-获取用户位置信息
- Google Maps Engine Pro帮企业用户处理地理位置信息 iOS版还在开发中