您的位置:首页 > 移动开发 > Swift

记一次iOS后台定位上传项目经历(Swift)

2017-07-26 00:00 1331 查看

需求

现在做的是一个物流项目,其中用户端需要获取到车辆的定位信息,结束后绘制成行车轨迹.后台实时上传也就成了一个重要的技术点.

注意点

如果车辆行驶过程中,每隔一段时间上报一次.

如果车辆速度缓慢,根据移动距离上报

如果车辆在某地停留,或者送达后停止上报

APP被用户退出或者被系统kill需要继续上报,应用重新打开后重新上报

<!--more-->

准备工作

在target的Capabilities选项中打开Background Modes 并勾选Location updates
然后在plist中添加Always Usage Description的键 在value中随便键入任何内容
requestAlwaysAuthorization支持Region Monitoring和Significant Location Changes
定位工具类

class RCLocationManger: NSObject {

fileprivate var minSpeed : Double = 3

fileprivate var minFilter : Double = 50

fileprivate var minInteval : Double = 10

static let rcLocationManger = RCLocationManger()
fileprivate var manager : CLLocationManager = {

let manager = CLLocationManager()
manager.requestAlwaysAuthorization()
manager.desiredAccuracy = kCLLocationAccuracyBest
return manager

}()

func start(){

manager.distanceFilter = 10
manager.delegate = self
manager.startUpdatingLocation()

}
func startMonitoring() -> () {
manager.startMonitoringSignificantLocationChanges()
}
func stop() {
manager.stopUpdatingLocation()
}

}

扩展

// MARK: - *** 扩展 ***

extension RCLocationManger {

//计算上报条件
func caculateFilter(location : CLLocation) -> () {
//慢速
if location.speed < self.minSpeed {

//距离
if fabs(self.manager.distanceFilter - self.minFilter) > 0.1 {

self.manager.distanceFilter = minFilter

}

} else {
let lastSpeed = self.minFilter / self.minFilter

if fabs(lastSpeed - location.speed) / lastSpeed > 0.1 || lastSpeed < 0 {

let newSpeed = location.speed + 0.5
let newFilter = newSpeed * self.minInteval

self.manager.distanceFilter = newFilter

}

}

}

// 可在此处上传定位
func saveLocation(location : CLLocation){
//使用realm数据库保存
let realm = try! Realm()
let loc = LocationModel(value: [location.coordinate.latitude,  location.coordinate.longitude, location.timestamp])

try! realm.write {
realm.add(loc)
}

}

}

为了能够正确的在被杀掉的情况下被唤醒 我们还要做最后一步操作 在AppDelegate的didFinishLaunchingWithOptions中加入下面的代码

extension AppDelegate {

func configLocation(launchOptions: [UIApplicationLaunchOptionsKey: Any]?){

if (launchOptions?[UIApplicationLaunchOptionsKey.shortcutItem]) != nil {

RCLocationManger.rcLocationManger.startMonitoring()

}

}

}

Realm数据库集成

步骤

拷贝Realm 和RealmSwift两个Framework到工程

添加libc++库

点击build Phases左上角+号 选择new copy file phases 把destination 改成 framework

最后把两个Framework拷贝进去



不然可能会报这个错如果报这个错Reason: image not found

测试结果



参考文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS Swift 定位上传