您的位置:首页 > 移动开发 > IOS开发

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特性的另一种体现吧。但是这样做的后果也是显而易见的——掌握不好会发生难以预料的后果。
在需要被观察的对象中调用以下方法:
- (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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息