地理围栏 - 检查用户是不是已经在围栏内
Posted
技术标签:
【中文标题】地理围栏 - 检查用户是不是已经在围栏内【英文标题】:geofence - check if user is already inside the fence地理围栏 - 检查用户是否已经在围栏内 【发布时间】:2014-09-11 05:04:42 【问题描述】:ios 7.1 及更高版本中的地理围栏。因此,当用户已经在地理围栏内并说看到应用程序的广告时,然后才从应用程序商店下载该应用程序并打开该应用程序。此时,应用程序需要给用户一个特定的消息(但只有这一次)。如何做到这一点?
稍后应用注册该区域并正常监控它,以便当用户进入和退出该区域时,会发生特定的事情。
我觉得这应该是一个已解决的问题。 IE。应该有一种可靠的方法来确定用户在监控开始时是否已经在某个区域内,但我没有找到任何关于如何使用给定 API 完成此操作的指针。
当应用程序在这种情况下启动时,我在 iphone 5s 中看到以下 api 序列
locationManager startMonitoringForRegion
<location permission popup>
locationManager:didStartMonitoringForRegion: (in this delegate method i can call the below to check if the device is already inside the region)
|-locationManager requestStateForRegion:
locationManager:didDetermineState: (fired as a result of the requestStateForRegion: call)
但是 locationManager:didDetermineState: 也会在区域进入和退出时被调用
locationManager:didExitRegion:
locationManager:didDetermineState:
那么我是否需要存储已显示特定区域和初始消息的状态?因此,如果该状态存在,请不要显示它..听起来很哈克!
【问题讨论】:
您希望多久显示一次此消息?听起来您想在应用程序的整个生命周期内每个区域显示一次消息。在这种情况下,您已经需要存储每个区域的消息显示状态。如果您想区分入口/出口和“我在该区域内发射”之间的区别,似乎前者通常只发生在后台,而后者将发生在前台。也许[[UIApplication sharedApplication] applicationState]
对您的用例有用。
是的,我想区分入口/出口和“我第一次在该区域内发射”之间的区别。由于应用程序可以启动多次,除非如上所述,应用程序在本地存储和管理每个区域的消息显示状态,否则 applicationState 不会是确定的。我这样想对吗?
【参考方案1】:
要在监控开始时确定应用是否在某个区域内,请执行以下操作:
[locationManager requestStateForRegion: region];
当 CLLocationManager 确定给定区域的状态时,以下内容将发送给其委托:
- (void)locationManager:(CLLocationManager *)manager
didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
// When regions are initialized, see if we are already within the geofence.
switch (state)
case CLRegionStateInside:
// We are in the region.
break;
case CLRegionStateUnknown:
case CLRegionStateOutside:
default:
break;
【讨论】:
以上是关于地理围栏 - 检查用户是不是已经在围栏内的主要内容,如果未能解决你的问题,请参考以下文章