Things take time

[SWIFT] Googles Map API를 이용하여 구글맵 기능 사용하기 본문

iOS (기능)

[SWIFT] Googles Map API를 이용하여 구글맵 기능 사용하기

겸손할 겸 2017. 4. 13. 15:20

[구글 맵]


스위프트를 이용한 구글맵을 구현한다. 물론, 기본 내장 맵뷰를 사용하여 지도를 표현할 수 있으나.. 

안드로이드에서 사용중인 구글맵도 Google Maps API를 사용했기 때문에 iOS도 그에 맞춰 구현함으로써 통일감을 주기 위해 사용한다.


아직 스위프트를 비롯한 XCODE 자체가 익숙하지 않아서 고생중이지만..


https://developers.google.com/maps/documentation/ios-sdk/start


레퍼런스 사이트는 공식 구글 개발자 사이트에서 보고 했다. 처음부터 터미널 CocoaPods란 개념부터 잡혀있지 않은 상태로 시작했기에 혹시나 나 같은 초보자가 있으면 보고 참고하길 바란다.


1. XCODE를 이용하여 프로젝트를 생성한다.


2. CocoaPods를 설치한다.

- CocoaPods는 필요한 라이브러리를 설치할 때 사용하는 도구이다. 루비란 언어로 작성되고.. 뭐 그렇다는데, 라이브러리 사용하기 위해 다운받는 툴 정도로만 개념 잡았다.


- 설치 방법 

2-1) 터미널 실행 후 아래의 명령어를 입력한다.

sudo gem install cocoapods

2-2) Podfile을 생성하는데, 이 파일은 다운받을 라이브러리에 대한 정보를 기록하는 파일이라 생각한다. 터미널에서 생성한(사용할) 프로젝트 폴더를 cd명령어를 통해 이동한 뒤, 아래의 명령어를 입력한다. Podfile을 생성하는 명령어다.

touch Podfile

2-3) 해당 Podfile을 오픈하면 새 창으로 메모장 같은 파일이 열린다.

open -e Podfile

2-4) Podfile이 열리면 그 안에 아래의 문구를 입력한다. target에 들어가는 'YOUR...' 부분은 생성한 프로젝트 명으로 한다. (패키지 명 말고 프로젝트 명!)

source 'https://github.com/CocoaPods/Specs.git'
target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
  pod 'GoogleMaps'
  pod 'GooglePlaces'
end

2-5) Podfile을 저장하고 닫은 뒤, 터미널에서 아래의 명령어를 입력한다.

pod install

2-6) 해당 작업이 완료되어 해당 프로젝트로 이동하면 기존에 생성한 .xcodeproj파일뿐 아니라 .xcworkspace파일이 생성된 것을 확인할 수 있으며, 구글맵을 위해서는 .xcworkspace파일을 열어 사용해야 한다.


3. Google API Console사이트에서 iOS Google Map Key 키 값을 가져온다. (console.developers.google.com) 그리고 해당 키를 눌러서 키 제한사항에 iOS 앱으로 되어있다면 생성한 프로젝트의 패키지명을 적어줘야 한다.



4. .xcworkspace파일을 열고 AppDelegate.swift파일을 연다. 이 파일에서 어플의 시작 세팅을 담당한다. 처음 열리는 뷰 컨트롤러는 어떤 것으로 할 것인지 등.. 

먼저 import 부분에 GoogleMaps를 입력한 뒤, 그 안의 함수 중 제일 위에 있는 application function을 아래처럼 수정한다. (테스트 예제이며, provideAPIKEy(" ")의 매개 변수에는 발급한 API KEY를 입력)

import GoogleMaps
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        GMSServices.provideAPIKey("GOOGLE MAP KEY")
        // Override point for customization after application launch.
        return true
    }

5. 그리고 맵 뷰를 사용할 뷰 컨트롤러에도 GoogleMaps를 import하고 loadView()라는 함수를 재정의(override)한다. 

import GoogleMaps
    override func loadView() {
        // Create a GMSCameraPosition that tells the map to display the
        // coordinate -33.86,151.20 at zoom level 6.
        let camera = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 6.0)
        let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
        mapView.isMyLocationEnabled = true
        view = mapView
        
        // Creates a marker in the center of the map.
        let marker = GMSMarker()
        marker.position = CLLocationCoordinate2D(latitude: -33.86, longitude: 151.20)
        marker.title = "Sydney"
        marker.snippet = "Australia"
        marker.map = mapView
    }

6. 실행하여 테스트 해본다.


7. 그리고 하단의 Google 마크 부분을 클릭하면 어플이 종료되진 않지만, 디버그창에서 URL을 열 수 없다는 에러가 발생한다. 또한, 프라이버시 에러까지.

-canOpenURL: failed for URL: "googlechromes://" - error: "This app is not allowed to query for scheme googlechromes"
This app has attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSLocationWhenInUseUsageDescription key with a string value explaining to the user how the app uses this data

해결방법은 info.plist파일을 수정한다. 파일을 직접 열어 수정하거나 xcode상에서 프로젝트 이름 클릭 후 가운데 info 탭을 눌러 아래와 같이 수정한다. 또한, iOS업데이트에 따라 위치 정보에 대한 것을 사용자에게 알려 허용할지에 대한 여부를 파악해야한다. (안드로이드의 마시멜로 이후 퍼미션과 같은) 아직 권한 요청 및 또 다른 팝업 요청등에 대한 커스터마이징은 필요 없는 것처럼 보인다. 일단 plist에 기입하는 것으로 마무리한다. Privacy로 시작하는게 안드로이드 권한 요청과 비슷한 듯, plist에 value값으로 입력한 내용이 권한 요청 하단에 같이 나온다.



이렇게 하고 실행하면..

-canOpenURL: failed for URL: "googlechromes://" - error: "The operation couldn’t be completed. (OSStatus error -10814.)"

이건 또 뭐냐. 동작이 제대로 완료되지 않았다는 에러인데.. 일단 나는 나중에 Google마크를 없앨 예정이라.. 그냥 뒀다. 기본 예제는 제대로 작동하니

필요한 사람은 구글링을 통해 더 검색해보고 해결 되면 알려주길!



** 참고 : 맵 뷰 크기 지정을 원한다면 View 하나를 아울렛 변수로 선언하고, 상속받는 클래스를 GMSMapView로 지정한다 (스토리보드, 코드 둘 다 설정)