2015-08-25 17 views
7

Ho creato un'app per Android che è in grado di utilizzare Google Maps per visualizzare la posizione geografica degli utenti con diverse informazioni aggiuntive accanto a Wifi, Cellule e GPS, ad esempio codici QR, beacon o qualsiasi altra cosa utilizzare per segnalare la posizione corrente (non tengo conto della precisione effettiva di queste posizioni). Sto utilizzando lo LocationSource e lo passo all'API di Google Maps tramite setLocationSource.Google Maps: LocationSource personalizzata in iOS

Devo utilizzare Google Maps poiché Apple Maps è limitato nel livello di zoom disponibile, quindi non posso ingrandire gli edifici.

E 'possibile fornire un numero personalizzato LocationManager che viene aggiornato regolarmente da qualche azione e iniettarlo nell'API di Google Maps come lo LocationSource?

So che ci sono alcuni hack che posizionano un indicatore personalizzato sulla mappa, tuttavia questo rende impossibile utilizzare le altre funzionalità di Google Maps come spostare la fotocamera nella posizione degli utenti toccando il pulsante "La mia posizione" .

Grazie.

+0

'CLLocationManager' non è uguale a' LocationSource', aggiorna i dati quando la posizione dell'utente o la direzione cambiano. – ztan

risposta

2

C'è una soluzione. L'API di Google Maps utilizza la classe framework Cocoa CLLocationManager. Tutti coloro che desiderano essere informati sulle attuali modifiche alla posizione GPS devono conformarsi a CLLocationManagerDelegate ed essere un delegato dell'oggetto CLLocationManager. Gli aggiornamenti vengono inviati all'oggetto delegato tramite il metodo locationManager : didUpdateLocations: delegate. Questa è una teoria che tutti conoscono. Quindi, per simulare i dati sulla posizione, dobbiamo trovare un modo per invocare questo metodo passando i nostri dati ad esso. Fortunatamente esiste l'opportunità di modificare dinamicamente il comportamento di qualsiasi classe, tramite le funzioni class_addMethod e class_replaceMethod. Così ora siamo in grado di cambiare l'implementazione di un metodo abc con un metodo override_abc che può essere implementato in una categoria in questo modo:

let originalSelector = NSSelectorFromString("setDelegate:") 
let newSelector = NSSelectorFromString("override_setDelegate:") 

let originalMethod = class_getInstanceMethod(CLLocationManager.self, originalSelector) 
let newMethod = class_getInstanceMethod(CLLocationManager.self, newSelector) 

method_exchangeImplementations(originalMethod, newMethod) 

Per il nostro caso, abbiamo bisogno di cambiare il setter per la posizione manager delegato e aggiungere il nostro proprio setter come estensione:

extension CLLocationManager { 
    func override_setDelegate(delegate: CLLocationManagerDelegate) { 
     // save a reference to self 
     GMLocationManager = self 
     override_setDelegate(delegate) 
    } 
} 

una volta che abbiamo risparmiato un riferimento al Google Maps location manager ora possiamo chiamare locationManager: didUpdateLocations: metodo delegato utilizzando un ulteriore metodo di estensione simulateLocation.

extension CLLocationManager { 
    func simulateLocation(location: CLLocation) { 
     self.delegate?.locationManager?(self, didUpdateLocations: [location]) 
    } 
} 
// ... 

GMLocationManager?.simulateLocation(fakeLocation) 
1

La soluzione più semplice è quella che hai descritto. Disabilita il marker "mia posizione" della mappa e il pulsante "mia posizione", crei un indicatore di posizione personalizzato, aggiungi il pulsante "mia posizione" personalizzato sulla mappa, che andrà al tuo indicatore personalizzato.
Per disabilitare di default "La mia posizione" elementi:

mMap.setMyLocationEnabled(false); 
mMap.getUiSettings().setMyLocationButtonEnabled(false); 
0

Mi sembra, che per ora non è possibile iniettare percorsi personalizzati da una fonte posizione arbitraria a Google Maps su iOS. Sfortunatamente, possiamo usare solo marcatori di posizione personalizzati come indicato da Pengrad. Tuttavia, ciò implicherebbe alcuni inconvenienti aggiuntivi come il pulsante non funzionante myLocation o l'utilizzo della posizione corrente per una navigazione. Quindi, non è la soluzione integrata, noi dovremmo cercare.

Su iOS è ancora il migliore, per utilizzare Core Location Framework e tracciare una vista bitmap personalizzata con la posizione corrente su di esso e quando si esce dall'edificio, tornare alla solita Google Maps.

Problemi correlati