Что определяет присутствие значка iPhone Location Services в строке состояния?

Вот моя ситуация. Я разрабатываю приложение iPhone, использующее Core Location для определения местоположения устройства. Существует значок: значок службы местоположения, который отображается в строке состояния устройства. Я знаю достаточно, чтобы сказать, что цель значка - сообщить пользователю, что службы местоположения в настоящее время используются чем-то. Для проницательного пользователя это означает сокращение времени автономной работы. По этой причине я хочу быть уверенным, что значок отображается только тогда, когда службы местоположения фактически используются моим приложением.

Введите путаницу. Мы, как разработчики, не получаем доступ к строке статуса через официальный SDK. Это означает, что ОС отобразит этот значок автоматически в зависимости от поведения приложения. Попытайтесь, как я мог, я не могу найти четкое определение того, что именно заставляет этот значок отображаться.

Как он есть, значок появляется до того, как мой делегат приложения получит контроль и останется видимым, пока приложение установлено, работает или нет. Это, безусловно, наихудший вариант, и это заставило меня сомневаться в моем использовании CLLocationManager. Я хотел бы подробно остановиться на моем использовании, но в качестве крайнего случая я попытался удалить среду CoreLocation (и структуру MapKit, которая, как я подозреваю, также использует CoreLocation), и весь код, относящийся к местоположению. Приложение по-прежнему вызывало появление значка и осталось до тех пор, пока я не удалю приложение. Затем я сделал совершенно новое приложение и не внес никаких изменений, кроме как изменить идентификатор приложения, чтобы он соответствовал идентификатору моего приложения. Икона все еще появилась. Я изменил идентификатор, чтобы использовать идентификатор одного из моих приложений, которые не использовали местоположение, и значок не отображался. Во время этого тестирования я убедился в reset устройстве.

Эта проблема действительно убивает меня. Я не могу себе представить, какой идентификатор приложения имеет отношение к значку служб местоположения, но я не вижу другой причины для его сохранения. Кажется, что Red Herring скрывает реальную проблему, но я в недоумении относительно реальной проблемы.

Ответы

Ответ 1

Вот обновление и решение, которое я придумал после некоторых попыток. Поскольку моя проблема была явно связана с тем, что ОС установила некоторую связь между моим идентификатором приложения и значком служб местоположения, я попытался сбросить предупреждения о местоположении устройства, о которых я изначально не знал, что мог. Для любопытных это можно выполнить с помощью приложения "Настройки", затем "Общие" > Reset > Reset Предупреждения о местоположении. Сделав это Reset и после повторной установки приложения, он снова попросил использовать службы местоположения. Теперь значок отображается точно на startUpdatingLocation и точно исчезает на stopUpdatingLocation, точно так, как я изначально планировал.

Я понятия не имею, что изначально вызвало это условие, и я не сомневаюсь, что само условие является ошибкой ОС, как указано Мэтью Фредериком, но, по крайней мере, в моем случае это условие излечимо.

Ответ 2

Там есть известная ошибка, которая вызывает эту проблему. Я сообщил об этом Apple пару месяцев назад и был проинформирован о том, что это был обман известной проблемы. К сожалению, он, похоже, не исправлен.

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

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

Хуже того, если приложение действительно получило разрешение в прошлом, а затем удалено, то установлена ​​обновленная версия приложения, отображается не только значок, но обновленное приложение больше не получает информацию о местоположении" > strong > , потому что приложение никогда не запрашивает разрешение ОС на местоположение. Это эффективно отрицательно.

Очень расстраивает меня и небольшое число моих пользователей.

Ответ 3

Вы не включили параметр местоположения в ключе UIBackgroundModes вашего приложения .plist, не так ли?