iOS) Kakao Login ๊ตฌํ
๐ทโโ๏ธ login tutorial using Kakao iOS SDK
๋์์ธ ๊ฐ์ด๋
์ ํ ๋ก๊ทธ์ธ๊ณผ ๋์ผํ๊ฒ ์นด์นด์ค๋ ์ญ์ ๋์์ธ ๊ฐ์ด๋๊ฐ ์๋ค. ์ฌ๊ธฐ์ PNG ํ์ผ์ ๋ค์ด๋ก๋ ํ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํ๊ธฐ์ ์ ์ค์ ๋จ๊ณ๋ฅผ ์์๋ณด์. ์๋์ ๋ด์ฉ๋ค์ ์นด์นด์ค ๊ฐ๋ฐ์๋ฌธ์๋ฅผ ์์ฝ + ์ค์ต์ด๋ค.
๐ทโโ๏ธ ์ค์ ๋จ๊ณ
1๏ธโฃ ์ ํ๋ฆฌ์ผ์ด์ ๋ฑ๋ก
์นด์นด์ค API๋ ๊ฐ๋ฐ์ ์น์ฌ์ดํธ์ ๋ฑ๋ก๋ ๊ฐ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ (์ดํ ์ฑ) ์ ๋ณด ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฏ๋ก, ์นด์นด์ค API๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ๋ฐ์ ์น์ฌ์ดํธ์ ์ฑ์ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
์ฑ ๋ง๋ค๊ธฐ
์นด์นด์ค API ์ฌ์ฉ์ ์ํด ๊ฐ๋ฐ์ ์น์ฌ์ดํธ์์ ์ฑ์ ๋ง๋ค๊ณ , ํด๋น ์ฑ์ ์๋น์ค ์ด๋ฆ๊ณผ ํ์ฌ๋ช , ์์ด์ฝ ๋ฑ ์ ๋ณด๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค. ์ฑ ์ ๋ณด๋ ์๋น์ค ์ด๋ฆ, ์ 3์ ์ ๋ณด์ ๊ณต๋์ ๋ฑ ๋ฒ์ ์ธ ์ฌํญ๊ณผ๋ ๊ด๋ จ์ด ์์ผ๋ฏ๋ก ์ค์ ์๋น์ค์ ๊ฐ์ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค.
๊ฐ๋ฐ์ ์น์ฌ์ดํธ์์ ๋ก๊ทธ์ธํ ํ, [๋ด ์ ํ๋ฆฌ์ผ์ด์ ] > [์ ํ๋ฆฌ์ผ์ด์ ์ถ๊ฐํ๊ธฐ]๋ฅผ ๋๋ฌ ์ฑ์ ์์ฑํ ์ ์์ต๋๋ค.
ํค ๊ฐ ํ์ธ
์ฑ์ ์์ฑํ๋ฉด ํ๋ซํผ๋ณ ์ฑ ํค(App Key)๊ฐ ๋ฐ๊ธ๋ฉ๋๋ค.
Kakao SDK for JavaScript(์ดํ JavaScript SDK)์๋ JavaScript ํค, iOS์ Android์๋ ๋ค์ดํฐ๋ธ ์ฑ ํค, HTTP ์์ฒญ์ด๋ ์๋ฒ ๊ธฐ๋ฅ ๊ตฌํ์๋ REST API ํค๋ฅผ ๊ฐ๊ฐ ์ฌ์ฉํฉ๋๋ค.
์ฑ ํค์ ํจ๊ป ์ด๋๋ฏผ ํค(Admin Key)๋ ํจ๊ป ๋ฐ๊ธ๋ฉ๋๋ค. ์ด๋๋ฏผ ํค๋ ์ฌ์ฉ์ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ์ฌ์ฉํฉ๋๋ค.
ํ๋ซํผ ๋ฑ๋ก
๋ฑ๋กํ ์ฑ์์ API๋ฅผ ํธ์ถํ๋ ค๋ฉด ์ฌ์ฉํ๋ ค๋ ํ๋ซํผ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๋ฐ์ ์น์ฌ์ดํธ์ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
iOS ํ๋ซํผ์๋ ๋ค์ ์ ๋ณด๋ฅผ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
- ๋ฒ๋ค ID(Bundle ID): iOS ์ฑ์ ๊ณ ์ ๊ฐ์ ๋๋ค. Xcode์ ํ๋ก์ ํธ ์ ๋ณด์ ์ค์ ๋ Bundle Identifier ๊ฐ๊ณผ ๋์ผํ ๊ฐ์ ์ ๋ ฅํฉ๋๋ค.
- ์ฑ์คํ ์ด ID(Appstore ID): ์ ํ ์ฑ์คํ ์ด ๋ฑ๋ก ์ ๋ฐ๊ธ๋ฐ์ ์ฑ ID์ ๋๋ค.
- ๋ง์ผ URL(Market URL): ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์์ ์ฑ์ ์คํ์ํฌ ๋, ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์ ํด๋น ์ฑ์ด ์ค์น๋์ด ์์ง ์์ ๊ฒฝ์ฐ ์ด๋ํ ์ฑ์คํ ์ด ์ฃผ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์นด์นด์ค๋งํฌ API๋ ์นด์นด์คํก ๋ฉ์์ง API๋ฅผ ํตํด ์ ์ก๋ ๋ฉ์์ง์์ ์ฑ์ ์คํ์ํค๋ย ๋งํฌ๋ฅผ ๋๋ ์ ๋, ์ฑ ์คํ์ ์์ฒญํ ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์ ํด๋น ์ฑ์ด ์ค์น๋์ด ์์ง ์์ผ๋ฉด ์ง์ ํ ๋ง์ผ URL ์ฃผ์๋ก ์ด๋ํ์ฌ ํด๋น ์ฑ์ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์์ต๋๋ค. ์ฑ์คํ ์ด ID๋ฅผ ์ ๋ ฅํ๋ฉด ๋ง์ผ URL์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
์ถ์ฒ :
Kakao Developers getting-started/app
2๏ธโฃ CocoaPods ํตํด ๋ชจ๋ ์ค์น
# ์ ์ฒด ์ถ๊ฐ
pod 'KakaoSDK'
# or
# ํ์ํ ๋ชจ๋ ์ถ๊ฐ
pod 'KakaoSDKCommon' # ํ์ ์์๋ฅผ ๋ด์ ๊ณตํต ๋ชจ๋
pod 'KakaoSDKAuth' # ์ฌ์ฉ์ ์ธ์ฆ
pod 'KakaoSDKUser' # ์นด์นด์ค ๋ก๊ทธ์ธ, ์ฌ์ฉ์ ๊ด๋ฆฌ
pod 'KakaoSDKTalk' # ์น๊ตฌ, ๋ฉ์์ง(์นด์นด์คํก)
pod 'KakaoSDKStory' # ์นด์นด์ค์คํ ๋ฆฌ
pod 'KakaoSDKLink' # ๋ฉ์์ง(์นด์นด์ค๋งํฌ)
pod 'KakaoSDKTemplate' # ๋ฉ์์ง ํ
ํ๋ฆฟ
pod 'KakaoSDKNavi' # ์นด์นด์ค๋ด๋น
์ด๋ฟ๋ง ์๋๋ผ RxSwift ๋ ์ง์ํ๋ค.
๋ก๊ทธ์ธ์ ํ์ฉํ๊ธฐ ์ํด์ ์ ํํ ์ด๋ ํ ๋ชจ๋์ด ํ์ํ์ง ํท๊ฐ๋ ค์ pod โKakaoSDKUserโ ๋ง ์ ์ด์ฃผ์๋๋ ์ด๊ฒ ์ธ์๋ ์๋์ผ๋ก ํ์ํ ๋ชจ๋์ด install ๋์๋ค. ๋์ ๊ฐ์ ๊ณ ๋ฏผ์ผ๋ก ๊ฑฑ์ ํ์ง ์์๋ ๋ ๊ฒ ๊ฐ๋ค.
3๏ธโฃ Info.plist ์ค์
์ฑ ์คํ ํ์ฉ ๋ชฉ๋ก ๋ฑ๋กํ๊ธฐ
iOS 9.0 ์ด์์์ iOS SDK๋ฅผ ํตํด ์นด์นด์คํก์ด๋ ์นด์นด์ค์คํ ๋ฆฌ, ์นด์นด์ค๋ด๋น ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ (์ดํ ์ฑ)์ ์คํ์ํค๋ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ ค๋ฉด Info.plist ํ์ผ์ ์ค์ ์ ์ถ๊ฐํ์ฌ ์ปค์คํ ์คํด ์ ๋ณด๋ฅผ ๋ฑ๋กํฉ๋๋ค.
(์ฑ์์ ์นด์นด์คํก์ฑ์ ์คํ์์ผ ๋ก๊ทธ์ธ ํ๋ ๊ฒ๊ณผ ์น์ ํตํด ์นด์นด์ค ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ ํ๋ ๊ฒ ๋๋ค ํด๋ณผ ๊ฒ์ด๋ค.)
[Info] > [Custom iOS Target Properties]์ Array ํ์
ํค(Key)์ธ LSApplicationQueriesSchemes
๋ฅผ ์ถ๊ฐํ๊ณ , ํด๋น ํค์ โItemโ์ผ๋ก ์ปค์คํ
์คํด์ ์ฌ์ฉํ ๊ฐ์ธ โkakaokompassauthโ, โkakaolinkโ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ ์ค์ ์ Info.plist ๋ฅผ ์ง์ ์์ ํด์ ์ ์ฉํ ์ ์๋ค.
<key>LSApplicationQueriesSchemes</key>
<array>
<!-- ์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธ -->
<string>kakaokompassauth</string>
<!-- ์นด์นด์ค๋งํฌ -->
<string>kakaolink</string>
</array>
URL Schemes ์ค์ ํ๊ธฐ
์นด์นด์ค๊ณ์ ์ ํตํ ์ธ์ฆ๊ณผ ์นด์นด์คํก ๋ฉ์์ง๋ฅผ ํตํ ์ฑ ์คํ์ ์ํด URL Schemes ์ค์ ์ ํฉ๋๋ค.
[Info] > [URL Types] > [URL Schemes] ํญ๋ชฉ์ ๋ค์ดํฐ๋ธ ์ฑ ํค(Native App Key)๋ฅผ kakao{NATIVE_APP_KEY}
ํ์์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
(์ฑ ๋ฑ๋กํ ๋ ๋ฐ๊ธ๋ฐ์๋ ๋ค์ดํฐ๋ธ ์ฑ ํค๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ค.)
4๏ธโฃ ์ด๊ธฐํ
iOS ์ฑ์์ iOS SDK๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด iOS SDK ํ์ผ์ ์๋์ ๊ฐ์ด ์ํฌํธ(import)ํด์ผ ํฉ๋๋ค. ๋ํ ๋ค์ดํฐ๋ธ ์ฑ ํค๋ฅผ ์ฌ์ฉํด iOS SDK๋ฅผ ์ด๊ธฐํํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค. AppDelegate.swift์ Kakao SDK๋ฅผ ์ด๊ธฐํํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
import KakaoSDKCommon
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
...
KakaoSDKCommon.initSDK(appKey: "NATIVE_APP_KEY")
...
}
์ถ์ฒ :
Kakao Developers getting-started/sdk-ios
๐ทโโ๏ธ ์์ํ๊ธฐ ์ ์
๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ก๊ทธ์ธ์ ํ๋ค๊ณ ์๊ณ ํ๋๋ฐ ์์ธํ ์์๋ณด์.
์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธ
์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธํ๋ ๋ฐฉ๋ฒ์ ์นด์นด์คํก์ ์ฐ๊ฒฐ๋ ์นด์นด์ค๊ณ์ ๋ฐ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์นด์นด์ค๊ณ์ ์ ๋ณด๋ฅผ ์ง์ ์ ๋ ฅํ์ง ์์๋ ๊ฐํธํ๊ฒ ๋ก๊ทธ์ธํ ์ ์์ด ๋ณด๋ค ๊ถ์ฅ๋๋ ์ธ์ฆ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ธฐ๋ณธ ์น ๋ธ๋ผ์ฐ์ (Default Browser)๋ฅผ ํตํด ์นด์นด์ค๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ
๊ธฐ๋ณธ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์นด์นด์ค๊ณ์ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๊ณ ๋ก๊ทธ์ธํ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ์นด์นด์ค๊ณ์ ์ ๋ณด๋ฅผ ์ง์ ์ ๋ ฅํ๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๊ฐ์ ์นด์นด์ค๊ณ์ ์ ์ฌ์ฉํ๋ ์๋น์ค๋ ์นด์นด์คํก์ ์ง์ํ์ง ์๋ ๋๋ฐ์ด์ค์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ ์ธ์ฆ ๋ฐฉ๋ฒ์ ํน์ง๊ณผ ์๋น์ค์ ์ฌ์ฉ์ ๋ก๊ทธ์ธ ๋์ ์ ๊ณ ๋ คํ์ฌ ์ด๋ ์ธ์ฆ ๋ฐฉ๋ฒ์ด ์ ํฉํ์ง ํ๋จํฉ๋๋ค. ๋ ๊ฐ์ง ์ธ์ฆ ๋ฐฉ๋ฒ์ ํจ๊ป ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ธ์ฆ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ํ์ํ ์ค์ ์ด๋ ์์ธ ์ฒ๋ฆฌ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
โ๏ธ ์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธ์ ์ํ ์ค์
์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํ ํ์ ์ค์ ์ ๋๋ค.
์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธ์ ์๋น์ค ์ฑ์์ ์นด์นด์คํก์ผ๋ก ์ด๋ํ ํ, ์ฌ์ฉ์๊ฐ [๋์ํ๊ณ ๊ณ์ํ๊ธฐ] ๋ฒํผ ๋๋ ๋ก๊ทธ์ธ ์ทจ์ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ค์ ์นด์นด์คํก์์ ์๋น์ค ์ฑ์ผ๋ก ์ด๋ํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
- SceneDelegate.swift ํ์ผ์ handleOpenUrl()์ ์ถ๊ฐํฉ๋๋ค.
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)
}
}
}
...
}
๐ทโโ๏ธ ์์ํ๊ธฐ
- Main.storyboard
๋ค์๊ณผ ๊ฐ์ ์คํ ๋ฆฌ๋ณด๋์์ ์ค์ตํ ๊ฒ์ด๋ค.
๐ ์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธ
1๏ธโฃ ๊ธฐ๋ฅ๊ตฌํ
// โ
๋ชจ๋ ์ถ๊ฐ
import KakaoSDKUser
// ...
// โ
์นด์นด์ค๋ก๊ทธ์ธ ์ด๋ฏธ์ง์ UITapGestureRecognizer ๋ฅผ ๋ฑ๋กํ ๋ ์ฌ์ฉํ @objc ๋ฉ์๋.
// โ
์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธ
@objc
func loginKakao() {
print("loginKakao() called.")
// โ
์นด์นด์คํก ์ค์น ์ฌ๋ถ ํ์ธ
if (UserApi.isKakaoTalkLoginAvailable()) {
UserApi.shared.loginWithKakaoTalk {(oauthToken, error) in
if let error = error {
print(error)
}
else {
print("loginWithKakaoTalk() success.")
// โ
ํ์๊ฐ์
์ฑ๊ณต ์ oauthToken ์ ์ฅ๊ฐ๋ฅํ๋ค
// _ = oauthToken
// โ
์ฌ์ฉ์์ ๋ณด๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์ค๋ฉด ํ๋ฉด์ ํ ํ๋ค.
self.getUserInfo()
}
}
}
// โ
์นด์นด์คํก ๋ฏธ์ค์น
else {
print("์นด์นด์คํก ๋ฏธ์ค์น")
}
}
์นด์นด์คํก์ด ์ค์น๋์์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ณด์ฌ์ค๋ค. ํธ๋ํฐ์ ์ฐ๊ฒฐํด์ ์ค์ตํด์ผํ๋ค.
2๏ธโฃ ํธ๋ํฐ์์ ๋น๋
์ฒ์์ ์๋ํ๋ฉด ์ด๋ฐ ํ๋ฉด์ด ๋์ฌํ ๋ฐ Kakao developers ์ [๋ด ์ดํ๋ฆฌ์ผ์ด์ ] > [์ ํ์ค์ ] > [์นด์นด์ค ๋ก๊ทธ์ธ] ์์ ์นด์นด์ค ๋ก๊ทธ์ธ์ ํ์ฑํ๋ฅผ ํด์ฃผ์ด์ผ๋ง ์ค์ ์๋น์ค์์ ์ฌ์ฉํ ์ ์๋ค.
์ด์ ๊ฐ์ด ํ์ฑํ๋ฅผ ํด์ฃผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ก๊ทธ์ธ ํ๋ฉด์ด ๋ณด์ฌ์ง๋ค.
๐ ์นด์นด์ค๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ
1๏ธโฃ ๊ธฐ๋ฅ๊ตฌํ
// โ
๋ชจ๋ ์ถ๊ฐ
import KakaoSDKUser
// ...
// โ
์นด์นด์ค๋ก๊ทธ์ธ ์ด๋ฏธ์ง์ UITapGestureRecognizer ๋ฅผ ๋ฑ๋กํ ๋ ์ฌ์ฉํ @objc ๋ฉ์๋.
// โ
์นด์นด์ค๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ
@objc
func loginKakaoAccount() {
print("loginKakaoAccount() called.")
// โ
๊ธฐ๋ณธ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธ ์งํ.
UserApi.shared.loginWithKakaoAccount {(oauthToken, error) in
if let error = error {
print(error)
}
else {
print("loginWithKakaoAccount() success.")
// โ
ํ์๊ฐ์
์ฑ๊ณต ์ oauthToken ์ ์ฅ
// _ = oauthToken
// โ
์ฌ์ฉ์์ ๋ณด๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์ค๋ฉด ํ๋ฉด์ ํ ํ๋ค.
self.getUserInfo()
}
}
}
์นด์นด์ค๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ๋ ์๋๋์ง ํ์ธํด๋ณด๊ฒ ๋ค.
๐ ๋์ ํญ๋ชฉ ์ค์
์ฒ์์๋ ๋์ํญ๋ชฉ์ด ํ๋๋ ์ค์ ๋์ด ์์ง ์์ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด๊ฒ์ Kakao Developer ์์ ์ค์ ๊ฐ๋ฅํ๋ค.
์ด๋ฉ์ผ ๊ฒฝ์ฐ๋ ํ์๋์๋ฅผ ๋ฐ๊ธฐ์ํด์๋ ๊ฒ์๋ฅผ ํ์ํ๋ค. ๊ทธ๋์ ๋๋ค์์ ํ์๋์, ์ด๋ฉ์ผ์ ์ ํ๋์๋ก ๋์๋ฅผ ๋ฐ์๋ณด๊ฒ ๋ค.
๐ ๋ก๊ทธ์์ & ์ฐ๊ฒฐ ๋๊ธฐ
- ๋ก๊ทธ์์ : ๋ก๊ทธ์์ API๋ ํ ํฐ์ ์ญ์ ํ์ฌ, ๋ ์ด์ ํด๋น ์ฌ์ฉ์ ์ ๋ณด๋ก ์นด์นด์ค API๋ฅผ ํธ์ถํ ์ ์๋๋ก ํฉ๋๋ค.
-
์ฐ๊ฒฐ๋๊ธฐ : ์ฐ๊ฒฐ ๋๊ธฐ API๋ ์นด์นด์ค ํ๋ซํผ ์์์ ์ฑ๊ณผ ์ฌ์ฉ์ ์นด์นด์ค๊ณ์ ์ ์ฐ๊ฒฐ ์ํ๋ฅผ ํด์ ํฉ๋๋ค.
- LogoutViewController.swift
import UIKit
import KakaoSDKUser
class LogoutViewController: UIViewController {
// ...
override func viewDidLoad() {
super.viewDidLoad()
// ...
}
@IBAction func logoutClicked(_ sender: Any) {
// โ
๋ก๊ทธ์์ : ๋ก๊ทธ์์์ API ์์ฒญ์ ์ฑ๊ณต ์ฌ๋ถ์ ๊ด๊ณ์์ด ํ ํฐ์ ์ญ์ ์ฒ๋ฆฌํ๋ค๋ ์ ์ ์ ์ํฉ๋๋ค.
UserApi.shared.logout {(error) in
if let error = error {
print(error)
}
else {
print("logout() success.")
// โ
๋ก๊ทธ์์ ์ ๋ฉ์ธ์ผ๋ก ๋ณด๋
self.navigationController?.popViewController(animated: true)
}
}
}
@IBAction func unlinkClicked(_ sender: Any) {
// โ
์ฐ๊ฒฐ ๋๊ธฐ : ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ๊ธฐ์กด์ ํ ํฐ์ ๋ ์ด์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ์ฐ๊ฒฐ ๋๊ธฐ API ์์ฒญ ์ฑ๊ณต ์ ๋ก๊ทธ์์ ์ฒ๋ฆฌ๊ฐ ํจ๊ป ์ด๋ค์ ธ ํ ํฐ์ด ์ญ์ ๋ฉ๋๋ค.
UserApi.shared.unlink {(error) in
if let error = error {
print(error)
}
else {
print("unlink() success.")
// โ
์ฐ๊ฒฐ๋๊ธฐ ์ ๋ฉ์ธ์ผ๋ก ๋ณด๋
self.navigationController?.popViewController(animated: true)
}
}
}
}
extension LogoutViewController {
// ...
}
๐ ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
๋๋ค์(user.kakaoAccount.profile.nickname
)๊ณผ ์ด๋ฉ์ผ(user.kakaoAccount.email
)์ ๊ฐ์ ธ์ ๋ณด๋๋ก ํ๊ฒ ๋ค.
extension LoginViewController {
// โ
์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์ค๋ฉด ํ๋ฉด์ ํ ํ๋ค.
private func getUserInfo() {
// โ
์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
UserApi.shared.me() {(user, error) in
if let error = error {
print(error)
}
else {
print("me() success.")
// โ
๋๋ค์, ์ด๋ฉ์ผ ์ ๋ณด
let nickname = user?.kakaoAccount?.profile?.nickname
let email = user?.kakaoAccount?.email
guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "LogoutViewController") as? LogoutViewController else { return }
// โ
์ฌ์ฉ์ ์ ๋ณด ๋๊ธฐ๊ธฐ
nextVC.nickname = nickname
nextVC.email = email
// โ
ํ๋ฉด์ ํ
self.navigationController?.pushViewController(nextVC, animated: true)
}
}
}
}
๊ฐ ํญ๋ชฉ์ ์๋ฃํ ๋ฑ์ ์๋๋ฅผ ์ฐธ๊ณ ํด์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
๐ ํ ํฐ ์กด์ฌ ์ฌ๋ถ ํ์ธํ๊ธฐ
ํ ํฐ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํด์ ์ฑ ์คํ ์ ํ์๊ฐ์ ์ ์ํฌ์ง ๋ฉ์ธํ๋ฉด์ผ๋ก ๋ณด๋ผ์ง ๋ถ๊ธฐ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋ทฐ๊ฐ ๋ค ๋ณด์ฌ์ง ํ ํ ํฐ์ ๊ฒ์ฌํด์ ์ ํจ์ฑ์ด ํ์ธ๋๋ฉด ๋ก๊ทธ์ธ๋ ํ๋ฉด์ผ๋ก ์ ํํด์ฃผ์๋ค. (AppDelegate.swift ์์ ์ฑ ์คํ ์ ์ฒซ ํ๋ฉด์ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ์ํด์ ์ฌ์ฉํด์ฃผ์ด๋ ๋๋ค.)
import UIKit
// โ
๋ชจ๋ ์ถ๊ฐ
import KakaoSDKUser
import KakaoSDKAuth
import KakaoSDKCommon
class LoginViewController: UIViewController {
// ...
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// โ
์ ํจํ ํ ํฐ ๊ฒ์ฌ
if (AuthApi.hasToken()) {
UserApi.shared.accessTokenInfo { (_, error) in
if let error = error {
if let sdkError = error as? SdkError, sdkError.isInvalidTokenError() == true {
//๋ก๊ทธ์ธ ํ์
}
else {
//๊ธฐํ ์๋ฌ
}
}
else {
//ํ ํฐ ์ ํจ์ฑ ์ฒดํฌ ์ฑ๊ณต(ํ์ ์ ํ ํฐ ๊ฐฑ์ ๋จ)
// โ
์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ ํ๋ฉด์ ํ์ ํ๋ ์ปค์คํ
๋ฉ์๋
self.getUserInfo()
}
}
}
else {
//๋ก๊ทธ์ธ ํ์
}
}
}
์ถ์ฒ :