CLLocationManager() requestWhenInUseAuthorization() 在模拟器上出现和消失,在实际设备上不出现

如何解决CLLocationManager() requestWhenInUseAuthorization() 在模拟器上出现和消失,在实际设备上不出现

我想知道用户的当前位置。但由于我想从多个位置获取此位置,因此我为其创建了一个函数,而不是将特定的 UIViewController 设置为委托处理程序。

获取用户位置的方法

func getUserLocation(completion: @escaping (String?) -> Void) {
    
    let locationManager = CLLocationManager()
    let geoCoder = CLGeocoder()
    
    let authorizationStatus = CLLocationManager.authorizationStatus()
    print("Authorization status: ",authorizationStatus.rawValue,",CLAuthorizationStatus.notDetermined.rawValue)
    
    if authorizationStatus == CLAuthorizationStatus.notDetermined {
        print("Asking for location authorization")
        locationManager.requestWhenInUseAuthorization()
    }
    if authorizationStatus == CLAuthorizationStatus.denied {
        completion(nil)
    }
    
    if authorizationStatus == CLAuthorizationStatus.authorizedWhenInUse || authorizationStatus == CLAuthorizationStatus.authorizedAlways {
        if CLLocationManager.locationServicesEnabled() {
                guard let currentLocation = locationManager.location else { return completion(nil) }

                geoCoder.reverseGeocodeLocation(currentLocation) { (placemarks,error) in
                    guard let currentLocPlacemark = placemarks?.first else { return completion(nil) }
                    print(currentLocPlacemark.country ?? "No country found")
                    print(currentLocPlacemark.isoCountryCode ?? "No country code found")
                    guard let isoCode = currentLocPlacemark.isoCountryCode else { return completion(nil) }
                    
                    completion(isoCode)
                }
            }
    }
}

func incrementLocationInFirebase() {
    getUserLocation { (location) in
        if let location = location {
            //Save Location to Firebase
            print("Location: ",location)
        }
    }
}

func decrementLocationInFirebase() {
    // Fetch saved location
    // Decrement from firebase
}

我已经设置了 2 个描述字符串:

  • 隐私 - 位置使用说明
  • 隐私 - 使用时的位置使用说明

我从 incrementLocationInFirebase() 的主视图控制器调用 viewDidAppear。位置请求在消失之前会在模拟器上短暂弹出。但是当它短暂可见时,弹出窗口是不可交互的。它永远不会出现在实际设备上。

模拟器输出

解决方法

原来我遇到了与这篇文章相同的问题:Alert view disappears on its own when calling [locationManager requestWhenInUseAuthorization];

现在我在主 UIViewController 中创建位置管理器并将其传递给处理函数。

func getUserLocation(locationManager: CLLocationManager,completion: @escaping (String?) -> Void) {
    
//    let locationManager = CLLocationManager()
    let geoCoder = CLGeocoder()
    
    let authorizationStatus = CLLocationManager.authorizationStatus()
    print("Authorization status: ",authorizationStatus.rawValue,",CLAuthorizationStatus.notDetermined.rawValue)
    
    if authorizationStatus == CLAuthorizationStatus.notDetermined {
        print("Asking for location authorization")
        locationManager.requestWhenInUseAuthorization()
    }
    if authorizationStatus == CLAuthorizationStatus.denied {
        completion(nil)
    }
    
    if authorizationStatus == CLAuthorizationStatus.authorizedWhenInUse || authorizationStatus == CLAuthorizationStatus.authorizedAlways {
        if CLLocationManager.locationServicesEnabled() {
                guard let currentLocation = locationManager.location else { return completion(nil) }

                geoCoder.reverseGeocodeLocation(currentLocation) { (placemarks,error) in
                    guard let currentLocPlacemark = placemarks?.first else { return completion(nil) }
                    print(currentLocPlacemark.country ?? "No country found")
                    print(currentLocPlacemark.isoCountryCode ?? "No country code found")
                    guard let isoCode = currentLocPlacemark.isoCountryCode else { return completion(nil) }
                    
                    completion(isoCode)
                }
            }
    }
}

func incrementLocationInFirebase(locationManager: CLLocationManager) {
    getUserLocation(locationManager: locationManager) { (location) in
        if let location = location {
            //Save Location to Firebase
            print("Location: ",location)
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?