JLocationKit 1.0.3

JLocationKit 1.0.3

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布Sep 2017
SwiftSwift 版本3.0
SPM支持 SPM

joehour 维护。



  • 作者
  • joe

LocationKit

一种简单的方法,用于在iOS上获取设备的当前位置和地理区域监控(Swift)。

LocationKit提供异步的基于块的获取当前位置和区域监控方式。它可以管理多个同时进行的定位和区域请求。每个请求可以指定其自己的设置,如检测类型(一次性,更新位置或重大位置变化),精度级别,检测频率和距离过滤器。

特点

  • 异步的基于块。
  • 获取位置。一次,更新位置或重大位置变化
  • 地理区域监控。(进入/退出区域)
  • 监控超过20个区域。
  • 管理多个同时定位服务。

需求

  • iOS 8.0+
  • Xcode 8.0+ Swift 3

安装

源代码

将LocationKit目录复制到您的项目中。
继续将LocationKit导入到您的文件中。

示例

请查看包含的示例项目。

文档

先决条件

在开始使用LocationKit之前,您必须配置项目以使用位置服务。显然,在iOS 8 SDK中,在开始位置更新之前,需要在CLLocationManager上调用requestAlwaysAuthorization(用于后台位置)或requestWhenInUseAuthorization(仅在程序在前台时使用位置)。

<key>NSLocationWhenInUseUsageDescription</key>
 <string>LocationKit</string>
     <key>NSLocationAlwaysUsageDescription</key>
      <string>LocationKit</string>

您添加的字符串值将在您的应用程序第一次尝试使用位置服务时显示。

获取当前用户位置

首先,创建一个新的LocationManager实例,并设置请求权限来使用位置服务。

以下是一个示例

let location: LocationManager = LocationManager()
location.requestAccess = .requestAlwaysAuthorization //default is .requestAlwaysAuthorization 

文档 ↩︎

获取位置(一次性)

获取设备的当前位置(一次性风格),然后自动停止服务。

以下是一个示例

location.getLocation(detectStyle: .Once, completion: { (loc) in
            print(loc.currentLocation.coordinate.latitude.description)
            print(loc.currentLocation.coordinate.longitude.description)
        }, error: { (error) in
            //optional
        }
        )

文档 ↩︎

获取位置(连续)

获取设备的当前位置(更新位置风格)。
您必须手动停止服务。

以下是一个示例

location.getLocation(detectStyle: .UpdatingLocation, completion: { (loc) in
            print(loc.currentLocation.coordinate.latitude.description)
            print(loc.currentLocation.coordinate.longitude.description)
        }, error: { (error) in
            //optional
        }
        )

您可以为distanceFilter、locationAccuracy和detectFrequency属性设置。

  • 距离过滤器:当行驶到新的距离间隔时会收到新的更新(默认为0米)
distanceFilter: double value   //meter
  • 位置精度:位置数据精度(默认为.Best)
locationAccuracy: .Best //kCLLocationAccuracyBest
locationAccuracy: .BestForNavigation //kCLLocationAccuracyBestForNavigation
locationAccuracy: .HundredMeters //kCLLocationAccuracyHundredMeters
locationAccuracy: .Kilometer //kCLLocationAccuracyKilometer
locationAccuracy: .NearestTenMeters //kCLLocationAccuracyNearestTenMeters
locationAccuracy: .ThreeKilometers //kCLLocationAccuracyThreeKilometers
  • 检测频率:位置更新的频率(默认为5秒)
detectFrequency: Int value   //seconds

如果您移动超过10米,您可以在每5秒获取一次当前位置

以下是一个示例

location.getLocation(detectStyle: .UpdatingLocation, distanceFilter: 10, locationAccuracy: .Best, detectFrequency: 5, completion: { (loc) in
            print(loc.currentLocation.coordinate.latitude.description)
            print(loc.currentLocation.coordinate.longitude.description)
        }, error: { (error) in
            //optional
        }
        )

文档 ↩︎

获取位置(显著位置变化)

如果您使用.SignificantLocationChanges detectStyle获取位置,只有当它检测到设备相关的小区发生变化时,此请求才会响应新事件,从而减少更新频率并显著降低电量消耗,即使您的应用已终止。(需要requestAlwaysAuthorization requestAccess)

以下是一个示例

location.getLocation(detectStyle: .SignificantLocationChanges, distanceFilter: 0, completion: { (loc) in
                print(loc.currentLocation.coordinate.latitude.description)
                print(loc.currentLocation.coordinate.longitude.description)
            }, error: { (error) in
                //optional
            }
            )

您不需要设置locationAccuracy和detectFrequency属性。

文档 ↩︎

位置响应信息

public class JLocationResponse {
    public var currentLocation: CLLocation! //current location
    public var previousLocation: CLLocation! //the last time location
    public var distanceInterval: Double! //the interval distance from previous location to current location. 
}

文档 ↩︎

地理区域监控

当用户穿越区域边界时,您可以轻松地收到通知。
LocationKit提供三种区域监控方式。

首先,您需要创建您想要监控的区域列表。

以下是一个示例

//create region list
var locationList: [JLocation] = []
let item:JLocation = JLocation(latitude: 22.22222, longitude: 22.22222, radius: 500(meter), identifier: "test")
locationList.append(item)

文档 ↩︎

区域监控(标准)

这是通过didDetermineState函数(.MonitoringRegion风格)执行的标准区域监控方式。
这种方式可以使您即使在应用已终止的情况下也能监控区域(需要requestAlwaysAuthorization requestAccess)。
但请注意,一次最多只能监控20个区域。

以下是一个示例

location.regionNotify(notifyStyle: .MonitoringRegion, locations: locationList, completion: { (region) in
            print(region.regionState.description())
        }, error: { (error) in
        }
        )

您不需要设置locationAccuracy、distanceFilter和detectFrequency属性。

文档 ↩︎

区域监控(更新位置)

这种方式可以使您监控超过20个区域(.UpdatingLocation风格)。
但请注意,在应用已终止时无法监控区域。

以下是一个示例

location.regionNotify(notifyStyle: .UpdatingLocation, distanceFilter: 0, locations: locationList, detectFrequency: 5, completion: { (region) in
            print(region.regionState.description())
        }, error: { (error) in
        }
        )

您可以设置locationAccuracy、distanceFilter和detectFrequency属性。

文档 ↩︎

区域监控(显著位置变化)

这种方式可以在应用已终止的情况下监控超过20个区域(需要requestAlwaysAuthorization requestAccess)。
但此请求只会在检测到设备相关小区发生变化时响应新事件。

以下是一个示例

location.regionNotify(notifyStyle: .SignificantLocationChanges, locations: locationList, completion: { (region) in
            print(region.regionState.description())
        }, error: { (error) in
        }
        )

您不需要设置locationAccuracy、distanceFilter和detectFrequency属性。

文档 ↩︎

区域响应信息

public class JRegion:CLCircularRegion {
    public var regionRadius: Double! //the radius of region
    public var regionIdentifier: String! //the region identifier
    public var regionState: RegionState! // region state(inside/outside)
    public var previousIntervalSec: Int! = 0 //the time(seconds) from previous location to current location
    public var previousDate: Date! //the previous location date when you enter
    public var firstNotify: Bool = false //at first when you enter region, it will be true
}

文档 ↩︎

其他

如何设置使用位置服务的请求权限?

您可以通过LocationManager实例设置请求权限。

以下是一个示例

let location: LocationManager = LocationManager()
location.requestAccess = .requestAlwaysAuthorization //default is .requestAlwaysAuthorization 

.requestWhenInUseAuthorization //使用中时

.requestAlwaysAuthorization //始终

文档 ↩︎

如何停止服务?

您可以使用.stopAll停止所有位置服务。

以下是一个示例

location.stopAll()

或者,您可以创建一个标识服务

location.getLocation(detectStyle: .UpdatingLocation, distanceFilter: 0, detectFrequency: 15, identification: "test", completion: { (loc) in
                print(loc.currentLocation.coordinate.latitude.description)
                print(loc.currentLocation.coordinate.longitude.description)
        }
        )

现在,您可以通过标识名称停止此服务。

location.stop(identification: "test")

文档 ↩︎

如何知道当前授权状态已更改?

您可以通过authorizationChange块获取更改事件

以下是一个示例

location.getLocation(detectStyle: .UpdatingLocation, distanceFilter: 0, locationAccuracy: .NearestTenMeters, detectFrequency: 10, completion: { (loc) in
            print(loc.currentLocation.coordinate.latitude.description)
            print(loc.currentLocation.coordinate.longitude.description)
        }, authorizationChange: { (status) in
            //optional (CLAuthorizationStatus)
        }
        )

文档 ↩︎

如何创建多个并发位置服务?

当您创建LocationManager实例时,默认管理的位置服务数量为十。
您可以轻松地获取多个并发位置服务的响应。

以下是一个示例

let location: LocationManager = LocationManager()
location.requestAccess = .requestAlwaysAuthorization

location.getLocation(detectStyle: .UpdatingLocation, distanceFilter: 0, locationAccuracy: .NearestTenMeters, detectFrequency: 10, completion: { (loc) in
            print(loc.currentLocation.coordinate.latitude.description)
            print(loc.currentLocation.coordinate.longitude.description)
        }, authorizationChange: { (status) in
            //optional (CLAuthorizationStatus)
        }
        )
                
location.getLocation(detectStyle: .SignificantLocationChanges, distanceFilter: 0, locationAccuracy: .NearestTenMeters, detectFrequency: 10, completion: { (loc) in
            print(loc.currentLocation.coordinate.latitude.description)
            print(loc.currentLocation.coordinate.longitude.description)
        }, authorizationChange: { (status) in
            //optional (CLAuthorizationStatus)
        }
        )
        
location.regionNotify(notifyStyle: .MonitoringRegion, distanceFilter: 0, locations: locationList, completion: { (region) in
            print(region.regionState.description())
        }, error: { (error) in
        }
        )

如果要让LocationKit管理超过十个并发位置服务,您可以设置检测实例数量。

以下是一个示例

let location: LocationManager = LocationManager(detectInstanceNumber: 20)

文档 ↩︎

许可证

LocationKit可在MIT许可下使用。

版权所有 ©2016 Joe。