NSLocationWhenInUseUsageDesciption Отсутствует в Info.plist
Добрый день, последние пару недель я сталкиваюсь с проблемой в Xcode, которая говорит:
Это приложение пыталось получить доступ к конфиденциальным данным без описания использования. Info.plist приложения должен содержать ключи "NSLocationAlwaysAndWhenInUseUsageDescription" и "NSLocationWhenInUseUsageDescription" со строковыми значениями, объясняющими пользователю, как приложение использует эти данные
В моем информационном листе реализованы оба этих описания использования. Я попытался удалить приложение с телефона (я использую свой iPhone в качестве симулятора). Я попытался реорганизовать свой код, я попытался закомментировать определенные строки, чтобы посмотрим, исчезнет ли сообщение и позволит ли я увидеть мое местоположение. Я пытался удалить и переустановить блоки Google Maps, но ничего. Я попытался прочитать эту проблему в Stackru, medium и GitHub, чтобы узнать, смогу ли я использовать предыдущие советы, которые помогут решить мою проблему. Я даже написал здесь, чтобы посмотреть, смогу ли я получить немного понимания по этому вопросу.
Я понятия не имею, что нужно сделать, чтобы выяснить эту проблему, и я действительно не хочу начинать все сначала. Ниже я опубликую полный код, который довольно обширный. Если у кого-то есть свободное время, чтобы прочитать и сообщить мне, что я сделал неправильно или не реализовал, это будет с благодарностью.
import UIKit
import GoogleMaps
import GooglePlaces
import CoreLocation
class mainViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate, GMSAutocompleteViewControllerDelegate, UITextFieldDelegate {
let currentLocationMarker = GMSMarker()
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.prefersLargeTitles = false
navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor:UIColor.white, NSAttributedStringKey.font: UIFont.systemFont(ofSize: 25)]
myMapView.delegate=self
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.requestAlwaysAuthorization()
locationManager.startMonitoringSignificantLocationChanges()
locationManager.startUpdatingLocation()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
setupViews()
initGoogleMaps()
txtFieldSearch.delegate=self
func initGoogleMaps() {
let camera = GMSCameraPosition.camera(withLatitude: 40.014281, longitude: -83.030914, zoom: 17.0)
self.myMapView.camera = camera
self.myMapView.delegate = self
self.myMapView.isMyLocationEnabled = true
}
func getLocation() {
let status = CLLocationManager.authorizationStatus()
if status == .notDetermined {
locationManager.requestWhenInUseAuthorization()
return
}
if status == .denied || status == .restricted {
let alert = UIAlertController(title: "Location Services Disabled", message: "Please enable Location Services in Settings", preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
alert.addAction(okAction)
present(alert, animated: true, completion: nil)
return
}
}
@objc func btnMyLocationAction() {
let location: CLLocation? = myMapView.myLocation
if location != nil {
myMapView.animate(toLocation: (location?.coordinate)!)
}
}
let myMapView: GMSMapView = {
let v=GMSMapView()
v.translatesAutoresizingMaskIntoConstraints=false
return v
}()
let btnMyLocation: UIButton = {
let btn=UIButton()
btn.backgroundColor = UIColor.white
btn.setImage(#imageLiteral(resourceName: "my_location-1"), for: .normal)
btn.layer.cornerRadius = 25
btn.clipsToBounds=true
btn.tintColor = UIColor.gray
btn.imageView?.tintColor=UIColor.gray
btn.addTarget(self, action: #selector(btnMyLocationAction), for: .touchUpInside)
btn.translatesAutoresizingMaskIntoConstraints=false
return btn
}()
}
2 ответа
Перейдите в настройках сборки цели приложения для "info.plist" и внимательно изучите полный путь. Убедитесь, что вы добавили ключи в правильный список info.plist, который фактически используется официально в качестве info.plist для сборки вашего приложения. Вы также можете нажать на вкладку "Информация" рядом с "Параметры сборки", чтобы убедиться, что там есть две записи.
Вот как это должно выглядеть (обязательно указывайте значение ОБА из них):
Все это объясняется тем, что вам нужно добавить описание, чтобы запросить у пользователя разрешения на местоположение. И для этого нам нужно перейти и отредактировать список свойств:
Под Вашей папкой Вспомогательных файлов в XCode, мы собираемся добавить два новых ключа в Ваш Info.plist ('Конфиденциальность-Местоположение Всегда И Когда Используется Описание Использования' 'и' Конфиденциальность-Местоположение Когда Используется Описание Использования ').
Чтобы сделать это, вы идете в ту часть, где написано "Список свойств информации", и нажмите эту маленькую кнопку добавления (+). И если вы удалите "Категория приложения" и начнете вводить "Конфиденциальность" (с большой буквы), вы увидите всплывающие подсказки.
После нахождения и выбора "Конфиденциальное местоположение всегда и при использовании описания использования" и "Конфиденциальное местоположение при использовании описания использования", следующее, что вам нужно сделать, это дать каждому из них значение. В столбце "Значение" просто напишите это описание "Нам нужно ваше местоположение для…" (возможно, чтобы узнать текущие погодные условия).
Теперь у вас есть два новых ключа, каждый из которых имеет значение типа данных String.