ho analizzato e descritto il problema sul forum degli sviluppatori di Apple: https://forums.developer.apple.com/thread/43077
C'è un problema con MapKit su iOS - carta a volte non riesce a caricare, un'altra volta che carica in parte, la visualizzazione della griglia sotto gli occhi di una piastrella che non è stato caricato. Il problema si verifica a livello di sistema in ogni app che utilizza MapKit, anche nell'app Apple Maps. Il problema si verifica su entrambi gli iPhone (6+) e iPad (iPad Air, iPad Air 2, iPad Mini) e una gamma di versioni iOS (9.0, 9.0.2, 9.2.1). Inoltre sembra che accada più spesso quando lo zoom della mappa è alto. Il problema è molto difficile da riprodurre, perché sembra accadere casualmente, persiste sul dispositivo interessato per un po 'di tempo e improvvisamente scompare.
Sono riuscito ad analizzare il traffico di rete e ho trovato la ragione possibile di questo strano comportamento. richieste di rete associate con piastrelle mancanti non riescono con codice di stato HTTP 410 e contenuto vuoto:
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
...
parametro 'v' sembra essere una mappa numero di versione e crescere con il tempo. Sembra che il numero di versione può cambiare dopo un 'geo_manifest' chiamata di rete, cosa che accade di tanto in tanto:
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
Dopo aver scaricato nuova geo_manifest, numero di versione diventa valido ancora una volta e ogni richiesta di piastrelle si conclude con successo con stato HTTP codice 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
...
ho usato un lldb per confermare che un geo_manifest stantio è la ragione di 410 risposte. Ho eseguito un'app arbitraria sul dispositivo che mostrava i sintomi usando Xcode. Alcune tessere mancavano su un MKMapView e 410 risposte apparivano nel traffico di rete. Ho chiuso la mappa, fermai l'esecuzione con lldb, eseguito un metodo quadro GEOSERVICE privato che sembrava forzare geo_manifest aggiornamento:
(lldb) po [[GEOResourceManifestManager sharedManager] forceUpdate]
Dopo riprendere l'esecuzione, geo_manifest richiesta di aggiornamento è apparso nel traffico di rete. Dopo aver aperto la vista mappa, sono state visualizzate le risposte dei riquadri con successo e la mappa è stata caricata completamente. Sembra che il daemon com.apple.geod non riesca a eseguire query di nuovo geo_manifest di volta in volta. Poiché il problema è così effimero, non è stato possibile trovare alcun errore com.apple.geod nei registri della console del dispositivo.
Le seguenti domande sorgono: perché com.apple.geod, GeoServices o MapKit non provano a eseguire una query per nuovo geo_manifest quando la richiesta di tile restituisce 410 risposte? È un problema noto?Apple prevede di risolvere questo problema in future versioni di iOS?
EDIT: fissato in iOS 10 (https://openradar.appspot.com/radar?id=6075032430182400).
Questo succede spesso con i dispositivi di test più vecchi. 'force update' lo ha risolto. –