欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS开发笔记 -- 实时上传用户的位置(APP被杀死的情况下也要能上传)

程序员文章站 2022-07-13 14:57:01
...
项目需求在用户开启定位权限的情况下,实时上传用户的坐标位置,APP被杀死的情况下也要能上传。

1、勾选 background modes 的 location updates

iOS开发笔记 -- 实时上传用户的位置(APP被杀死的情况下也要能上传)

2、添加 info.plist 定位权限描述
iOS开发笔记 -- 实时上传用户的位置(APP被杀死的情况下也要能上传)

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,可用模拟器实时改变位置进行测试

iOS开发笔记 -- 实时上传用户的位置(APP被杀死的情况下也要能上传)