记一次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
测试结果
参考文档
相关文章推荐
- fileupload学到的东西---一次文件上传项目经历
- iOS开发:后台定位并上传数据到服务器
- iOS后台持续上传定位数据(系统自带的方法)
- iOS开发>学无止境 - 后台定位上传的代码实践
- iOS后台持续定位并定时上传
- IOS开发Swift使用NSURLSessionUploadTask实现后台上传功能
- iOS后台持续定位并定时上传
- 记一次用ASP.NET AJAX上传文件项目的经历
- ios开发 后台定位上传
- iOS 后台定位
- iOS开发项目实战——Swift实现图片轮播与浏览
- IOS Swift3.1 界面中画定位线
- iOS项目开发实战——开发基于Handoff的App(Swift)
- IOS swift使用webView加载网页上传文件报错:whose view is not in the window hierarchy!
- iOS NSURLSession 实现网络请求-文件下载-上传-后台下载
- IOS 后台定位并向服务器发送当前位置
- iOS后台定位
- IOS持续的后台定位