【问题标题】:CLLocationManager() requestWhenInUseAuthorization() shows up and disappears on simulator and does not show up on actual deviceCLLocationManager() requestWhenInUseAuthorization() 在模拟器上出现和消失,在实际设备上不出现
【发布时间】:2021-04-17 06:31:03
【问题描述】:

我想知道用户的当前位置。但是因为我想从多个地方获取这个位置,所以我为它创建了一个函数,而不是设置一个特定的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 个描述字符串:

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

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

模拟器输出:

【问题讨论】:

    标签: ios swift cllocationmanager clgeocoder


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多