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


    疑惑

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

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

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

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

    ##试验

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

    @interface AppDelegate ()
    @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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
         CLLocation*location = locations[0];
         NSLog(@"test:纬度=========%f 经度===========%f",location.coordinate.latitude,location.coordinate.longitude);
    }
    
    • 1
    • 2
    • 3
    • 4

    准备工作已经就绪,现在开始试验:
    1、启动App后同意相关协议,然后杀死App后台。
    2、改变设备位置,如果使用模拟器可以开启模拟移动定位,我这里设置的是模拟drive。

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

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

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

  • 相关阅读:
    Linux - linux命令进阶
    红眼睛微型成像仪拍照、存储与参数复位
    PyTorch入门之【dataset】
    Linux平台(CentOS7.5)安装GIT服务器+IDEA访问+WEB访问
    基于RK3588全高端智能终端机器人主板
    C++ 并发编程实战 第七章 设计无锁数据结构
    SOC-hello world
    Java实现RSA加密和验证
    浅析分布式锁
    Spring Boot与Reactive MongoDB集成
  • 原文地址:https://blog.csdn.net/u012903898/article/details/133901811