2015-08-25 20 views
7

Kullanıcıların coğrafi konumlarını Wifi, Hücreler ve GPS'nin yanı sıra QR Kodları, İşaretçiler veya başka bir şey yapabilmeleri için coğrafi konumlarını görüntülemek amacıyla Google Haritalar'ı kullanabilecek bir Android Uygulaması oluşturdum Mevcut pozisyonu işaret etmek için kullanın (bu konumların gerçek doğruluğunu hesaba katmam). LocationSource kullanıyorum ve setLocationSource aracılığıyla Google Haritalar API'sına geçiriyorum.Google Maps: iOS'ta özel konumSource

Google Haritalar'ı, kullanılabilecek yakınlaştırma düzeyinde Apple Maps sınırlı olduğu için kullanmam gerekiyor, bu yüzden binalara yakınlaştırma yapamıyorum.

Bazı eylemlerle düzenli olarak güncellenen ve LocationSource gibi Google Haritalar API'sına enjekte eden bir özel LocationManager sağlanabilir mi?

Haritada özel bir işaretçi yerleştiren bazı korsanların olduğunu biliyorum, ancak bu, "Konumum" düğmesine dokunarak kamerayı kullanıcı konumuna taşımak gibi Google Haritalar'ın diğer özelliklerini kullanmasını imkansız kılar .

Teşekkür ederiz.

+0

'CLLocationManager' kullanıcı konumu veya değişim başlığı zaman verilerini günceller,' LocationSource' aynı değildir. – ztan

cevap

2

Çözüm var. Google Haritalar API'sı, CLLocationManager Kakao çerçeve sınıfını kullanır. Herkesin mevcut GPS konumu değişiklikleri hakkında nasıl bilgilendirilmek istendiği COREocationManagerDelegate ile uyumlu olmalı ve CLLocationManager nesnesinin temsilcisi olmalıdır. Güncelleştirmeler locationManager aracılığıyla temsilci nesnesine gönderilir: didUpdateLocations: temsilci yöntemi. Bu herkesin bildiği bir teori. Dolayısıyla, konum verilerini simüle etmek için, kendi yöntemimizi bu veriye aktarmaya yönelik bir yöntem bulmamız gerekiyor. Neyse ki, herhangi bir sınıfın davranışını class_addMethod ve class_replaceMethod aracılığıyla dinamik olarak değiştirmek için bir fırsat var. Şimdi biz şöyle bir kategoride uygulanabilecek bir yöntem override_abc bir yöntem abc uygulanmasını değiştirebilirsiniz: Bizim durumumuzda için

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) 

, biz konum yöneticileri temsilci için ayarlayıcı değiştirip eklemem gerekiyor bizim bir uzantısı olarak kendi ayarlayıcı:

bir Google Haritalar konum artık locationManager çağırabilir yöneticisine başvuru kaydettikten sonra
extension CLLocationManager { 
    func override_setDelegate(delegate: CLLocationManagerDelegate) { 
     // save a reference to self 
     GMLocationManager = self 
     override_setDelegate(delegate) 
    } 
} 

: ek bir uzantısı yöntemi simulateLocation kullanarak temsilci yöntemi: didUpdateLocations.

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

GMLocationManager?.simulateLocation(fakeLocation) 
1

En basit çözüm, anlattığınız çözümdür. Haritanın "konumum" işaretçisi ve "konumum" düğmesini devre dışı bırakır, özel konum işaretçisi oluşturursunuz, özel işaretleyicinize gidecek olan harita üzerindeki özel "konumum" düğmesini ekleyin. "Konumum" unsurları varsayılan devre dışı İçin
:

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

O şimdilik o iOS'ta Google Maps keyfi bir konuma kaynağından özel konumları enjekte etmek mümkün değildir, gibi geliyor bana. Maalesef, yalnızca özel konum işaretleyicilerini pengrad tarafından belirtildiği gibi kullanabiliriz. Bununla birlikte, bu durum, myLocation düğmesinin çalışmaması veya bir navigasyon için geçerli konumun kullanılması gibi bazı ek dezavantajlar anlamına gelecektir. Yani, entegre çözüm değil, nerede arıyoruz.

iOS'ta, Çekirdek Konum Çerçevesini kullanmak ve geçerli konumla özel bir bitmap görünümü çizmek ve binadan çıkarken normal Google Haritalar'a dönmek için hala en iyisi budur.