iOS开发笔记 -- 实时上传用户的位置(APP被杀死的情况下也要能上传)
程序员文章站
2022-07-13 14:57:01
...
项目需求在用户开启定位权限的情况下,实时上传用户的坐标位置,APP被杀死的情况下也要能上传。
1、勾选 background modes 的 location updates
2、添加 info.plist 定位权限描述
3、新建一个继承 CLLocationManager 的单例文件
*** .h文件 ***
#import <Foundation/Foundation.h>
@import CoreLocation;
@import UIKit;
typedef void(^Number)(NSString *number);
@interface XQLocationManager : CLLocationManager
@property (nonatomic, copy) Number valueBlock;
+ (instancetype)sharedManager;
@end
*** .m文件 ***
#import "XQLocationManager.h"
@interface XQLocationManager()<CLLocationManagerDelegate>
@end
@implementation XQLocationManager
+ (instancetype)sharedManager {
static XQLocationManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[XQLocationManager alloc] init];
});
return instance;
}
- (instancetype)init {
self = [super init];
if (self) {
self.delegate = self;
self.desiredAccuracy = kCLLocationAccuracyBest;
}
return self;
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
/*
* 用户的坐标点
*/
CLLocation *location = locations[0];
NSLog(@"latitude --- %f,longitude --- %f", location.coordinate.latitude, location.coordinate.longitude);
/*
* 速度
*/
double speed = location.speed > 0 ? location.speed : 0;
CGFloat km = speed * 3.6; // km/h
NSLog(@"速度 --- %.2f", km);
/*
* 速度大于 设置的 规定的值,上传至服务器
*/
if (km > 100) {
// 上传至服务器的操作
// **** 模拟存储 在APP杀死的情况下 是否能够唤醒 并存储 ****
NSString *number = @"0";
if ([[NSUserDefaults standardUserDefaults]objectForKey:@"number"]) {
number = [[NSUserDefaults standardUserDefaults]objectForKey:@"number"];
}
number = [NSString stringWithFormat:@"%.2f", number.floatValue + 1];
[[NSUserDefaults standardUserDefaults]setObject:number forKey:@"number"];
if (self.valueBlock) {
self.valueBlock(number);
}
}
}
@end
4、使用方式
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
[[XQLocationManager sharedManager] requestAlwaysAuthorization];
#endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000
if (@available(iOS 9.0, *)) {
[[XQLocationManager sharedManager] setAllowsBackgroundLocationUpdates:YES];
} else {
// Fallback on earlier versions
}
#endif
[[XQLocationManager sharedManager] startUpdatingLocation];
startUpdatingLocation 是实时定位用户的位置,当APP被杀死的时候 应切换成 startMonitoringSignificantLocationChanges 当用户位置发生一定变化时,APP才会被唤醒 才能上传用户所在的位置。
[[XQLocationManager sharedManager] startMonitoringSignificantLocationChanges];
具体效果 见 demo,可用模拟器实时改变位置进行测试
上一篇: IO流的使用
下一篇: 容器化环境内的数据流