iOS 如何在 VPN 中进行定位

    业界资讯 vpnxxw 来源:单人即每 288次浏览 0个评论 扫描二维码
    航海士 - 娜美

    航海士 – 娜美

    App 在不使用外网,只能连接 VPN(Virtual Private Network,即“虚拟专用网络“)的情况下,通过访问服务端提供的地址加载离线地图。设备获取当前位置后,WKWebView 调用 JavaScript 定位函数并传入经纬度参数,加载的地图上浮现当前定位点。

    场景分析

    针对以上场景,需要解决 iOS 如何在 VPN 中进行定位的问题主要有以下两点:

    1. 使用第三方地图平台(如高德开放平台百度地图开放平台等)的解决方案无效,因为在 VPN 环境中无法验证在地图平台申请的密钥。
    2. iOS 自身获取设备定位的方式有哪些。

    iOS 系统定位方式

    目前 iOS 设备的定位方式有基站定位、Wi-Fi 定位、GPS 定位。

    基站定位

    基本原理:每个基站都有一个标识符,移动设备能够搜索周围所有接收到信号的基站及其标识符,通过联网发送到苹果云服务器,再由服务器根据这些基站的位置信息查询并计算出当前位置,返回手机。

    iOS 优化:苹果将一部分重要基站(几十公里选一个)提前存储在 iOS 系统中,这样即便在无网环境下,也能定位到用户的位置。

    Wi-Fi 定位

    基本原理:每个无线接入点(AP)都拥有各自的 MAC 地址,设备在开启 Wi-Fi 的情况下,即可扫描并收集周围的 AP 信号(不需要连接上,只需要接收到信号),获取它们的 MAC 地址。设备将这些能够标识 AP 的数据发送到服务器,服务器检索出每个 AP 的地理位置,并结合每个信号的强弱程度,计算出设备的地理位置并返回到设备。位置服务商需不断更新、补充自己的数据哭,以保证数据的准确性,毕竟无线 AP 会出现移动的可能性。

    iOS 优化:iOS 设备在有网络连接时,会自动下载所在地区周围(几个街区宽度或者更多)所有 Wi-Fi 热点的信息到本地,这样当处于没有网络的情况下,iOS 照样可以利用之前下载的热点信息进行定位。

    GPS 定位

    基本原理:利用天上卫星(共24颗)进行不断广播信号,地面的 GPS 接收设备收到信号后,通过分析多个卫星信号,就可以计算出地球坐标。GPS 保证大部分地区都可以同时收到至少4个卫星信号,从而可以精准确定当前的经纬度以及海拔位置。

    iOS 优化:A-GPS

    定位方式对照

    定位方式 定位速度 耗电量 误差范围
    基站定位 最快 最少 几百上千米
    Wi-Fi 定位 介于基站和 GPS 之间 介于基站和 GPS 之间 几十米
    GPS 定位 最慢 最多 十米以内

    iOS 定位实现方式

    在 iOS 系统中实现定位用到的核心框架是 Core Location

    Core Location 提供确定设备的地理位置,高度,方向或相对于附近 iBeacon 的位置的服务。该框架使用所有可用的板载硬件,包括 Wi-Fi,GPS,蓝牙,磁力计,气压计和蜂窝硬件来收集数据。

    由于定位服务涉及到用户的地理位置信息,所以在 App 第一次调用定位服务时需要用户对此进行授权(授予或者拒绝该请求),系统会记录用户的回应,在以后的调用定位服务时不会在出现授权界面。当然用户可以手动在应用设置中修改权限,或者删除应用然后重新安装进行授权。

    实现 iOS 定位其实相对很简单,主要使用定位框架中的 CLLocationManager 类,具体操作可以分为以下几步:

    1 添加核心框架的引用。

    #import <CoreLocation/CoreLocation.h>
    

    2 声明 CLLocationManager 变量,添加需要实现定位服务的相关委托。

    @interface ViewController ()<CLLocationManagerDelegate> {
        CLLocationManager *_locationManager;
    }
    

    3 初始化和配置 CLLocationManager

    // locaiton manager init
    _locationManager = [[CLLocationManager alloc] init];
    _locationManager.delegate = self;
    _locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    _locationManager.distanceFilter = kCLDistanceFilterNone;
    // 请求权限
    [_locationManager requestAlwaysAuthorization];
    // 开始定位
    [_locationManager startUpdatingLocation];
    

    这里主要讲解下 desiredAccuracy 属性和 distanceFilter 属性,前者是用来控制定位精确程度,精确度越高耗电量越大,一般情况下 kCLLocationAccuracyBest 是最适合的选项;后者是控制定位更新的频率,单位是“米”,默认情况下是 kCLDistanceFilterNone,即出现变化就通知。

    另外在不需要定位服务的时候,可以调用 stopUpdatingLocation 方法来关闭定位更新,以达到节省电量的效果。

    4 实现 CLLocationManagerDelegate 委托方法。

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
        CLLocation *location = [locations lastObject];
        NSLog(@"locationManager:latitude:%f, longitude:%f", location.coordinate.latitude, location.coordinate.longitude);
    }
    
    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
        NSLog(@"Error-Location: %@", error);
    }
    

    火星坐标

    通过 WKWebView 将 iOS 定位获取的经纬度传入前端 JavaScript 函数后,加载的离线地图就会绘制当前设备所在的位置。当看着地图上定位出现的圈圈时,就像是吃着蘸了炼乳的烤面包一样美味,只是放大看时,发现在离线地图上绘制的坐标与实际坐标会出现几公里的误差,无论如何调整定位参数,误差仍是存在。

    通过查阅资料发现国内大部分地图因相关政策法规均存在偏移问题:

    是一种国家保密插件,也叫做加密插件或者加偏或者 SM 模组,其实就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。而加密后的坐标也常被人称为火星坐标系统。

    主要有如下 3 种标准:

    坐标系统 是否存在偏移 标准 应用方
    WGS84 无偏移 国际标准 谷歌、天地图、必应等标注【无偏移】的地图或 GPS 使用
    GCJ-02 有偏移 中国标准 谷歌、腾讯、高德、ArcGIS、OpenStreetMap等地图
    BD-09 有偏移 百度标准 百度地图使用

    国内准许上市的地图类产品都不是真实坐标系统,要想在其地图上显示正确的坐标,必须将获取的定位转换成它的坐标系统。基本上各个地图平台都提供相应的坐标转换接口,通过转化处理后加载的定位就是设备当前的位置了。

    Follow your heart.

    参考资料

    anyShare分享到:

    VPN信息网 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明-VPN信息网-iOS 如何在 VPN 中进行定位
    喜欢 (0)
    发表我的评论
    取消评论

    表情 贴图 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址