测试已测试 | ✗ |
Lang语言 | SwiftSwift |
许可证 | MIT |
发布上次发布 | Sep 2017 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 joehour 维护。
一种简单的方法,用于在iOS上获取设备的当前位置和地理区域监控(Swift)。
LocationKit提供异步的基于块的获取当前位置和区域监控方式。它可以管理多个同时进行的定位和区域请求。每个请求可以指定其自己的设置,如检测类型(一次性,更新位置或重大位置变化),精度级别,检测频率和距离过滤器。
将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属性设置。
distanceFilter: double value //meter
locationAccuracy: .Best //kCLLocationAccuracyBest
locationAccuracy: .BestForNavigation //kCLLocationAccuracyBestForNavigation
locationAccuracy: .HundredMeters //kCLLocationAccuracyHundredMeters
locationAccuracy: .Kilometer //kCLLocationAccuracyKilometer
locationAccuracy: .NearestTenMeters //kCLLocationAccuracyNearestTenMeters
locationAccuracy: .ThreeKilometers //kCLLocationAccuracyThreeKilometers
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。