美文网首页
iOS定位机制说明

iOS定位机制说明

作者: Cyyyyyyyy | 来源:发表于2016-12-20 17:56 被阅读242次

    最近看了一下iOS系统提供的定位机制。我们现在产品里用的是高德的定位SDK,我们不必接触Core Location的细节,但是高德的SDK毕竟是对Core Location的封装,它势必继承了Core Location的特点和局限,多一些对Core Location机制的了解,能让我们在后续理解处理定位相关功能的时候多一些把握。

    Core Location framework提供了两种定位机制,它们各有利弊,我们要根据实际的业务场景,考虑电量消耗和精度等情况,选择合适的实现方案。

    下面是对两种机制的简要说明和代码示例:

    Standard Location Service

    Standard Location Service是苹果提供的最常用的定位获取和位置变化追踪的机制。大部分情况下,我们要获取用户的位置信息都是基于此。它的特点如下:

    • 应用能及时的得到位置的更新,定位精度可以控制,特别适合对定位强依赖的应用,比如运动类和导航类功能。
    • 可以根据不同的业务场景设置activityType属性,系统会以此判断在合适的情况下暂停位置更新。
    • 耗电!!!无论参数是怎么配置的,只要Standard Location Service开启,系统就会让定位模块保持供电获取新数据,这会导致应用一直处在高功耗的情况下。
    • 可以通过设置pausesLocationUpdatesAutomatically标记让应用在后台获取位置,如果应用被杀或者被系统terminated就再也不能获得位置了。
    • 提供了一种叫做Deferring Location Updates的延迟处理位置信息的机制,可是被吐槽的比较多,要使用的话得再研究一下。

    代码示例

    使用Standard Location Service需要创建一个CLLocationManager对象,根据需要初始化参数desiredAccuracydistanceFilter,同时把要接收位置变化的对象设置为CLLocationManagerdelegate

    以下是一段开启定位的代码示例:

    - (void)startStandardUpdates {
        // Create the location manager if this object does not
        // already have one.
        if (nil == locationManager)
            locationManager = [[CLLocationManager alloc] init];
     
        locationManager.delegate = self;
        locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
     
        // Set a movement threshold for new events.
        locationManager.distanceFilter = 500; // meters
     
        [locationManager startUpdatingLocation];
    }
    
    

    Significant-Change Location Service

    Significant-Change Location Service是苹果提供的在位置发生较大变化(500m或者更多)的时候通知应用的机制。该机制的特点如下:

    • Significant-Change Location Service会持续运行,至少每隔15分钟会发送一次位置更新的数据,就算用户位置没有发生变化。
    • 在应用被终止后,Significant-Change Location Service仍然会在位置变化的时候后台唤起应用通知位置变化。应用在被唤起时只会被分配到10秒钟时间。
    • 精度无法选择,可能达不到GPS的精度。
    • Background App Refresh关闭时无论在前台还是后台都收不到更新通知。

    - (void)startSignificantChangeUpdates {
        // Create the location manager if this object does not
        // already have one.
        if (nil == locationManager)
            locationManager = [[CLLocationManager alloc] init];
     
        locationManager.delegate = self;
        [locationManager startMonitoringSignificantLocationChanges];
    }
    

    参考文档

    Location and Maps Programming Guide
    后台定位上传的代码实践
    iOS后台持续定位并定时上传

    相关文章

      网友评论

          本文标题:iOS定位机制说明

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