上报系统
- 埋点上报
●具体业务代码处、手动添加埋点代码
●友盟统计/百度统计
●无法更改/代码侵入
●预埋使用轮询接口上传日志
●Crash. 上报
- 无埋点上报
●基于基于Runtime/消息转发
●使用Method Swizzling / Aspect/开源框架
●hook通用方法(页面时常、 接口调用、点击)
●动态下发/动态增加删除上报
●唯一标识的问题
ios中的定位服务
●CoreL ocation.framework
●获取设备的地理位置、方向、海拔等信息
●系统通过多种方式获得(WI-FI/ GPS/蓝牙…)
●定位服务的使用
●首次使用需要获取权限
●通过CLLocationManager获得当前的位置
定位权限
两个维度
- 隐私定位服务
CLLocationManager locationServicesEnabled
引导跳转Setting
- 具体app的定位服务
CLLocationManager authorizationStatus
设置info.plist申请权限的具体原因
发起询问
在delegate中处理授权变化
代码演示
定义一个类出来专门弄这个
@interface GTLocation : NSObject
+ (GTLocation *)locationManager;
- (void)checkLocationAuthorization;
@end
#import "GTLocation.h"
#import <CoreLocation/CoreLocation.h>
@interface GTLocation()<CLLocationManagerDelegate>
//这个右面有用
@property(nonatomic, strong, readwrite) CLLocationManager *manager;
@end
@implementation GTLocation
//单例模式
+ (GTLocation *)locationManager{
static GTLocation *location;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
location = [[GTLocation alloc] init];
});
return location;
}
//初始化上面的参数 设置delegate
- (instancetype)init{
self = [super init];
if (self) {
self.manager = [[CLLocationManager alloc] init];
self.manager.delegate = self;
}
return self;
}
- (void)checkLocationAuthorization{
//判断系统是否开启
if(![CLLocationManager locationServicesEnabled]){
//引导弹窗
//
}
if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined){//如果开启了就判断是不是第一次用
[self.manager requestWhenInUseAuthorization];//获取用户使用时候的权限
}
}
#pragma mark - delegate
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
//如果早试用期间改变就在更新一次
if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {
//
[self.manager startUpdatingLocation];
}else if (status == kCLAuthorizationStatusDenied){
//
}
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray<CLLocation *> *)locations {
//地理信息
CLLocation *location = [locations firstObject];
//用于在地理坐标和地名之间转换的接口。
CLGeocoder *coder = [[CLGeocoder alloc] init];
//提交指定位置的反向地理编码请求。
[coder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
//地标信息
}];
[self.manager stopUpdatingLocation];
}
@end
在appdelegate中
[[GTLocation locationManager] checkLocationAuthorization];
在info.plist加入
CLLocationManager
●CLLocationManager
●提供位置相关的操作 ●权限 ●开始或停 止位置相关的服务
●CLLocation
●某个位置的地理信息(经度/维度/海拔…
CL Placemar.k
●地标信息(省市街道…)
●CLLocationManagerDelegate
●位置相关权限更新回调 ●定位成功/失败回调 ●方向/指定区域的进入离开
●CLGeocoder.
●提供CLLocation 和CLPlacemark之间的转换
●模拟器支持坐标信息
定位服务的流程
locationServiceEnabled 服务开关
authorizationStatus 权限申请
didChangeAuthorizationStatus 权限更新
startUpdatingLocation 位置信息获取
didUpdateLocation 位置信息
reverseGeocodeLocation 地标信息
其他的服务
位置的变化,运动的轨迹,速度
后台定位服务
mapkit