[Android] ์นด์นด์˜คํ†ก ๋กœ๊ทธ์ธ ์—ฐ๋™ํ•˜๊ธฐ

2021. 5. 27. 23:56ใ†๐Ÿ“ฑAndroid/๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Android ๊ฐœ๋ฐœ ์ผ์ง€

๋ฐ˜์‘ํ˜•

์˜ค๋Š˜์€ ์นด์นด์˜คํ†ก ๋กœ๊ทธ์ธ์„ Android ์—ฐ๊ฒฐํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

์ œ๊ฐ€ ์ด์šฉํ•˜๋Š” ์นด์นด์˜คํ†ก ๋กœ๊ทธ์ธ์€ v2 ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค!

 

๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋กํ•˜๊ธฐ

์•„๋ž˜ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ ํƒ ํ›„ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”!

 

Kakao Developers

์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

developers.kakao.com

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋“ฑ๋กํ•˜์‹œ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑํ‚ค๋ฅผ ์–ป์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : )

์ด๋•Œ ! ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑํ‚ค๋ฅผ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ ๋‚ด์— string ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค !

 

ํ”Œ๋žซํผ ๋“ฑ๋กํ•˜๊ธฐ

ํ”Œ๋žซํผ ์นดํ…Œ๊ณ ๋ฆฌ์— ํ”Œ๋žซํผ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Android ํ”Œ๋žซํผ์„ ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค!

ํ‚ค ํ•ด์‹œ ์ถ”์ถœํ•ด์„œ ๋“ฑ๋กํ•˜๊ธฐ

์ด๋•Œ ํ‚ค ํ•ด์‹œ๋ฅผ ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ํ‚ค ํ•ด์‹œ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ํŽ˜์ด์ง€๋ฅผ ์ด์šฉํ•˜์…”์„œ ๋“ฑ๋กํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

 

Kakao Developers

์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

developers.kakao.com

 

 

์นด์นด์˜ค ๋กœ๊ทธ์ธ ON ํ•ด์ฃผ๊ธฐ

Redirect URI๋„ REST API๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์ˆ˜๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋ถ€๋ถ„์—์„œ Redirect URI๋ฅผ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š์•˜๋”๋‹ˆ ์นด์นด์˜คํ†ก ๋กœ๊ทธ์ธ ํ™”๋ฉด์—์„œ ๋กœ๊ทธ์ธ ํ›„ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!

์ €์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ผญ ์ž„์˜๋กœ ์ ์–ด์ฃผ์„ธ์š”.

 

 

์ž˜ ๋“ฑ๋กํ•ด์ฃผ์…จ๋‹ค๋ฉด ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋“ฑ๋ก์€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. 

์ด์ œ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์— ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์ ์šฉํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

build.gradle (Module) 

์นด์นด์˜ค ๋กœ๊ทธ์ธ๋งŒ ์‚ฌ์šฉํ•˜์‹ ๋‹ค ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ณผ usermgmt๋งŒ ์ถ”๊ฐ€ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค 

implementation group: 'com.kakao.sdk', name: 'usermgmt', version: '1.30.0'
implementation group: 'com.kakao.sdk', name: 'kakaolink', version: '1.30.5'

implementation "com.kakao.sdk:v2-user:2.5.0" // ์นด์นด์˜ค ๋กœ๊ทธ์ธ
implementation "com.kakao.sdk:v2-talk:2.5.0" // ์นœ๊ตฌ, ๋ฉ”์‹œ์ง€(์นด์นด์˜คํ†ก)
implementation "com.kakao.sdk:v2-story:2.5.0" // ์นด์นด์˜ค์Šคํ† ๋ฆฌ
implementation "com.kakao.sdk:v2-link:2.5.0" // ๋ฉ”์‹œ์ง€(์นด์นด์˜ค๋งํฌ)
implementation "com.kakao.sdk:v2-navi:2.5.0" // ์นด์นด์˜ค๋‚ด๋น„

 

build.gradle (Project)

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' } // ์นด์นด์˜ค
    }
}

 

 

String ๊ฐ’ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ

value / kakao_app_key.xml

์œ„์—์„œ ๋ฐ›์€ ์นด์นด์˜ค ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค!

kakao_native_key๋Š” Redirect URI๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค !

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="kakao_app_key">aaa</string>
    <string name="kakao_native_key">kakaoaaa</string>
</resources>

 

kakao_app_key.xml ํŒŒ์ผ์€ github์— ์˜ฌ๋ฆฌ๋ฉด ์•ˆ๋˜๋Š” ํŒŒ์ผ์ด๋ฏ€๋กœ .gitignore์— ์ถ”๊ฐ€ํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์ฃผ์„ธ์š”!

 

[Android] ํŒŒ์ผ .gitignore ์ ์šฉํ•˜๊ธฐ

.gitignore์— ์›ํ•˜๋Š” ํŒŒ์ผ์„ ๋„ฃ์–ด์ค€๋‹ค. /app/src/main/res/values/api_secret_key.xml ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค Terminal ์—์„œ (.gitignore ์ ์šฉ ) git rm -r --cached . git add . git commit -m "Apply .gitignore"..

yunaaaas.tistory.com

 

Application Class์— kakaoSdk init ํ•ด์ฃผ๊ธฐ

Application Class๋ž€ ? ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์— ๊ณต๋™์œผ๋กœ ๋ฉค๋ฒ„๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŽธ๋ฆฌํ•œ ๊ณต์œ  ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค 

Application class๋ฅผ ์ƒ์† ๋ฐ›์Šต๋‹ˆ๋‹ค. 

 

Application onCreate ํ•จ์ˆ˜์— kakaosdk๋ฅผ ๋“ฑ๋กํ•ด์ค๋‹ˆ๋‹ค.

class SocketApplication : Application() {
    companion object {
        var appContext : Context? = null   
    }
    override fun onCreate() {
            super.onCreate()
            appContext = this
            KakaoSdk.init(this,getString(R.string.kakao_app_key))
        }  
}
   

 

Manifest์— KakaoHandlerActivity ์ถ”๊ฐ€ํ•˜๊ธฐ

kakao ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•œ kakao.sdk์— ์กด์žฌํ•˜๋Š” AuthCodeHandler๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

andorid:scheme์— ๋“ค์–ด๊ฐ€๋Š” string ๊ฐ’์€ kakao+ native์•ฑํ‚ค ์ž…๋‹ˆ๋‹ค.

 <activity android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <!-- Redirect URI: "kakao{NATIVE_APP_KEY}://oauth" -->
                <data
                    android:host="oauth"
                    android:scheme="@string/kakao_native_key" />
            </intent-filter>
</activity>

 

 

์ถ”๊ฐ€๋กœ ์œ„์—์„œ ์ƒ์„ฑํ•ด์ค€ ApplicationClass๋ฅผ application name์— ๋“ฑ๋กํ•ด์ค๋‹ˆ๋‹ค. 

 <application
        android:name=".SocketApplication"
        ....
        
 />

 

+) ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐ๋„ท์ด ์—ฐ๊ฒฐ์ด ๋˜์–ด์•ผ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Internet permission ๋„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”

<uses-permission android:name="android.permission.INTERNET" />

 

์ด์ œ ์›ํ•˜๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ ˆ๊ทธ๋จผํŠธ์— ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ login ์ฐฝ์œผ๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋ชจ๋“  ๊ณผ์ •์ด ๋๋‚ฉ๋‹ˆ๋‹ค.

 

 

 

์›ํ•˜๋Š” Class์— kakao ๋กœ๊ทธ์ธ ์ฝ”๋“œ ๊ตฌํ˜„

isKakaoTalkLoginAvailable์„ ํ†ตํ•ด ํ•ด๋‹น ์•ฑ์— ์นด์นด์˜คํ†ก์ด ์„ค์น˜๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ ํ›„ ์„ค์น˜๋˜์–ด์žˆ์œผ๋ฉด ์นด์นด์˜คํ†ก ๋กœ๊ทธ์ธ์œผ๋กœ, ์—†๋‹ค๋ฉด ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์ธํ„ฐ๋„ท ์ฐฝํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ํ•˜๋Š” ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค.

  btnLogin.setOnClickListener {
    if (UserApiClient.instance.isKakaoTalkLoginAvailable(this@LoginActivity)) {
    UserApiClient.instance.loginWithKakaoTalk(this@LoginActivity, callback = callback)
    } else {
    UserApiClient.instance.loginWithKakaoAccount(this@LoginActivity, callback = callback)
    }
}

callback์€ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํ›„, ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. token๊ณผ error๊ฐ€ null ์ด ์•„๋‹ˆ๋ผ๋ฉด me ๋ผ๋Š” ํ•ด๋‹น user์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ kakaoId๋ฅผ ์ถ”์ถœํ•˜๊ณ  token๊ฐ’์„ viewModel์—๊ฒŒ ์ „๋‹ฌํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

internal val callback : (OAuthToken?, Throwable?) -> Unit = { token, error ->
        if (error != null) {
            Timber.e("๋กœ๊ทธ์ธ ์‹คํŒจ- $error")
        } else if (token != null) {
            UserApiClient.instance.me { user, error ->
                val kakaoId = user!!.id
                viewModel?.addKakaoUser(token.accessToken, kakaoId)
            }
            Timber.d("๋กœ๊ทธ์ธ์„ฑ๊ณต - ํ† ํฐ ${authManager.token}")
        }
}

 

 

 

 

์•„๋ž˜์˜ ์นด์นด์˜คํ†ก ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด์‹œ๋ฉด ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

Kakao Developers

์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

developers.kakao.com




 

2021.10.27 ์ผ ๊ธฐ์ค€, Andorid Studio ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋ฉด์„œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ Gradle ์„ค์ •์ด ์œ„์˜ ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์•ผํ•˜๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

์•„๋ž˜ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ์–ด, ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. 

 

Kakao Developers

์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

developers.kakao.com

 

 

๋ฐ˜์‘ํ˜•