iOS基于百度地图的开发 (百度地图BMKSearch问题) (作者不允许转载 我也没办法 ...

当前为iOS提供的SKD版本为1.2.1,这里主要讲一下这个版本存在的一些问题,以及开发注意事项。

1. BMKMapView是百度地图类,当创建多个BMKMapView对象时,这些对象会共享一些数据(没有仔细研究具体共享哪些数据),因此会产生以下问题:

    A. 当对其中一个BMKMapView通过手势来进行放大、缩小、移动等操作时,其他的BMKMapView对象会自动进行放大、缩小、移动。

    B. 启动应用程序时,首先显示出来的BMKMapView可以得到用户的当前位置,其他的BMKMapView可能要等一段时间或者完全无法得到用户当前的位置。

2. 为了解决1.B中的问题,可以只使用一个BMKMapView对象,比如在两个不同的UIView中共享同一个BMKMapView对象。此外,有一个方法可以基本上解决1.A的问题。假设UIView A和UIView B均有BMKMapView(可以为不同或同一个对象),在UIView A和UIVIew B之间进行切换时,记录下各自当前BMKMapView的Frame,然后在显示的时候再通过设置Frame来恢复到切换前的状态。这个方法的缺点是,在切换很快的时候,ViewDidAppear不一定会被调用,ViewWillDisapper的调用顺序不确定,不过可以满足普通操作的要求。

3. BMKSearch提供了搜索、地址解析等功能。百度通过回调来响应搜索结果,关键的问题是,有时回调并不会被调用(个人感觉是BMKSearch之后,百度的SDK无法正确找到回调函数,比如处于不同的线程等等)。为了能让百度SDK正确找到回调,建议如下:

    A. 在没有得到回调之前,不要释放BMKSearch对象,最好做成全局对象。(必须)

    B. 在搜索路线时,如果起始位置是通过经纬度来表示的,那么节点信息中除了设置经纬度pt信息外,一定要设置name信息(不能为空字符串)。(必须)

    C. 不能同时进行多个搜索。(必须)

    D. 在每次通过BMKSearch对象进行搜索之前,最好是将其delegate设置为nil,然后进行release,然后再alloc,然后再进行搜索。(强烈建议)

    E. 所有的搜索的操作均不要通过委托或其他线程的回调等等来发起,应该是由本对象主动发起,并且本对象作为搜索代理,这样百度SDK才能正确找到回调函数。(强烈建议)

4. 有时需要判断当前用户经纬度是否是在国内,可以通过BMKSearch的地址反解析之后的回调来判断,如果返回的错误码为BMKErrorResultNotFound,那么有可能不在国内,因为其他的原因也可能导致返回此错误码。

5. 其实,最好的解决方法是采用AutoNavi高德地图api,如果是iOS6,那么直接可以直接使用MKMapView,其采用的就是AutoNavi接口。目前AutoNavi接口不足之处是没有步行路线,据说还在开发中,相信以后会支持的。

你可能感兴趣的:(iOS基于百度地图的开发 (百度地图BMKSearch问题) (作者不允许转载 我也没办法 ...)