2016-12-06 7 views
0

ユーザーアカウントとメインマップビューのために私のアプリケーション内でFirebaseとGoogleマップを使用しています。私のアプリでは、ユーザーの場所から開始し、マップを移動できるようにしたいが、いくつかの問題がある。Googleマップユーザーの場所から開始

  1. 経由でユーザーが認証されると。 Firebase、私はそれはユーザーの場所を取得しようとしているが、私はアプリケーションのために有効に位置情報サービスを持っている場合でも、通常nilを返します。これは私のコードです:

    if let mylocation = mapView.myLocation { 
        print("User's location: \(mylocation)") 
    } else { 
        print("User's location is unknown") 
    } 
    

    これは私のviewDidLoadの機能です。私はInfo.plistファイル内の場所とプライバシーに関する声明を使用する許可を求めるコードを持っています。

  2. マップが読み込まれてユーザーの場所が見つかった場合は、その場所をユーザーの場所に合わせて表示するようにします。しかし、それは時間内にユーザーの場所を取得することができないか、そうであるように見え、マップは他の場所で読み込まれ、ユーザーの場所に更新されません。

だからここに私の質問

は、マップをロードし、それはそれはアプリを使うの全体のためにそこに立ち往生されることなく、ユーザの位置に更新するようにするにはどのような方法はありますか?私が望むものの例は、基本的にはユーザーの場所から始まり、マップをユーザーの場所に一貫して更新しようとせずに地図とやり取りできるGoogleマップのクローンです。そうでない場合は、地図を読み込む前に場所が見つかるのを待つ方法がありますか?私はGCD(グランドセントラルディスパッチ)を使ってみましたが、うまくいきませんでした。私はそれが起こることができる多くの問題があるので、それは、地図を表示する前に、場所を読み込むのを待って、それは私の最高のオプションではないように感じる。これらのどちらもオプションでない場合、あなたは何をしますか?ありがとう!

答えて

2

[マイロケーション]を有効にすると、ユーザのロケーションドットが である場所が表示されます。無効になっているか、有効になっていても場所データがない場合は、 これはゼロになります。この特性は、KVOを用いて観測可能である。

GMSMapViewmyLocationは、KVOで観測されるため、この値は問題を解決するはずです。

ここではいくつかのサンプルコード:

はあなたのGMSMapViewインスタンスのmyLocationプロパティのオブザーバーとしてselfを追加します。

self.mapview.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.new, context: nil) 

ここでは、変更を処理:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 

     guard let update = change, let myLocation = update[NSKeyValueChangeKey.newKey] as? CLLocation else { 
      return 
     } 
     self.mapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: self.defaultTrackingZoom) 
} 

ドントはどこか、例えば、あなたのオブザーバーを削除することを忘れdeinitまたはviewWillDisappear

deinit 
{ 
    self.mapView.removeObserver(self, forKeyPath: "myLocation") 
} 

この例では、マップの位置は、ユーザの位置が変更されているたびに更新きています。最初にその位置を1度だけ必要とする場合は、myLocationFoundのようなフラグを追加して、それを確認することができます。observeValue:forKeyPath

+0

私はアプリケーションを起動するときにその位置を必要とするだけで、それは何をガードステートメントに変更しますか?私は全く新しいものが必要ですか?また、私のdeinitで 'myLocationFound'オブザーバーを削除する必要がありますか? –

+0

また、 'CLLocationManager'で位置を取得することもできます。最初の場所の更新を取得したら、マネージャを停止し、その 'CLLocation'オブジェクトを使用します。私の最初の提案を使用したい場合は、位置検出 'mapView.isMyLocationEnabled = false'を無効にすることができます –

+0

私は依然としてユーザーの場所を表示します。以前のコメントでは、答えの最後の部分を参照していました。私はそれをどうやってやりますか?私は 'myLocationFound'のフラグを追加しましたが、ユーザーが移動するたびにマップカメラを更新しないようにする方法はわかりません。 –

関連する問題