코코아팟을 사용해 구글 로그인을 달아봅시다.

구글은 설명도 참 친절해...

https://developers.google.com/identity/sign-in/ios/sign-in?ver=swift


여기 아주 상세한 튜토리얼이 있으나 난 그대로 안되더라...

그래서 제 경험 위주로 서술한 구글 로그인 달기.






1. 코코아팟 설치


코코아팟은 api를 쉽게 연동할 수 있도록 돕는 툴입니다. 앱은 아니고요...

터미널로 가서 아래와 같은 명령어로 코코아팟을 설치합니다.


sudo gem install cocoapods


한 줄이면 설치 끝-







2. 기존의 프로젝트 폴더 안에 Podfile 만들기


코코아팟의 설정파일쯤 되는데, 확장자 없이 그냥 Podfile.... 이것 역시 터미널에서 만듭니다.

단, cd 명령어를 이용해프로젝트 .xcodeproj 가 있는 폴더로 이동합니다.

지금 내 위치가 어딘지, 프로젝트 폴더명을 정확히 모르겠다, 할땐, ls -l 를 입력하면 해당 폴더 안에 있는 파일 및 폴더가 모두 나타납니다.



cd Desktop/work/project


가상의 프로젝트에 cd키를 통해 진입한 예제입니다.

진입 후, 아래 명령어를 입력합니다.


pod init


이러면 폴더안에 Podfile 이라는 폴더가 생성되었습니다.

파인더에서 파일을 열어 아래 문장을, target 아랫줄에 입력합니다.


pod 'Google/SignIn'


혹시 타겟이 여러개라면, 모든 타겟 밑에 위 문장을 넣어 주세요.

저장 후, 다시 터미널로 돌아와서,


pod install


을 입력해 구글 로그인 api를 가져옵니다.






3. GoogleService-Info.plist 생성하기


구글에서 프로젝트명과 번들아이디를 입력하면 만들어 주는 설정파일입니다.

https://developers.google.com/mobile/add?platform=ios&cntapi=signin&cnturl=https:%2F%2Fdevelopers.google.com%2Fidentity%2Fsign-in%2Fios%2Fsign-in%3Fconfigured%3Dtrue&cntlbl=Continue%20Adding%20Sign-In


여기서 만들 수 있습니다. 만든 설정파일은 다운로드 받아 프로젝트로 넣어주세요.

타겟이 여러개라면 모두 체크해 주세요.






4. 프로젝트 설정


이제 프로젝트에서 몇 가지 설정을 만져야 합니다.


1) URL Scheme 추가하기


먼저 URL Scheme를 추가해야 하는데, 이것은 위에서 생성한 설정파일 안에 있습니다.

GoogleService-Info.plistRESERVED_CLIENT_ID 를 카피해오면 되는데,

CLIENT_ID랑 헷갈리시면 안됩니다 ㅎㅎ 전 헷갈려서 잘못 넣고는 폭풍삽질...


카피 후, TARGETS -> Info -> URL Types 에서 추가.

Identifier 는 공백으로 두면 되고, URL Schemes 에 아까 복사한 아이디를 넣습니다.



2) Bridging-Header.h 만들기


Bridging-Header 를 만들고, 파일 안에 


#import <Google/SignIn.h>


이렇게 임포트합니다.

프로젝트 -> Build Settings -> Objective-C Bridging Header 에 파일위치와 이름을 추가하는 것도 잊지 맙시다.

혹시 Objective C 를 사용하신다면 위에서 첨부한 구글 페이지의 도움을 받으시면 됩니다.





이제 AppDelegate와 해당 ViewController에서 코딩을 하면 되는데,

여기서부턴 구글 페이지의 설명만 봐도 충분하기 때문에 생략하겠습니다.











자. 그리고 제가 이 포스트를 쓴 궁극적인 목표가 여기 있습니다.









* Trouble Shooting



후.... 구글에서 아무리 친절한 튜토리얼을 제공하더라도 개발환경이 모두 다르니 순조로울 수만은 없겠죠.

여러분은 덜 삽질하시길 바라며... 제가 했던 삽질의 결과를 공유합니다.






1. GIDSignInButton


GIDSignInButton를 찾을 수 없네 등등...의 에러가 나신다면 로그인 버튼을 스토리보드에서 만든 후, 아울렛을 연결해 버튼을 생성했는지 확인해보시기 바랍니다.


방금 에러메세지 뽑으려고 실행해보니 음...? 되네...? .....ㅋㅋ

그래서 샘플 에러메세지는 없네요.


아마 일전에 났던 에러는 잘못 연결해서 났던 에러가 아닐까...라고 추정합니다.






2. 로그인 버튼 위치 및 크기 조정


로그인 버튼은 오토레이아웃이 잘 안먹힙니다. 왜인지는 모르겠습니다만... 가로위치와 사이즈 설정이 안되더군요.

그래서 화면의 가로에 따라 버튼 크기도 변하도록 코드에서 맞춥니다.



        let btnGoogleSignIn = GIDSignInButton()

        btnGoogleSignIn.style = GIDSignInButtonStyle.wide

        

        let width = view.frame.width - 32

        btnGoogleSignIn.frame = CGRect(x: 0, y: 0, width: width, height: 48)

        

        viewSignInButtons.addSubview(btnGoogleSignIn)



높이까지 잡아주긴 귀찮아서, 화면에서 왼쪽, 오른쪽이 16씩 모자란 view를 viewSignInButtons 라는 이름으로 하나 만들었습니다.






3. linker command failed with exit code 1 (use -v to see invocation)


저를 가장 힘들게 했던 에러... 구글을 뒤져봐도 해결책도 제각각이고, 다 해봐도 다 안되는....ㅋㅋㅋㅋㅋ


Undefined symbols for architecture arm64:

  "_OBJC_CLASS_$_GSDK_GTMSessionFetcher", referenced from:

      objc-class-ref in GoogleSignIn(GIDSignIn.o)

      objc-class-ref in GoogleSignIn(GIDRuntimeConfigFetcher.o)

  "_OBJC_CLASS_$_GSDK_GTMOAuth2Authentication", referenced from:

      objc-class-ref in GoogleSignIn(GIDSignIn.o)

      objc-class-ref in GoogleSignIn(GIDAuthentication.o)

  "_GSDK_NSClassFromString", referenced from:

      l011 in GoogleSignIn(GIDSignIn.o)

      l059 in GoogleSignIn(GIDSignIn.o)

  "_OBJC_CLASS_$_GSDK_GTMSessionFetcherService", referenced from:

      objc-class-ref in GoogleSignIn(GIDSignIn.o)

  "_OBJC_CLASS_$_GSDK_GTMOAuth2SignIn", referenced from:

      objc-class-ref in GoogleSignIn(GIDSignIn.o)

      objc-class-ref in GoogleSignIn(GIDAuthentication.o)

  "_OBJC_CLASS_$_GSDK_GTMOAuth2Keychain", referenced from:

      objc-class-ref in GoogleSignIn(GIDSignIn.o)

  "_OBJC_CLASS_$_GSDK_OpenInChromeController", referenced from:

      objc-class-ref in GoogleSignIn(GIDSignIn.o)

  "_OBJC_CLASS_$_GSDK_GTMOAuth2ViewControllerTouch", referenced from:

      objc-class-ref in GoogleSignIn(GIDSignIn.o)

ld: symbol(s) not found for architecture arm64

clang: error: linker command failed with exit code 1 (use -v to see invocation)



이런 끔찍한......



저에게 먹혔던 방법은,


프로젝트를 닫고, 코코아팟 설치 이후 생성된 .xcworkspace 프로젝트로 오픈 

같은 프로젝트입니다만, xcworkspace로 오픈하면 Pod라는 디렉토리가 따로 나타나고, 하위의 프레임워크들까지 볼 수 있습니다.


타겟 -> Build Settings -> Other Linker Flags 에, $(inherited) 를 추가

에러가 나는 타겟에만 넣었더니, 다른 타겟에서는 워닝이 나서 그냥 모든 타겟에 넣었습니다.



혹시, 이것들 모두가 안된다면 Build Settings 에서 아래를 체크해보시기 바랍니다.


Architectures 가 Standard 가 맞는지.

Enable Bitcode 가 No인지. (구글 튜토리얼은 No로 설정하라는데, Yes로 바꾸니 됐다는 글도 몇 봤습니다)

Build Active Architecture Only 가 Yes 인지.






길었네요.

즐....거운 개발 되길 바랍니다 ㅎㅎㅎ


'Development > Solutions' 카테고리의 다른 글

CXErrorCodeCallDirectoryManagerError  (0) 2018.04.13
[Swift3] 그림자를 만들자  (0) 2017.02.08
[ios - swift] 네이버 로그인 달기  (0) 2016.10.31
퀵 정렬 알고리즘 (Quick Sort)  (0) 2016.10.18

WRITTEN BY
minjee
우리는 무엇을 할 수 있을까?

,