개발환경 구축/플랫폼 및 서비스관련

유니티에서 카카오 로그인 (안드로이드)

codehunter 2021. 12. 11. 18:30

 

기본이 되는 글은

https://drive.google.com/file/d/1ZYCrJ1WRtq2ioTIsNnPo3M0jQJgezzSM/view

하지만 저 글대로 해도 안되는 경우가 많아 적어놓는다.

 

개발환경

유니티 : 2020.3.9f1

안드로이드 : 4.2.2

 

기본적인 세팅은 카카오 개발자 사이트에서 알려주는대로 세팅을 하면 되는 것이고 안드로이드 스튜디오에서 로그인에 필요한 파일 2개를 만들어서 하나는 앱 초기화시에 하나는 로그인시에 쓰면 된다.

 

초기화용 (코틀린) - GlobalApplication.kt

package 패키지이름

import android.app.Application
import com.kakao.sdk.common.KakaoSdk
import com.kakao.sdk.common.util.Utility

class GlobalApplication :Application() {
    override fun onCreate() {
        super.onCreate()
        KakaoSdk.init(this, "9a38f4281b...")

        val keyHash = Utility.getKeyHash(this)
        println("키 해쉬 : $keyHash")
    }
}

 

로그인용 (코틀린) - UKakao.kt

package 패키지 이름

import com.kakao.sdk.auth.model.OAuthToken
import com.kakao.sdk.user.UserApiClient
import com.unity3d.player.UnityPlayer

class UKakao {
    fun KakaoLogin() {
        // 로그인 공통 callback 구성
        val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
            if (error != null) {
                //Log.e(TAG, "로그인 실패", error)
                println("로그인 실패 : $error")
            }
            else if (token != null) {
                //Log.i(TAG, "로그인 성공 ${token.accessToken}")
                println("로그인 성공 ${token.accessToken}")
            }
        }

// 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
        if (UserApiClient.instance.isKakaoTalkLoginAvailable(UnityPlayer.currentActivity)) {
            UserApiClient.instance.loginWithKakaoTalk(UnityPlayer.currentActivity, callback = callback)
        } else {
            UserApiClient.instance.loginWithKakaoAccount(UnityPlayer.currentActivity, callback = callback)
        }
    }
}

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="패키지이름"
    xmlns:tools="http://schemas.android.com/tools">

    <!-- 인터넷 사용 권한 설정-->
    <uses-permission android:name="android.permission.INTERNET" />
  
    <application android:name="패키지이름.GlobalApplication">
        
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:theme="@style/UnityThemeSelector"
                  android:usesCleartextTraffic="true">
        
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
          
            <!--
            <intent-filter>
                <data android:host="oauth" android:scheme="kakao9a38f4..." />
            </intent-filter>
            -->
            <meta-data android:name="com.kakao.sdk.AppKey" android:value="9a38f4..." />
            
          <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>

 

baseProjectTemplate.gradle

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN

allprojects {
    buildscript {
        repositories {**ARTIFACTORYREPOSITORY**
            google()
            jcenter()
            maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
        }

        dependencies {
            // If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
            // See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
            // See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
            // To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
            classpath 'com.android.tools.build:gradle:3.6.0'
            **BUILD_SCRIPT_DEPS**
        }
    }

    repositories {**ARTIFACTORYREPOSITORY**
        google()
        jcenter()
        flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
        maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

 

mainTemplate.gradle

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN

apply plugin: 'com.android.library'
**APPLY_PLUGINS**

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "com.kakao.sdk:v2-user:2.8.4" // 카카오 로그인
    implementation "com.kakao.sdk:v2-talk:2.8.4" // 친구, 메시지(카카오톡)
    implementation "com.kakao.sdk:v2-story:2.8.4" // 카카오스토리
    implementation "com.kakao.sdk:v2-link:2.8.4" // 메시지(카카오링크)
    implementation "com.kakao.sdk:v2-navi:2.8.4" // 카카오내비
**DEPS**}

android {
    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        minSdkVersion **MINSDKVERSION**
        targetSdkVersion **TARGETSDKVERSION**
        ndk {
            abiFilters **ABIFILTERS**
        }
        versionCode **VERSIONCODE**
        versionName '**VERSIONNAME**'
        consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD**
    }

    lintOptions {
        abortOnError false
    }

    aaptOptions {
        noCompress = ['.ress', '.resource', '.obb'] + unityStreamingAssets.tokenize(', ')
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
    }**PACKAGING_OPTIONS**
}**REPOSITORIES**
**IL_CPP_BUILD_SETUP**
**SOURCE_BUILD_SETUP**
**EXTERNAL_SOURCES**

gradleTemplate.properties

org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
android.enableR8=**MINIFY_WITH_R_EIGHT**
android.useAndroidX = true
unityStreamingAssets=.unity3d**STREAMING_ASSETS**
**ADDITIONAL_PROPERTIES**

 

로그인처리 KakaoLogin.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KakaoLogin : MonoBehaviour
{
    private AndroidJavaObject ajo;

    
    void Start()
    {
        ajo = new AndroidJavaObject( "패키지이름.UKakao" );
    }

    public void login()
    {
        ajo.Call( "KakaoLogin" );
    }
}

위의 소스들은 잘 되는 소스를 적어놓은 것이고 아래글이 참고한 블로그와 내가 해결한 차이를 비교한 글이다.

 

 

 

문제 1

유니티에서 Edit - Project Settings - Player - Publishing Settings - Build 에서 파일 생성시 글 대로만 하면 AndroidX 관련 에러가 발생한다.

그래서 하나 더 생성해서 밑에 단계에서 수정해야 한다.

 

위의 글과 연결되는 부분인데 참고 글에서는 mainTemplate.gradle에 카카오 로그인 관련 모듈 설치후 AndroidX 관련 에러를 수정하기 위해 gradleTemplate.properties 에 android.useAndroidX = true 라는 문장을 추가한다.

문제 2 

의외로 이 문제를 설명한 블로그나 참고자료를 찾기 힘들었는데 기본적으로 생성한 AndroidManifest.xml 에서 제일 상단에 있는 패키지 이름을 유니티 패키지 이름과 같게 수정해주어야 한다.

 

문제 3

AndroidManifest.xml에서 oauth 관련 에러는 다음과 같이 com.kakao.sdk.AppKey 방식으로 수정 할 수 있다.

문제 4

카카오 로그인시 "관리자 설정 이슈 (KOE004)" 관련 오류 발생시 카카오 개발자 사이트에서 [내 애플리케이션] > [카카오 로그인] 에서 로그인 기능 활성화

 

참고로 안드로이드 버전 관련 에러는 아래 글을 참고하면 된다.

https://es1015.tistory.com/418

 

[Android Studio] Installed Build Tools Revision 31.0.0 is corrupted 에러 해결 방법

안드로이드 스튜디오 Installed Build Tools Revision 31.0.0 is corrupted 오류 해결 방법 새 컴퓨터에 안드로이드 스튜디오를 설치하고 빌드를 진행하니 아래와 같은 오류가 발생했다. 오류 Could not determine..

es1015.tistory.com