Почему iOS 13 Core Location иногда возвращает местоположения с координатой 0,0 на заднем плане? - PullRequest
2 голосов
/ 09 октября 2019

Для контекста я работаю над приложением, которое требует разрешения authorizedAlways. Со времени выпуска iOS 13 мы заметили, что ~ 3-4% наших пользователей получают обновления местоположения (от didUpdateLocations), которые имеют координаты 0,0 и horizontalAccuracy 2500. Это, кажется, только происходитпока приложение находится в фоновом режиме.

Это все очень запутанно, учитывая, что приложение регистрирует все изменения статуса авторизации (используя didChangeAuthorization), и ни в коем случае я не вижу никаких изменений в значении, отличном от authorizedAlways. Тем не менее, основываясь на ручном тестировании, которое я сделал, кажется, что приложение будет уведомлено об изменении статуса authorizedAlways после того, как пользователь нажмет начальную подсказку requestAlwaysAuthorization с Allow While Using App. Затем, когда пользователь на какое-то время создает фоновое приложение, он воспроизводится с двумя вариантами: Keep Only While Using или Change to Always Allow. Кажется, что приложение получает уведомление об изменении статуса авторизации только в том случае, если пользователь продолжает выбор Keep Only While Using (а приложение уведомляется об изменении authorizedWhenInUse.)

У меня была гипотеза, чтокакое-то странное состояние между пользователем, запрашиваемым для фонового использования (или ОС, определяющая запрос, требуется) и пользователем, фактически отвечающим на приглашение, но мое тестирование довольно последовательно показало, что в этом состоянии приложение просто не получает никакого местоположенияОбновления.

Я столкнулся с проблемой устранения неполадок и надеюсь, что это просто ошибка iOS 13, но я еще не слышал о других приложениях, сталкивающихся с этой проблемой. Буду очень признателен за любые предложения относительно дальнейших идей по устранению неполадок или просто за то, что ваше приложение также столкнулось с этой проблемой, так что я могу перестать биться об этом!

1 Ответ

2 голосов
/ 09 октября 2019

Это звучит как ошибка. Если местоположение недопустимо, оно должно иметь отрицательное значение для horizontalAccuracy, но это определенно недопустимое местоположение. Запустите с CLLocationCoordinate2D по CLLocationCoordinate2DIsValid() или сравните его с kCLLocationCoordinate2DInvalid, но, поскольку у вас есть положительная горизонтальная точность, он, вероятно, скажет вам (неверно), что она действительна.

Мое предположение такое же, как у вас,что приложению сообщили, что оно имеет разрешение «Всегда» до того, как пользователь фактически предоставил «Всегда» из второго приглашения, и оно каким-то образом получает неверные местоположения в фоновом режиме.

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

Либо сообщите об ошибке в Apple, либо используйте инцидент DTS. Если это ошибка фреймворка, вам следует повторно зачислить ваш DTS и одновременно получить более быструю поддержку.

Тем временем добавьте дополнительные проверки для недопустимых местоположений, которые включают координату 0,0.

...