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

项目需求在用户开启定位权限的情况下,实时上传用户的坐标位置,APP被杀死的情况下也要能上传。

1、勾选 background modes 的 location updates

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

2、添加 info.plist 定位权限描述
这里写图片描述

3、新建一个继承 CLLocationManager 的单例文件

*** .h文件 ***

#import 
@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被杀死的情况下也要能上传)_第2张图片

你可能感兴趣的:(iOS开发笔记)