2016-12-06 1 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. 지도가로드되어 사용자 위치가 발견되면 사용자 위치에서보기 중심에 놓으려고합니다. 그러나 시간이 지나면 사용자의 위치를 ​​알 수 없으므로지도가 다른 위치에서로드되고 사용자의 위치로 업데이트되지 않습니다.

그래서 여기 내 질문

지도를로드 할 수있는 방법이 있습니까의 IT가 애플 리케이션의 전체 사용을 거기에 붙어하지 않고는 사용자의 위치로 업데이트해야? 내가 원하는 것은 기본적으로 사용자의 위치에서 시작하는 Google지도 복제품이며지도를 사용자 위치로 일관되게 업데이트하지 않고도지도와 상호 작용할 수 있습니다. 그렇지 않은 경우지도를로드하기 전에 위치를 찾을 때까지 기다리는 방법이 있습니까? GCD (그랜드 센트럴 디스패치)를 사용해 보았지만 작동하지 않았습니다. 내 최고의 옵션이 아닌 것처럼 느껴집니다.지도를 표시하기 전에 위치가로드 될 때까지 기다리는 것입니다.지도에서 일어날 수있는 문제가 많기 때문입니다. 두 옵션 중 어느 것도 옵션이 아니면 어떻게 하시겠습니까? 감사!

답변

2

내 위치를 사용하면 사용자 위치 점이 인 위치를 나타냅니다. 사용하지 않거나 사용 가능하지만 위치 데이터를 사용할 수없는 경우 이 값은 0이됩니다. 이 속성은 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하거나지도 위치는 사용자의 위치가 변경 때마다 업데이트지고이 예에서는

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

viewWillDisappear.시작 위치에 한 번만 그 위치가 필요한 경우 myLocationFound과 같은 플래그를 추가하고 그 위치를 확인하십시오. observeValue:forKeyPath

희망이 있습니다.

+0

그래서 앱을 시작할 때 위치 만 필요하면 보안 문구는 어떻게 변경됩니까? 완전히 새로운 것이 필요합니까? 또한, 내 deinit에서'myLocationFound' 옵저버를 제거해야합니까? –

+0

'CLLocationManager'로 위치를 얻을 수도 있습니다. 첫 번째 위치 업데이트를 얻으면 관리자를 중지하고 해당 'CLLocation' 객체를 사용합니다. 첫 제안을하고 싶다면'mapView.isMyLocationEnabled = false' 위치 감지를 비활성화 할 수 있습니다. –

+0

여전히 사용자 위치를 표시하고 싶습니다. 나의 이전 코멘트에서 나는 당신의 대답의 마지막 부분을 언급하고 있었다. 어떻게 그렇게 할 것인가. myLocationFound 플래그를 추가했지만 사용자가 이동할 때마다지도 카메라를 업데이트하지 않는 방법을 모르겠습니다. –

관련 문제