Danny의 iOS 컨닝페이퍼
article thumbnail
반응형

시작

애플 로그인에 이어 카카오 로그인 연동도 도전해보려 합니다.

초기 설정들은 카카오 Doc 에 아주 자세히 나와있으므로, 간단히 넘어갈 예정입니다.

 

 

초기 설정

일단 가장 먼저 해야 할 일은 Kakao Dev에서 내 애플리케이션 을 추가해줘야 합니다.

 

다음으로 위의 문서를 따라 로그인 활성화, RedirectURL, 동의 항목 등 필수 항목들을 설정해 주세요.

 

카카오 소셜 연동을 하기 앞서 필요한 기본 설정들은 끝났습니다.

 

 

Kakao SDK(Software Dev Kit) 설치

다음으로 Kakao SDK가 필요합니다.

 

아래 이미지처럼 카카오에서 제공하는 모듈은 이런 기능들을 갖고 있습니다.

자세한 내용을 확인하고 싶다면, Kakao SDK 문서 를 참고해 주세요.

 

위에 보시다시피 Kakao SDK에 많은 모듈이 포함돼 있습니다.

 

여기서 모든 기능은 필요 없고 로그인 구현에 필요한 모듈을 알아보기 위해

문서에 나와있는 모듈 간 의존성을 간단히 살펴봅시다.

 

로그인 기능인 User를 사용하기 위해선 의존하고 있는 Auth, Common이 필요해 보입니다.

이와 같이 구현에 필요한 모듈의 의존성을 확인해 보고 모듈을 설치해 주면 될 것 같습니다.

 

저는 간편히 Swift Package Manager를 통해 설치해 줬습니다.

로그인에 필요한 User, Auth, Common 모듈을 설치해 주세요!

 

 

프로젝트 설정

모듈을 추가해 줬다면, 프로젝트 설정 을 해줄 차례입니다.

 

 

앱 실행 허용 목록

사용자 정보 보호를 위해 '앱 실행 허용 목록'을 설정해 줘야 된다고 합니다.

간단히 info.plist에 들어가서 직접 Key-Value 값을 입력해 줘도 되며,

 

코드로 추가하고 싶다면

info.plist -> Source code에서 아래 값으로 설정해 주시면 됩니다.

<key>LSApplicationQueriesSchemes</key>
  <array>
      <!-- 카카오톡으로 로그인 -->
      <string>kakaokompassauth</string>
      <!-- 카카오톡 공유 -->
      <string>kakaolink</string>
      <!-- 카카오톡 채널 -->
      <string>kakaoplus</string>
  </array>

 

 

커스텀 URL 스킴 설정 (화면 이동, 딥링크)

커스텀 URL 스킴을 사용하는 이유는

카카오톡 로그인 후, 다시 앱으로 돌아오기 위해 사용한다고 합니다.

 

설정 방법

'프로젝트 - Info - URL Types'에서 추가를 해준 뒤,

URL Schemes 부분에 kakao${나의 네이티브 앱 키} 형식으로 작성해 주면 됩니다.

(ex. 네이티브 앱 키가 "123456789"라면 kakao123456789)

 

네이티브 앱 키 값은

'내 애플리케이션 - 앱 설정 - 앱 키'에서 키 값을 확인할 수 있습니다.

 

 

초기화

먼저 Kakao SDK를 사용하기 위해선

네이티브 앱 키를 갖고 AppDelegate에서 초기화해 주는 작업이 필요합니다.

import KakaoSDKCommon

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  ...
  KakaoSDK.initSDK(appKey: "${NATIVE_APP_KEY}")
  ...

}

 

다음으로 로그인 후 URL 스킴을 통해 다시 앱으로 돌아왔을 때,

로그인 처리를 정상적으로 할 수 있도록 도와주는 코드도 구현해 줘야 합니다.

import KakaoSDKAuth
...

class AppDelegate: UIResponder, UIApplicationDelegate {
    ...
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if (AuthApi.isKakaoTalkLoginUrl(url)) {
            return AuthController.handleOpenUrl(url: url)
        }

        return false
    }
    ...
}

 

Deployment target이 iOS 13 이전에는

AppDelegate에서 모든 라이프 사이클을 책임졌습니다.

 

하지만 iOS 13+ 부터는 라이프 사이클이 다양해지면서

SceneDelegate에서는 UI관련 라이프 사이클만 관리하게 됐습니다.

 

이 설정은 로그인이 화면 이동 후, 다시 앱으로 돌아오는 UI가 관련된 설정이므로

AppDelegate 대신 SceneDelegate에다 handleIpenUrl()를 추가하도록 바뀌었습니다.

import KakaoSDKAuth
...

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    ...
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        if let url = URLContexts.first?.url {
            if (AuthApi.isKakaoTalkLoginUrl(url)) {
                _ = AuthController.handleOpenUrl(url: url)
            }
        }
    }
    ...
}

 

위 내용들은 거의 공식문서 복붙이지만...

아무튼 이제 사용할 준비가 됐습니다...

 

 

로그인 구현

로그인 구현 방식은 총 두 가지가 방법이 있습니다.

 

1. 카카오톡 앱으로 로그인 (권장)

2. 카카오계정으로 로그인

 

아마도 한국 사람이라면 모두 카카오톡이 설치돼 있을테지만,

카카오톡이 미지원 되는 디바이스가 있을 수도 있고 사용자가 여러 계정을 갖고 있거나 등등

이런 상황을 대처하기 위해 분기처리를 하여 구현해 봅시다.

func kakaoLonginWithApp() {
    UserApi.shared.loginWithKakaoTalk {(oauthToken, error) in
        if let error = error {
            print(error)
        }
        else {
            print("loginWithKakaoTalk() success.")
            
            //do something
            _ = oauthToken
        }
    }
}
func kakaoLoginWithAccount() {
    
    UserApi.shared.loginWithKakaoAccount {(oauthToken, error) in
        if let error = error {
            print(error)
        }
        else {
            print("loginWithKakaoAccount() success.")
            
            //do something
            _ = oauthToken
        }
    }
}
func KakaoLogin() {
    // 카카오톡 실행 가능 여부 확인
    if (UserApi.isKakaoTalkLoginAvailable()) {
        // 카카오톡 앱으로 로그인 인증
        kakaoLonginWithApp()
    } else { // 카톡이 설치가 안 되어 있을 때
        // 카카오 계정으로 로그인
        kakaoLoginWithAccount()
    }
}

 

 

로그아웃

사용자 액세스 토큰과 리프레쉬 토큰을 모두 만료시켜,

더 이상 해당 사용자 정보로 카카오 API를 호출할 수 없도록 합니다.

func kakaoLogout() {
    UserApi.shared.logout {(error) in
        if let error = error {
            print(error)
        }
        else {
            print("logout() success.")
        }
    }
}

 

 

연결 끊기 (연동 삭제)

연결 끊기 요정 성공 시 로그아웃 처리가 함께 이뤄져 토큰이 삭제됩니다.

func kakaoUnlink() {
    UserApi.shared.unlink {(error) in
        if let error = error {
            print(error)
        }
        else {
            print("unlink() success.")
        }
    }
}

 

 

사용자 정보 가져오기

func getUserInfo() {
    UserApi.shared.me() {(user, error) in
        if let error = error {
            print(error)
        }
        else {
            print("me() success.")
            
            //do something
            let userName = user?.kakaoAccount?.name
            let userEmail = user?.kakaoAccount?.email
            let userProfile = user?.kakaoAccount?.profile?.profileImageUrl
            
            print("이름: \(userName)")
            print("이메일: \(userEmail)")
            print("프로필: \(userProfile)")
        }
    }
}

 

 

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!