Сегодня я работал над небольшим приложением, чтобы изучить фреймворки MapKit и Apple CoreLocation. Во время этого процесса я столкнулся с чрезвычайно раздражающей ошибкой, из-за которой местоположение пользователя не отображалось в MapView.

Я начал с назначения MKMapView.delegate, а также настройки .showUserLocation(), .showUserLocation() и даже .setUserTrackingMode () в true.

Кроме того, я создал и делегировал соответствующий экземпляр CLLocationManager() и, наконец, даже вызвал .requestWhenInUse(), чтобы активировать приглашение пользователя.

Тем не менее, местоположение пользователя не отображалось на карте, и я не спрашивал типичного блоба разрешения. Я погуглил ошибку:

Попытка запустить обновления местоположения MapKit без запроса авторизации местоположения. Сначала необходимо вызвать -[CLLocationManager requestWhenInUseAuthorization] или -[CLLocationManager requestAlwaysAuthorization].

однако изначально я находил только ответы, такие как этот, в которых упоминались только те шаги, которые я на данный момент уже выполнил.

После разочарования я даже начал использовать операторы print() для проверки текущего статуса авторизации; Честно говоря, это было в основном для моего собственного здравомыслия, потому что я не мог понять, что происходит. И о чудо, статус никогда не менялся.

Что теперь делать? Я почти исчерпал весь свой арсенал ресурсов для решения своих проблем с программированием, не считая запросов на stackoverflow.com или чтения фактической документации. Оба этих варианта меня пугали, потому что первый означал ожидание ответа не менее 2 часов, прежде чем продолжить, а второй казался таким же долгим, учитывая примерно 40 страниц документации и руководств по этому вопросу. Однако прежний выбор даже не был вариантом, так как я уже прошел через пару ответов stackoverflow, и они выявили только те же самые старые шаги. Следовательно, я мог бы игнорировать даже это как вариант.

Так что, в конце концов, я впервые укусил пулю. Я обратился к документации, и мое путешествие началось через жизнь CLLocationManager(). Я ожидал, что это займет не менее 1 часа или больше, и даже тогда я не был уверен, что это может решить проблему, поэтому оставался медленный вариант, также известный как stackoverflow.com.

Однако, как назло, второй абзац после быстрого просмотра выявил настоящую проблему и ее ответ. В конце концов, в моем коде не было ничего плохого, единственное, чего не хватало, это два ключа в info.plist, которые устанавливают сообщения, отображаемые пользователю.

Я попробовал это, и это работало отлично без каких-либо других модификаций. И вот так я закончил и почувствовал, как нарастает волнение, которое я всегда испытываю после того, как что-то сделал правильно или исправил надоедливую ошибку. Но более того, я впервые решил задачу без ссылки на stackoverflow.com, туториалы или ютуб. Это очень важно, потому что просмотр видео или чтение определенного раздела книги по программированию занимает в 3 раза больше времени, чем чтение документации. Более того, документация почти всегда доступна, тогда как видео или учебные пособия могут отсутствовать.

И, наконец, это такой большой AHA-момент для меня, потому что я впервые почувствовал себя настоящим разработчиком. Впервые я понял, что могу исправить почти любую ошибку или проблему, потому что мне удалось решить эту с помощью самого простого инструмента; документация. И потому что этот момент научил меня тому, что документация — это не такая страшная вещь, а скорее то, к чему вы всегда должны обращаться в первую очередь, прежде чем искать ответ в гугле или на ютубе.

Удачного кодирования!
Адриан

PS: Есть конечно еще один уровень. Прочитайте реализацию в источнике. Однако даже этот вариант может не существовать в тех же обстоятельствах из-за лицензирования, и тогда документация — ваш единственный друг.

Наконец, мой ответ stackoverflow.com.

Если вам понравился этот пост, рассмотрите возможность подписаться на меня здесь. Или где-то еще, мне все равно, и это, вероятно, не имеет значения.