startMonitoring 不适用于“WhenInUseAuthorization”权限

Posted

技术标签:

【中文标题】startMonitoring 不适用于“WhenInUseAuthorization”权限【英文标题】:startMonitoring doesn't work with "WhenInUseAuthorization" permission 【发布时间】:2017-03-12 15:24:03 【问题描述】:

我正在做一个项目,但一个区域的监控功能不起作用。

所以我创建了一个非常简单的项目来测试这个功能。 我发现了一个有趣的情况。

代码如下:

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate 
    @IBOutlet weak var map: MKMapView!

    let clMan = CLLocationManager()

    override func viewDidLoad() 
        super.viewDidLoad()

        map.showsUserLocation = true

        clMan.requestWhenInUseAuthorization()
        clMan.delegate = self
        clMan.startUpdatingLocation()
        clMan.startMonitoring(for:CLCircularRegion(center: CLLocationCoordinate2D.init(latitude:  51.5100888, longitude: -0.134575500000008), radius: 1000, identifier: "Picca")
)

    


    func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) 
        print(region)
    
 

奇怪的是,如果我改变了

requestWhenInUseAuthorization()requestAlwaysAuthorization() 我的代码有效!

我将 Piccadilly Circus 设置为使用该位置的模拟进行测试。 在去伦敦之前,我设置了另一个城市,然后是伦敦!

【问题讨论】:

【参考方案1】:

来自documentation:

如果用户向您的应用授予“使用时”授权,则您的应用可以在前台启动大多数(但不是全部)定位服务。 (应用不能使用任何自动重启应用的服务,例如区域监控或重大位置变更服务。

更多来自documentation:

ios 中,注册区域会在您的应用启动之间保持不变。如果在您的 iOS 应用程序未运行时发生区域边界交叉,系统会在后台自动将其唤醒(或重新启动),以便它可以处理该事件。

【讨论】:

但是区域监控不会重新启动应用程序!但无论如何,谢谢你的回答。 也许你可以提交一个雷达,让你在应用程序处于前台时监控区域。不过我不确定这会有多大用处。

以上是关于startMonitoring 不适用于“WhenInUseAuthorization”权限的主要内容,如果未能解决你的问题,请参考以下文章

没有网络时不调用 CLLocationManagerDelegate -locationManager(_:startMonitoring:)

核心位置 StartMonitoring 后台工作

<ALT+H> 热键不适用于 Visual Studio Code

如何在窗口函数和 Case when 语句中使用除法

Mockito 测试 void 方法抛出异常

SQL之case when then用法(用于分类统计)