iOS 不同需求下的定位

来源:互联网 发布:淘宝怎么增加买家信用 编辑:程序博客网 时间:2024/06/05 00:33

作为iOS定位

不同需求实现的方式肯定也是不一样的

1 用户位置持续变化的每隔一段时间就上报一次

2 用户移动速度很慢每隔一段距离上报一次

3 用户到达某处的时候没有变化就不上报

1的思路就是用定时器按时向服务器上传用户的当前坐标

可以使用CLLocationManager的代理CLLocationManagerDelegate函数

didupdateLoactions获取当前的坐标

-(void)locationManager:(CLLocationManager *)manager    didUpdateLocations:(NSArray *)locations
需要注意的是 因为要保持后台定时的上传给服务器坐标,则需要声明后台权限,但是后台权限大家都知道是有VOIP,后台定位等的,那就可以直接在info.plist文件中加入

Privacy - Location Always Usage Description
就行

然后在初始化定时器的时候加入

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{        NSLog(@"一直开启后台定位");    }];

2的思路是根据当前用户的位置进行上传坐标 可以把它设置成一个范围进行比较然后上传 这个也是参照网上的 distanceFilter = currentSpeed*minInterval 这样做的优点就是节省系统的资源。

先初始化,为以后的比较设置默认值

    self.minSpeed = 3;    self.minFilter = 50;    self.minInteval = 10;    locationManage.distanceFilter  = self.minFilter;

根据需要上传下面代码的意思是先判断当前的速度的,如果小于当前设置的最小速度就设置用户最小的移动范围,如果大于当前设置的最小速度,就获取当前速度,如果变化超过10%。就设置用户当前速度浮动0.5,设置新的移动范围。这些其实都是活的,可以根据自己的需要进行设置。


- (void)adjustDistanceFilter:(CLLocation*)location{    //    NSLog(@"adjust:%f",location.speed);        if ( location.speed < self.minSpeed )    {        if ( fabs(locationManage.distanceFilter-self.minFilter) > 0.1f )        {            locationManage.distanceFilter = self.minFilter;        }    }    else    {        CGFloat lastSpeed = locationManage.distanceFilter/self.minInteval;                if ( (fabs(lastSpeed-location.speed)/lastSpeed > 0.1f) || (lastSpeed < 0) )        {            CGFloat newSpeed  = (int)(location.speed+0.5f);            CGFloat newFilter = newSpeed*self.minInteval;                        locationManage.distanceFilter = newFilter;        }    }}


Demo是封装成单例 便于操作使用
Demo http://download.csdn.net/detail/rpf2014/9692350


0 0