Ios 一段时间后(1分钟)检查用户是否仍在区域内

Ios 一段时间后(1分钟)检查用户是否仍在区域内,ios,objective-c,swift,cllocationmanager,geofencing,Ios,Objective C,Swift,Cllocationmanager,Geofencing,我已经为地理围栏实施了区域监控。 现在我需要检查用户在1分钟后是否仍在同一区域。 我已添加NSTimer 1分钟,并检查了didDetermineState。它适用于前景和背景模式 当应用程序被杀死时它不工作,因为NSTimer无法工作。如果用户在一段时间后仍在同一地区,有没有办法得到通知 任何帮助都将不胜感激。谢谢 如果用户在一段时间后仍在同一地区,有没有办法得到通知? 据我所知不是这样。区域由操作系统管理,计时器由应用程序管理。如果应用程序终止,计时器将被杀死。区域保持活力 可能的解决方法:

我已经为地理围栏实施了区域监控。 现在我需要检查用户在1分钟后是否仍在同一区域。 我已添加NSTimer 1分钟,并检查了
didDetermineState
。它适用于前景和背景模式

当应用程序被杀死时它不工作,因为NSTimer无法工作。如果用户在一段时间后仍在同一地区,有没有办法得到通知

任何帮助都将不胜感激。谢谢

如果用户在一段时间后仍在同一地区,有没有办法得到通知?

据我所知不是这样。区域由操作系统管理,计时器由应用程序管理。如果应用程序终止,计时器将被杀死。区域保持活力

可能的解决方法:

创建一个区域,但启用其属性。只要你没有收到回叫,你可以假设你还在那个地理围栏里,试着用回叫做点什么,比如如果你在10分钟内收到回叫,然后做点什么如果你在10-20分钟内收到回叫,然后做点别的,如果你在20分钟内收到回电,那么做一些其他的事情,如果你没有收到回电,那么这意味着你仍然在那个区域,但不幸的是,你将无法收到回电:/

话说回来。虽然这个问题有点老了。我不确定它有多有效


此外,如果应用程序被挂起,您的计时器将无法工作。你可以使用core location在后台保持应用程序的活动状态,但要以3公里的精度使用它(保留电池但仍保持应用程序的活动状态),然后创建一个计时器。但这不是一个很好的解决方案。也许苹果会拒绝它

由于
didUpdateLocations
在应用程序在
authorizedAllways
下终止时以持续方式被调用

您可以使用
Date
didUpdateLocations
代替计时器,如下所示:

var locatonTimestamp:Date?

override func viewDidLoad()
{
    super.viewDidLoad()
    self.locatonTimestamp = Date()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
    if let _ = locations.first
    {
        let now = Date()
        let interval = (self.locatonTimestamp != nil) ? now.timeIntervalSince(self.locatonTimestamp!) : 0

        //it will pass this condition every 60 secs
        if self.locatonTimestamp == nil || interval >= 60
        {
            self.locatonTimestamp = now
            //do your region checking here
        }
    }
}
更新

在目标c中:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.locatonTimestamp = [NSDate new];
}

-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
    if (locations.count > 0)
    {
        NSDate *now = [NSDate new];
        NSTimeInterval interval = (self.locatonTimestamp != nil) ? [now timeIntervalSinceDate:self.locatonTimestamp] : 0;

        //it will pass this condition every 60 secs
        if (self.locatonTimestamp == nil || interval >= 60)
        {
            self.locatonTimestamp = now;
            //do your region checking here
        }
    }
}
-(void)viewDidLoad
{
[超级视图下载];
self.locatonTimestamp=[NSDate new];
}
-(无效)位置管理器:(CLLocationManager*)管理器更新位置:(NSArray*)位置
{
如果(locations.count>0)
{
NSDate*now=[NSDate new];
NSTimeInterval interval=(self.locatonTimestamp!=nil)?[现在timeIntervalSinceDate:self.locatonTimestamp]:0;
//它将每60秒通过一次此条件
如果(self.locatonTimestamp==nil | | interval>=60)
{
self.locatonTimestamp=now;
//你的地区在这里检查吗
}
}
}

AFAIK,如果您的应用程序是用户退出,那么操作系统将不再传递CoreLocation委托回调。如果应用程序被挂起,那么操作系统将传递委托回调。NSTimer既不能在挂起状态下工作,也不能在用户退出状态下工作。@蜂蜜-区域监视didEnterLocation、didExitLocation和DidDetermingEstate代理即使在用户退出应用程序后也能工作。我上面的问题在android中也能工作,我想在IOS中也能做类似的事情。我已经尝试过使用计时器,我们能对通知做些什么吗?“即使在用户退出应用程序后,区域监视didEnterLocation、didExitLocation和DidDetermingEstate代理也可以工作“你的意思是它对iOS有效?或者对于Android?@Cintu是的,如果您有授权通道,并且您使用了显著的位置更改,您的应用程序将被唤醒,并且didupdatelocations将被调用。但是对于上述解决方案,我不能使用显著的位置更改?那么如何让它工作呢?