美文网首页开源
IOS虚拟定位,解决钉钉微信打卡烦恼

IOS虚拟定位,解决钉钉微信打卡烦恼

作者: 索德罗斯 | 来源:发表于2018-07-10 22:45 被阅读51次

    咱们公司可是有300大洋的到勤奖金的,仔细一算,一年下来3600,都赶上年终了呀!话说这到勤奖金不拿也就算了,要是每天迟到,扣个10块20的,也心疼呢。大冬天起床多不容易,然而夏天上班也不会太舒服。成都已经连着下了一个月的雨了,看样子还没有打算停的意思。这雨天挤公交挤地铁难免迟个到,扣点钱。自从同事们玩远距离打卡成了习惯之后,我们的管理员把钉钉的打卡距离直接缩短到0.1倍,迟到尴尬得很咯!

    我就直接一口气解决了这个问题吧,用手机能解决的问题那还是问题,我不管,我在家就要打卡上班了!

    github地址:https://github.com/Soldoros/SSVirtualLocation

    12.png

    大家有苹果电脑的自己下载安装吧,步骤参考此文即可!

    在地图开发中:我们会接触到3中类型的地图坐标系:

    WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用;

    GCJ-02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ-02坐标系,可以说,GCJ-02是国内最广泛使用的坐标系;

    百度坐标系:bd-09,百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。(目前百度API提供了从其它坐标系转换为百度坐标系的API,但却没有从百度坐标系转为其他坐标系的API)

    而我们iOS端采用的定位坐标系是WGS-84,我们可以直接通过定位代码拿到当前位置的经纬度。

    _manager = [[CLLocationManager alloc] init];
    _manager.delegate = self;
    [_manager requestWhenInUseAuthorization];
    _manager.desiredAccuracy = kCLLocationAccuracyBest;
    _manager.distanceFilter = 1.0;
    [_manager startUpdatingLocation];

    • (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
      [_manager stopUpdatingLocation];

      CLLocation *currentLocation = [locations lastObject];
      _titleLab.text = [NSString stringWithFormat:@"纬度:%f,经度:%f",currentLocation.coordinate.latitude,currentLocation.coordinate.longitude];

    //地理反编码 可以根据坐标(经纬度)确定位置信息(街道 门牌等)
    CLGeocoder *geoCoder = [[CLGeocoder alloc]init];
    [geoCoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (placemarks.count >0) {
            CLPlacemark *placeMark = placemarks[0];
            NSString *currentCity = placeMark.locality;
            if (!currentCity) {
                currentCity = @"无法定位当前城市";
            }
            //看需求定义一个全局变量来接收赋值
            NSLog(@"当前国家 - %@",placeMark.country);//当前国家
            NSLog(@"当前城市 - %@",currentCity);//当前城市
            NSLog(@"当前位置 - %@",placeMark.subLocality);//当前位置
            NSLog(@"当前街道 - %@",placeMark.thoroughfare);//当前街道
            NSLog(@"具体地址 - %@",placeMark.name);//具体地址
            
            NSString *string = [NSString stringWithFormat:@"%@,%@,%@,%@,%@,%@",placeMark.country,currentCity,placeMark.subLocality,placeMark.thoroughfare,placeMark.name,@"定位完成,确认无误后请开启钉钉或微信打卡吧!"];
            
            self.detLab.text = string;
            [self.detLab sizeToFit];
            self.detLab.center = CGPointMake(self.view.frame.size.width*0.5, 320);
        }
    }];
    

    }

    新建一个项目,新建一个gpx文件。gpx是一种用于存储坐标数据的 XML 文件格式。它可以储存在一条路上的路点,轨迹,路线,且易于处理和转换到其他格式。OpenStreetMap 使用的所有 GPS 数据要转换为 GPX 格式才能上传。之于下面的经纬度是哪家公司,你别问我,我也不知道,你是哪家就定位到哪家。给你个地址自己查去,高德地图 http://lbs.amap.com/console/show/picker

    <?xml version="1.0"?>
    <gpx version="1.1" creator="Xcode">

    <!-- XXXX科技 103.970942, 30.631744 -->
    
    <wpt lat="30.631744" lon="103.970942">
        <name>Cupertino</name>
        
        <time>2014-09-24T14:55:37Z</time>
    </wpt>
    

    </gpx>

    好的。项目完成了!就这么简单,开始调试,必须连接上真机。然后运行。运行后,点击Debug--->Simulate Location --> Location1(这个是你创建gpx的文件名哦)

    33.png

    这时你会发现手机当前的定位已经切换到你的经纬度。

    这个时候,你打开手机的其他软件,包括自带的地图,微信,钉钉。。。你会发现所有的当前定位都是你设置的位置了。然后,你想怎么弄就怎么弄咯

    你要修改另一个位置,只需要重新修改gpx中的参数,然后重新运行,发现还是上次的位置。这个时候只需要再点Location1,就可以更新到最新位置。

    如果要恢复原来的定位怎么办?第一感觉,我选了Don't Simulate Location,发现当时没反应(原来只需要重新运行一遍就好(iphone6 10.3版本)),但后面发现来回操作多次,原生地图的定位一直在刷新(干脆也重启手机吧)。

    已经远程测试过 放心使用吧,无毒无公害!!!好用请关注我的简书,请给soldoros的github打星!!!

    github地址:https://github.com/Soldoros/SSVirtualLocation

    相关文章

      网友评论

      • 帅巴扎黑:运行不了 需要苹果开发账号吗?
        索德罗斯:@帅巴扎黑 可以的,加我微信13540033103
        帅巴扎黑:@索德罗斯 主要是 我的 xcode 运行真机报错
        能加个好友 在你闲暇时间帮忙看看嘛
        索德罗斯:@帅巴扎黑 需要真机运行,不过测试多次发现,运行到手机后独立使用,定位还是经常失败,只能带着代码用!

      本文标题:IOS虚拟定位,解决钉钉微信打卡烦恼

      本文链接:https://www.haomeiwen.com/subject/rcxcpftx.html