当用户打开iOS 7及更高版本的位置服务时收到通知

时间:2015-04-16 12:10:19

标签: ios ios7 ios8 core-location cllocationmanager

我面临的情况是,我们希望根据用户是否启用了位置服务来启动特定流程。这部分是微不足道的。但是,如果用户关闭或打开位置服务,我们希望通过更改我们的流程来扩展此功能。当用户关闭位置服务时,我们目前能够监控,更改或处理。我的问题是,当用户重新启用位置服务时,如何通知我们的应用程序?

以下是我们目前正在使用的内容

  • iOS 7
  • 启用后台位置模式
  • 我们一直在使用位置服务请求

以下是我们尝试的内容

  1. 我们尝试在用户关闭位置服务后设置定时器,以定期检查用户是否重新开启位置服务。由于许多原因,这是不太理想的。除此之外,一旦关闭位置服务,计时器就会被终止,因为不再需要后台服务,操作系统会终止我们的进程。这是可以理解的。
  2. 我们还采用了通知用户他们刚刚停止进程并且需要重新启用位置服务的方法。这种方法存在两个问题。
    1. 如果用户没有启用通知,那么这种做法根本就不好。
    2. 如果他们确实启用了通知,那么我们首先需要用户重新启用位置服务,然后他们需要重新打开应用以让我们的应用“唤醒”备份。
  3. 提前谢谢!

2 个答案:

答案 0 :(得分:1)

经过数小时的研究和实施尝试解决方案,我们发现从iOS 8开始这是不可能的。以下是我们发现的参考:

  1. 我们能够在用户关闭位置服务时收到通知,,如果他们关闭我们应用的位置服务。如果用户关闭主要位置服务,我们没有收到通知。
  2. 如果位置服务已重新启用,我们没有收到消息,无论是我们的位置服务还是主要位置服务。
  3. 您无法使用计时器方法,因为如果将应用程序发送到后台,计时器将被终止。所以我们无法定期检查。 这对我们的用例来说是不可接受的,但值得娱乐
  4. 您仍然可以调用CLLocationManager,就好像您有权使用位置服务一样,即使您没有权限。
  5. 如果您确实调用了CLLocationManager,则在您的应用程序获得权限后,您将开始接收位置消息,而无需重新注册以接收位置消息。

  6. 我们的解决方案:

    4和5的组合是我们拯救的恩典。我们遇到了一个边缘情况,用户可能有资格获得位置事件触发器但以前拒绝使用位置服务,然后在符合条件后,用户授予我们使用位置服务的权限。在进行一些重构后,我们移动了我们的位置管理器,以便我们注册位置事件更新,特别是地理围栏,即使我们没有权限。经过测试,我们发现在边缘案例事件中,我们开始接收位置更新,甚至无需重新初始化位置管理器。对于任何感兴趣的人来说,这同样适用于信标区域监控。

答案 1 :(得分:1)

只需在应用进入前台后检查您的位置服务。

  NotificationCenter.default.addObserver(self, selector: #selector(applicationDidEnterForeground), name: UIApplication.didEnterForegroundNotification, object: nil)

  func applicationDidEnterForeground() {
    print("Location services enabled? \(CLLocationManager.locationServicesEnabled())")
  }