3.weexeros获取地理位置2019.3

ios端可以直接获取经纬度

  this.$geo.get().then(
                data => {
                    this.$notice.alert({
                      message:
                           '经度: ' +
                         data.locationLng +
                        '\r\n\r\n纬度: ' +
                        data.locationLat,
                      okTitle: '确认',
                       callback () {
                            点击确认按钮的回调
                       }
                    });
                },
                error => {
                    this.$notice.toast({
                        message: '获取位置失败'
                    });
                    console.log(error);
                }
            );

此时没有获取具体的地理位置
逐步分析
1.查看封装的geo.js

const geolocation = weex.requireModule('bmGeolocation')
const Geolocation = Object.create(null)

Geolocation.install = (Vue) => {
    Vue.prototype.$geo = {
        get () {
            return new Promise((resolve, reject) => {
                geolocation.getGeolocation(({ status, errorMsg, data }) => {
                    status === 0 ? resolve(data) : reject({ status, errorMsg, data })
                })
            })
        }
    }
}

Vue.use(Geolocation)

weex.requireModule('bmGeolocation')
引入的是这个,全局搜索bmGeolocation


图片.png

这里是注册,真正调用的是
BMGeolocationModule类


图片.png

头文件中遵守了WXModuleProtocol协议

实现文件中

@synthesize weexInstance;

WX_EXPORT_METHOD(@selector(getGeolocation:))


- (void)getGeolocation:(WXModuleCallback)callback
{
    
    [[JYTLocationManager shareInstance] getCurrentLocation:^(NSString *lon, NSString *lat,NSString *city,NSString *subLocality,NSString *street) {
        if (callback) {
            
            NSInteger resCode = BMResCodeError;
            NSDictionary *data = nil;
            if (lon && lat) {
                resCode = BMResCodeSuccess;
                data = @{@"locationLat": lat,@"locationLng": lon,@"city":city,@"subLocality":subLocality,@"street":street};
            }
            
            /* 构建callback数据 */
            NSDictionary *resultData = [NSDictionary configCallbackDataWithResCode:resCode msg:nil data:data];
            
            callback(resultData);
            
        }
    }];
}

原先只有经度和纬度NSString *lon, NSString *lat两个字段的,现在拓展多三个字段NSString *subLocality,NSString *street,城市,区域,和街道。

里面是调用JYTLocationManager类获取经纬度的


图片.png

这个方法里面获取到位置,所以在这里增加反向地理编码,把经纬度转为具体地址。

#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
    CLLocation *location = [locations firstObject]; //取出第一个位置
    
    /* 将gps坐标系转换成gcj-02坐标系 */
    CLLocationCoordinate2D coordinate = [TransformCLLocation wgs84ToGcj02:location.coordinate];
    [self.locationManager stopUpdatingLocation];
    
  
    
    
    //反向地理编码
    
    CLGeocoder *clGeoCoder = [[CLGeocoder alloc] init];
    
    CLLocation *cl = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
    __block  NSString *city=@"";
    __block  NSString *subLocality = @"";
    __block NSString *street = @"";
    [clGeoCoder reverseGeocodeLocation:cl completionHandler: ^(NSArray *placemarks,NSError *error) {
        
        for (CLPlacemark *placeMark in placemarks) {
 
            NSDictionary *addressDic = placeMark.addressDictionary;
 
            NSString *state=[addressDic objectForKey:@"State"];
            
            city=[addressDic objectForKey:@"City"];
            
            subLocality=[addressDic objectForKey:@"SubLocality"];
            
            street=[addressDic objectForKey:@"Street"];
 
            NSLog(@"所在城市====%@ %@ %@ %@", state, city, subLocality, street);
            [self callBackWithLongitude:[NSString stringWithFormat:@"%f",coordinate.longitude] latitude:[NSString stringWithFormat:@"%f",coordinate.latitude] city:city subLocality:subLocality street:street];
            [_locationManager stopUpdatingLocation];
            
        }
    }];
  
}

最后使用

this.$geo.get().then(
                data => {
                    console.log('获取到城市city=',data.city)
                },
                error => {
                    this.$notice.toast({
                        message: '获取位置失败'
                    });
                    console.log(error);
                }
            );

最后发现是个坑,一旦pod update,自己修改的第三方代码,代码就会重置!!!

只能自己再封装一个原生代码制作成pod,供js调用。

推荐阅读更多精彩内容

  • 第3章 映射 映射是定义存储和索引的文档类型以及字段的过程。索引中的每一个文档都有一个类型,每种类型都有它自己的映...
    MR_ChanHwang阅读 1,860评论 0 1
  • 来吧,我们先来看一下原版的微信发送位置 嗯,是发送位置,为什么不带发送实时位置,缺个另外一个真机。嗯,买一个16年...
    王培921223阅读 863评论 0 2
  • 当今技术定位的方式,有位置信息来源定位,IP定位,GPS定位,WIFI定位,手机定位和自定义定位。本文通过获取经纬...
    dovlie阅读 4,982评论 0 8
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 10,368评论 0 15
  • 一首不甚认真的情诗 被我挥笔间蹴就 墨笔晕开了春天里的思念 沾染一张白纸如美花眷 归燕,托春风捎去的随意一篇 你是...
    笔墨倾城阅读 110评论 1 4
  • 本书书名中的“钟表匠”,是借用18世纪神学家培里的一本著名的专论而来。钟表必然有个制造者;在某时某地必然有个匠人或...
    魔鬼的小牧师阅读 158评论 0 1
  • 文/雪儿 好像有两三年没有看电视剧了吧。其实,我也不怎么喜欢追剧,可一旦追上了,就会追个天昏地暗,追个彻夜不眠...
    飘雪的天堂阅读 2,882评论 0 7