Подтвердить что ты не робот

MKMapView не может загружать фрагменты с ошибкой HTTP 410

У меня проблема с MKMapView. Карта не загружает плитки, когда я увеличиваю ее.

-(void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error 

Ошибка:

Домен = GEOErrorDomain Code = -204 "(null)" UserInfo = {SimpleTileRequesterUnderlyingErrors = ( "Ошибка домена = код GEOErrorDomain = -204 \" (null)\ "UserInfo = {HTTPStatus = 410, NSErrorFailingURLStringKey = http://gspe19.ls.apple.com/tile.vf?flags = 1 & стиль = 20 & размер = 2 & масштаб = 0 & v = 11037825 & г = 15 & х = 6205 & у = 12336 & ИСС = 0246704635757302674107153038443966765357 & Accesskey = 1454685602_q3bVUYvHBdxsSo0A_j0fK7EyQ9b21NPShV7GRLzr4WFkkhxB4vO7% 2BlXcGsXJ4zZHvhTaLVWsyPa3PlU60cDrmrFwmwCYBGrLA9mChV% 2FHoRHoTU9AGI72VQP9UKZW% 2B0GKqfRhpcw4xr% 2F% 2FTTVgJZ7wU4U4KnA8K2rVVQ% 2FOfFHJq7OO4nYecTvy0ur4I9D3Sxf % 2Btn9DcXU8agDRJignB},...

EDIT: Похоже, что это связано с кешем, но я не уверен. Эта проблема исчезает в течение некоторого времени после загрузки той же области карты в приложении Карты.

Заранее спасибо

4b9b3361

Ответ 1

Я проанализировал и описал проблему на форуме разработчиков Apple: https://forums.developer.apple.com/thread/43077


Проблема с MapKit на iOS-карте иногда не может быть загружена, а в другой раз она частично загружается, отображая обычную сетку для плитки, которая не загружалась. Проблема возникает в системном масштабе в каждом приложении, использующем MapKit, даже в приложении Apple Maps. Проблема возникает как на iPhone (6+), так и на iPad (iPad Air, iPad Air 2, iPad Mini) и ряде версий iOS (9.0, 9.0.2, 9.2.1). Кроме того, это происходит чаще, когда масштабирование карты велико. Проблема очень трудно воспроизвести, поскольку она выглядит случайным образом, сохраняется на поврежденном устройстве некоторое время и внезапно исчезает.

Мне удалось проанализировать сетевой трафик и найти возможную причину этого странного поведения. Сетевые запросы, связанные с отсутствующими фрагментами, выходят из строя с кодом статуса 410 HTTP и пустым контентом:

GET http://gspe19.ls.apple.com/tile.vf?flags=1&style=13&size=2&scale=0&v=11040322&z=15&x=17923&y=10756&sid=SOME_SID_1&accessKey=SOME_ACCESS_KEY_1 <- 410  
GET http://gspe19.ls.apple.com/tile.vf?flags=1&style=20&size=2&scale=0&v=11040322&z=15&x=17923&y=10756&sid=SOME_SID_1&accessKey=SOME_ACCESS_KEY_1 <- 410  
...  
Параметр

'v', по-видимому, является номером версии карты и растет со временем. Похоже, что номер версии может измениться после сетевого вызова "geo_manifest", который время от времени происходит:

GET https://gspe35-ssl.ls.apple.com/geo_manifest/dynamic/config?application=geod&application_version=1&country_code=PL&hardware=iPad4,2&os=ios&os_build=13C75&os_version=9.2  

После загрузки нового geo_manifest номер версии снова становится действительным, и каждый запрос фрагмента завершается успешно с кодом статуса HTTP 200:

GET http://gspe19.ls.apple.com/tile.vf?flags=1&style=13&size=2&scale=0&v=11040529&z=15&x=17923&y=10756&sid=SOME_SID_2&accessKey=SOME_ACCESS_KEY_2 <- 200  
GET http://gspe19.ls.apple.com/tile.vf?flags=1&style=20&size=2&scale=0&v=11040529&z=15&x=17923&y=10756&sid=SOME_SID_2&accessKey=SOME_ACCESS_KEY_2 <- 200  
...  

Я использовал lldb для подтверждения того, что устаревший geo_manifest является причиной 410 ответов. Я запускал произвольное приложение на устройстве, которое показывало симптомы с помощью Xcode. Некоторые фрагменты отсутствовали в MKMapView, и в сетевом трафике появилось 410 ответов. Я закрыл карту, приостановил выполнение с помощью lldb, выполнил частный механизм структуры GeoService, который, казалось, запустил обновление geo_manifest:

(lldb) po [[GEOResourceManifestManager sharedManager] forceUpdate]  

После возобновления выполнения в сетевом трафике появился запрос на обновление geo_manifest. После того, как вы открыли карту, появились успешные ответы на плитки, и карта была полностью загружена. Похоже, что сам com.apple.geod сам не время от времени запрашивает новый geo_manifest. Поскольку проблема настолько эфемерна, было невозможно найти ошибки com.apple.geod в журналах консоли устройств.

Возникают следующие вопросы: почему com.apple.geod, GeoServices или MapKit не пытаются запросить новый geo_manifest, когда запрос на получение фрагмента приводит к ответу 410? Это известная проблема? Планирует ли Apple исправить это в будущих версиях iOS?

EDIT: Исправлено в iOS 10 (https://openradar.appspot.com/radar?id=6075032430182400).

Ответ 2

В моем приложении Mac OS X MKMapView также не удалось загрузить фрагменты при увеличении. За последние несколько недель все ухудшалось. Я не регистрировал ошибки mapViewDidFailLoadingMap:, но я только начал это делать.

Чтобы проверить это не на мой код, я создал совершенно пустое тестовое приложение Mac OS X с нуля в XCode. У этого есть единственный MKMapView, помещенный в одно окно с помощью построителя интерфейса. Никакой код в приложении не был написан мной. Это тестовое приложение также обнаруживает проблему.

В то время как MKMapView испытывает проблемы с отображением фрагментов, приложение Maps.app отлично отображает плитки. Так что это не мое подключение к интернету.

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

Дополнительная информация:

  • Минимальная цель развертывания моего приложения - Mac OS X 10.11
  • Тесты выполняются на OS X El Capitan 10.11.3
  • Карта находится в гибридном режиме.
  • Перезапуск приложения не устраняет проблему.
  • Местоположение: Великобритания
  • Проблема возникает как с DNS-сервером Google, так и с моим DNS-провайдером.

Если проблема повторится, я отправлю отчет об ошибке.

Обновление (6 февраля 2016 года): Предъявили отчет об ошибке для developer.apple.com, в котором подробно описывается, что я вижу. Порекомендовал бы, чтобы кто-либо другой, столкнувшийся с проблемой, также отправил отчет об ошибке в яблоко с любыми данными, которые у вас есть. Потому что это может быть довольно сложно воспроизвести.

Обновление (7 февраля 2016 года): Спящий ноутбук прошлой ночью проблема повторилась. Теперь, когда я регистрирую сообщения mapViewDidFailLoadingMap:, я вижу такие ошибки:

Ошибка домена = GEOErrorDomain Code = -204 "(null)" UserInfo = {SimpleTileRequesterUnderlyingErrors = ( "Error Domain = GEOErrorDomain Code = -204 \" (null)\ "UserInfo = {HTTPStatus = 410, NSErrorFailingURLStringKey = http://gspe19.ls.apple.com/tile.vf?flags=1&style=20&size=2&scale=0&v=...&z=... & х =... & у =... & ИСС =... & Accesskey =...}",...

Обновил отчет об ошибке developer.apple.com с новой информацией.

Обновление (5 апреля 2016 года): Проблема все еще присутствует в OS X 10.11.4. Apple только что пометила мой отчет об ошибке как дубликат другого отчета об ошибке.

Обновление (20 мая 2016 года): Проблема все еще присутствует в OS X 10.11.5.

Обновление (23 июля 2016 года): Проблема все еще присутствует в OS X 10.11.6. Обновил отчет об ошибке developer.apple.com с информацией о том, что проблема все еще присутствует.

Обновление (3 января 2016 года): Пока я не видел проблему, возникающую в macOS 10.12 (Sierra). Тем не менее, я видел все открытые карты, которые я открывал, одновременно обновляя их фрагменты. Поэтому я подозреваю, что проблема, возможно, обнаружена, и тайники кэша очищены.