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

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

1、勾选 background modes 的 location updates

这里写图片描述

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

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

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值