【问题标题】:Check user still in region after some time (1min)一段时间后检查用户是否仍在区域中(1 分钟)
【发布时间】:2018-04-07 11:22:57
【问题描述】:

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

当应用程序因 NSTimer 无法工作而被杀死时,它无法工作。如果用户在一段时间后仍然在同一区域,有什么方法可以得到通知?

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

【问题讨论】:

  • AFAIK,如果您的应用是用户退出的,那么操作系统将不再传递 CoreLocation 委托回调。如果应用程序被挂起,那么操作系统将传递委托回调。 NSTimer 工作在既不暂停也不用户退出。
  • @Honey - 区域监控 didEnterLocation、didExitLocation 和 didDetermineState 委托即使在用户退出应用程序后仍然有效。
  • 我上面的问题可以在 android 上运行,我想在 iOS 上做类似的事情
  • 我已经尝试过使用计时器,我们可以对通知做些什么吗?
  • “区域监控 didEnterLocation、didExitLocation 和 didDetermineState 委托即使在用户退出应用程序后仍然有效”您的意思是它适用于 iOS?还是安卓?

标签: ios objective-c swift cllocationmanager geofencing


【解决方案1】:

因为didUpdateLocations 被继续调用,而应用程序在authorizedAlways 下终止。

您可以依赖Date 和didUpdateLocations 而不是Timer,如下所示:

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
        }
    }
}

更新

在 Objective-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
        }
    }
}

【讨论】:

  • @Cintu 是的,如果您已授权Always,并且您使用重大位置更改,您的应用将被唤醒,并且 didupdatelocations 将被调用。
  • 但是对于上述解决方案,我不能使用重大位置更改仪式吗?那么如何让它发挥作用呢?
【解决方案2】:

“如果用户在一段时间后仍然在同一区域,有什么方法可以得到通知?”

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

一种可能的解决方法:

创建一个区域,但打开它的notifyOnExit。只要您没有收到该回调,您就可以假设您仍在该地理围栏中,并尝试使用该回调做一些事情,例如如果您在不到 10 分钟内收到该回调,那么如果您收到该回调就做某事在 10-20 分钟内然后做其他事情,如果您在 20 分钟内收到回调,然后做其他事情,如果您从未收到回调,那么这意味着您仍在该区域,但不幸的是您不会无法获得那个回调:/

话虽如此,geofence aren't entirely reliable。虽然这个问题有点老了。我不确定它的有效性。

此外,如果应用暂停,您的计时器将无法工作。您可以做的是使用核心位置在后台保持应用程序处于活动状态,但以 3 公里的精度使用它(以节省电池但仍保持应用程序处于活动状态),然后创建一个计时器。虽然不是一个很好的解决方案。也许苹果会拒绝它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多