当前位置: 首页 > news >正文

疯狂ios讲义之使用CoreLocation定位(4)

spacer.gif9.4区域监测

如果希望iOS设备进入某个区域发出通知,那么这种区域监测的功能也被称为临近警告。所谓临近警告的示意图如图9.6所示。

wKiom1M-D-DzZ_JwAABPV7jiVUs866.jpg

9.6临近警告的示意图

用户设备不断地临近指定固定点,当与该固定点的距离小于指定范围时,系统可以触发相应的处理。用户设备离开指定固定点,当与该固定点的距离大于指定范围时,系统也可以触发相应的处理。

iOS的区域监测同样可以使用CLLocationManager来实现,监听设备是否进入/离开某个区域的步骤如下。

创建CLLocationManager对象,该对象负责获取定位相关信息,并为该对象设置一些必要的属性。对于区域监测而言,CLLocationManager对象需要设置monitoredRegions属性,该属性值用于设置该设备监听的多个区域。

CLLocationManager指定delegate属性,该属性值必须是一个实现CLLocationManagerDelegate协议的对象。实现CLLocationManagerDelegate协议时可根据需要实现协议中特定的方法。

调用CLLocationManagerstartMonitoringForRegion:方法进行区域监测。区域监测结束时,可调用stopMonitoringForRegion:方法结束区域监测。

当设备进入指定区域时,iOS系统将会自动激发CLLocationManagerdelegate对象的locationManager:didEnterRegion:方法;当设备离开指定区域时,iOS系统将会自动激发CLLocationManagerdelegate对象的locationManager:didExitRegion:方法,开发者可重写这两个方法对用户进行提醒。

iOS提供了CLRegion来定义被监测的区域,但实际编程中推荐使用CLCircularRegionCLRegion的子类)创建圆形区域,创建CLCircularRegion对象时无非就是指定圆心、半径等信息,非常简单。下面示例会进行详细示范。

新建一个SingleView Application,该应用无须修改界面设计文件,直接修改视图控制器类的实现部分来监测设备是否进入、离开某个区域。该示例的视图控制器类的实现部分代码如下。

程序清单:codes/09/9.4/RegionMonitor/RegionMonitor/FKViewController.m

@interface FKViewController ()<CLLocationManagerDelegate>

@property (retain,nonatomic) CLLocationManager*locationManager;

@end

@implementation FKViewController

- (void)viewDidLoad

{

[superviewDidLoad];

if([CLLocationManager locationServicesEnabled])

{

self.locationManager = [[CLLocationManager alloc] init];

self.locationManager.delegate = self;

// 定义一个CLLocationCoordinate2D作为区域的圆心

CLLocationCoordinate2D companyCenter;

companyCenter.latitude = 23.126272;

companyCenter.longitude = 113.395568;

// 使用CLCircularRegion创建一个圆形区域,半径为500

CLRegion* fkit = [[CLCircularRegionalloc] initWithCenter:companyCenter

radius:500 identifier:@"fkit"];

// 开始监听fkit区域

[self.locationManagerstartMonitoringForRegion:fkit];

}

else

{

// 使用警告框提醒用户

[[[UIAlertView alloc] initWithTitle:@"提醒"

message:@"您的设备不支持定位" delegate:self

cancelButtonTitle:@"确定"otherButtonTitles: nil] show];


}

}

// 进入指定区域以后将弹出提示框提示用户

-(void)locationManager:(CLLocationManager*)manager

didEnterRegion:(CLRegion *)region

{

[[[UIAlertView alloc] initWithTitle:@"区域检测提示"

message:@"您已经【进入】疯狂软件教育中心区域内!" delegate:nil

cancelButtonTitle:@"OK" otherButtonTitles:nil] show];

}

// 离开指定区域以后将弹出提示框提示用户

-(void)locationManager:(CLLocationManager*)manager

didExitRegion:(CLRegion *)region

{

[[[UIAlertView alloc] initWithTitle:@"区域检测提示"

message:@"您已经【离开】疯狂软件教育中心区域!" delegate:nil

cancelButtonTitle:@"OK" otherButtonTitles:nil] show];

}

@end


正如上面程序中的粗体字代码所看到的,第1行粗体字代码创建了一个CLRegion对象作为被监测区域,接下来调用CLLocationManagerstartMonitoringForRegion:方法监听该设备是否进入/离开指定区域。

当该设备进入或离开指定区域时,iOS系统都会自动激发CLLocationManagerdelegate对象的相应方法,上面程序重写了这两个方法对用户进行提醒。

编译、运行该程序,如果将模拟器的位置设为{23.126272, 113.395568},此时设备将会进入“疯狂软件教育中心区域内”,系统将会显示如图9.7所示的提示。

编译、运行该程序,如果将模拟器的位置设为其他位置,使之离开{23.126272, 113.395568}超过500米,此时设备将会离开“疯狂软件教育中心区域内”,系统将会显示如图9.8所示的提示。

wKiom1M-D_-iM1-sAABrsuIqDaw454.jpg

9.7进入区域提示

wKioL1M-D9fwiK6mAABp5OqxSU8595.jpg

9.8 离开区域提示


相关文章:

  • 前进的方向不一定都是对的,但是探索本身无法改变
  • TCP拥塞控制
  • JS 下拉菜单
  • usr/bin/ld: cannot find -lxxx
  • 学会给予
  • JSP中的九大内置对象和四大作用域
  • Mysql 大数据量导入程序
  • 配置RD网关实现直接访问内网
  • ASP.NET配合CKEditor上传图片(二)
  • 导航状态尺寸
  • ubuntu下启动system-config-kickstart报错的解决办法
  • iOS - Swift NSPoint 位置
  • Zabbix自定义监控详解
  • 【NetApp】Actice Directory authentication
  • lua工具库penlight--07函数编程(一)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • CentOS7 安装JDK
  • ES6系列(二)变量的解构赋值
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Invalidate和postInvalidate的区别
  • Java|序列化异常StreamCorruptedException的解决方法
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Vue 重置组件到初始状态
  • webpack入门学习手记(二)
  • 分类模型——Logistics Regression
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端之Sass/Scss实战笔记
  • 算法-图和图算法
  • 为什么要用IPython/Jupyter?
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​queue --- 一个同步的队列类​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #define、const、typedef的差别
  • #laravel 通过手动安装依赖PHPExcel#
  • #传输# #传输数据判断#
  • $L^p$ 调和函数恒为零
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (C语言)fread与fwrite详解
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (三十五)大数据实战——Superset可视化平台搭建
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)Sublime Text3配置Lua运行环境
  • (转)关于多人操作数据的处理策略
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • ::什么意思
  • @Autowired注解的实现原理
  • [\u4e00-\u9fa5] //匹配中文字符
  • [<死锁专题>]
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [AIGC] Spring Interceptor 拦截器详解
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]