iOS 借助定位实现“保活”策略

疑惑

你是否有过类似的体验,当你刚刚来到一个商业区,命名没打开任何APP,手机就会收到push给你推荐周围的"吃喝玩乐",那他们又是怎么做到的呢?

##解密

其实,我们可以通过监听当位置变化,在用户无感知的情况下在后台悄悄拉齐我们的进行来处理特定的逻辑。

不是感觉很不可思议?不用着急,我们先复习一下iOS定位的相关原理------Core Location

由上图可以看出,系统每次检测到位置变化时,都会产生一个event,然后遍历所有App,查看每个App是否有权限并且是该event的观察者,如果符合条件,系统就会拉起该App的进程。

##试验

建一个空项目,在App启动的时候注册位置监听,并且在首次启动后给App后台访问用户位置的权限,代码如下:

复制代码
@interface AppDelegate ()<CLLocationManagerDelegate>
@property (nonatomic,strong) CLLocationManager  *locationManager;
@end
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    _locationManager = [[CLLocationManager alloc] init];
    _locationManager.delegate = self;
    [_locationManager requestAlwaysAuthorization];
    [_locationManager setAllowsBackgroundLocationUpdates:true];
    [_locationManager startMonitoringSignificantLocationChanges];
    NSLog(@"test:=====didFinishLaunchingWithOptions");
    return YES;
}

注册监听,当用户位置变化时打印log:

复制代码
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
     CLLocation*location = locations[0];
     NSLog(@"test:纬度=========%f 经度===========%f",location.coordinate.latitude,location.coordinate.longitude);
}

准备工作已经就绪,现在开始试验:

1、启动App后同意相关协议,然后杀死App后台。

2、改变设备位置,如果使用模拟器可以开启模拟移动定位,我这里设置的是模拟drive。

3、打开控制台,过滤log如图:

我们可以发现,虽然进程已经被我们主动杀死,但是当位置变化时,系统会将我们的进程拉起,并且执行方法didFinishLaunchingWithOptions中的内容(log:test:=====didFinishLaunchingWithOptions),由于我们在didFinishLaunchingWithOptions方法中注册了位置变化监听,所以当位置发生变化时didUpdateLocations也会被执行到,认证了之前的猜想

##结论
当位置变化时,系统会拉起符合条件的App进程,并执行didFinishLaunchingWithOptions方法里面的内容,并且这种操作是在用户无感知的情况下完成的,我们可以通过这种方式实现后台App进程保活策略。

相关推荐
应用市场3 小时前
把旧 Pixel 变成相册备份中转站(上):Mac 到安卓的照片传输工具设计——流式上传、sha256 校验、adb forward 与 Bonjour
android·macos·adb·kotlin·swift
传奇开心果编程20 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer
茶底世界之下1 天前
视频预览切换为何会闪回旧帧:用 generation + mode identity 管住异步回调
ios·swift
老李IT笔记1 天前
从备份恢复会把管理状态带回来吗:iOS 27 之后答案变了|MDM.Plus
ios·智能手机
谢亮_vipxieliang1 天前
Go 接口设计原则核心知识点
开发语言·ios·golang
Peter(阿斯拉)1 天前
[macOS Tahoe 26]_[使用SmartSVN访问库路径报错的问题]
macos·svn·tahoe·smartsvn·macos26
andyweike1 天前
iOS语法原理
macos·objective-c·cocoa
Hello_Pyhx1 天前
iPhoneMirror:把 iPhone 接入 Windows,先分清投屏与反控
windows·ios·iphone
茶底世界之下2 天前
类型擦除之后,Metal 滤镜组合为什么不能只执行一个 Filter?
ios·swift