ios - 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
。位置请求会在模拟器上短暂弹出,然后消失。但是当弹出窗口短暂可见时,它是不可交互的。而且它永远不会出现在实际设备上。
模拟器上的输出:
解决方案
原来我和这篇文章有同样的问题:调用 [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)
}
}
}
推荐阅读
- mongodb - parse-server 聚合函数返回空结果
- powershell - Powershell 排序哈希表
- django - Django-Rest-Framework 系统检查自定义 HTTP 标头(应用程序 - 令牌)
- angular - 在 Electron 的透明窗口中获取阴影
- c++ - 隐藏空基类以进行聚合初始化
- kubernetes - 如何将自定义 DNS 与 cluster.local 一起用于 kubernetes
- database - How to find mongodb document by id without a search?
- google-bigquery - 使用循环在大查询中自动创建变量序列
- kubernetes - Spinnaker:管理员登录页面上出现意外的令牌“<”
- javascript - 将动态 HTML 表中的数据保存到 MySql 数据库