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

时间:2021-01-12 10:04:31

标签: ios swift cllocationmanager clgeocoder

我想知道用户的当前位置。但由于我想从多个位置获取此位置,因此我为其创建了一个函数,而不是将特定的 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。位置请求在消失之前会在模拟器上短暂弹出。但是当它短暂可见时,弹出窗口是不可交互的。它永远不会出现在实际设备上。

模拟器输出:

1 个答案:

答案 0 :(得分:0)

原来我遇到了与这篇文章相同的问题: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)
        }
    }
}
相关问题