首页 > 解决方案 > 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。位置请求会在模拟器上短暂弹出,然后消失。但是当弹出窗口短暂可见时,它是不可交互的。而且它永远不会出现在实际设备上。

模拟器上的输出:

标签: iosswiftcllocationmanagerclgeocoder

解决方案


原来我和这篇文章有同样的问题:调用 [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)
        }
    }
}

推荐阅读