1.2.1. 설치 환경
IDE: Android Studio
JDK: JDK 8이상
Android SDK: Android 14 (API 34)
OS : Android 6.0, API 23 이상 지원
Gradle Version 6.1.1 사용
1.2.2. SDK 환경 설정
1.2.2.1. build.gradle(project level)
buildscript { repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:4.0.1' // 최소 3.1.2 버전 이상 필요 classpath 'com.google.gms:google-services:4.3.3' // Performance Monitoring 을 위한 설정 classpath 'com.google.firebase:perf-plugin:1.2.0' // Add the Crashlytics Gradle plugin. classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0' } } allprojects { repositories { google() mavenCentral() maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' name 'kakao' } maven { url 'https://s3.ap-northeast-2.amazonaws.com/kakao-sdk-release/release/' name 'Kakaogames' } } }
1.2.2.2. gradle.properties
# Project-wide Gradle settings. org.gradle.jvmargs=-Xmx4608M KAKAO_GAME_SDK_VERSION=4.0.0 # 아래 2개 설정 추가 android.useAndroidX=true android.enableJetifier=true
1.2.2.3. build.gradle(app level)
적용한 application 의 build.gradle 파일에 아래와 같이 필요한 모듈을 선택적으로 설정합니다.
gradle 3.0 미만 버전을 사용하여 'implementation' 을 사용할 수 없는 개발사에서는 'compile'을 사용하시면 됩니다.
apply plugin: 'com.android.application' android { ... // Java 8 언어 기능을 사용하기 위해 필요 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } // ----- Firebase 를 사용하기 위한 설정 추가 시작 ----- // Crashlytics 을 사용하기 위한 설정 apply plugin: 'com.google.firebase.crashlytics' // Performance Monitoring 을 위한 설정 apply plugin: 'com.google.firebase.firebase-perf' // ----- Firebase 를 사용하기 위한 설정 추가 끝 ----- ... dependencies { // 게스트 인증을 사용하는 게임에서 필요. implementation "com.kakaogame.publishing:idp_device:$KAKAO_GAME_SDK_VERSION" // 페이스북 인증을 사용하는 게임에서 필요. implementation "com.kakaogame.publishing:idp_facebook:$KAKAO_GAME_SDK_VERSION" // 구글게임 인증을 사용하는 게임에서 필요. implementation "com.kakaogame.publishing:idp_googlegame:$KAKAO_GAME_SDK_VERSION" // 카카오 인증을 사용하는 게임에서 필요. implementation "com.kakaogame.publishing:idp_kakao:$KAKAO_GAME_SDK_VERSION" // 애플 인증을 사용하는 게임에서 필요. implementation "com.kakaogame.publishing:idp_siwa:$KAKAO_GAME_SDK_VERSION" // 트위터 인증을 사용하는 게임에서 필요. implementation "com.kakaogame.publishing:idp_twitter:$KAKAO_GAME_SDK_VERSION" // 게임SDK의 주요 기능을 사용하기 위해서 필요. implementation "com.kakaogame.publishing:gamesdk:$KAKAO_GAME_SDK_VERSION" // Firebase FCM(Push), Analytics, Crashlytics, Performance Monitoring 을 사용하는 게임에서 필요. implementation "com.kakaogame.publishing:firebase:$KAKAO_GAME_SDK_VERSION" // 웹상점 기능을 사용하기 위해서 필요 implementation "com.kakaogame.publishing:kakaogame_addon:$KAKAO_GAME_SDK_VERSION" // 보안서비스 기능을 사용하기 위해서 필요 implementation "com.kakaogame.publishing:security:$KAKAO_GAME_SDK_VERSION" // 결제 기능을 사용하기 위해서 필요 implementation "com.kakaogame.publishing:payment:$KAKAO_GAME_SDK_VERSION" } apply plugin: 'com.google.gms.google-services' // Google Services plugin
1.2.2.4. 외부 라이브러리 dependencies
각 필요한 라이브러리들이 아래 버전으로 dependency 가 걸려있습니다. 카카오 게임SDK를 연결 시 자동으로 포함됩니다.
SDK version | Module | External Libraries |
---|---|---|
4.0.1 | gamesdk | com.google.android.gms:play-services-ads-identifier:18.0.0 |
idp_kakao | com.kakao.sdk:{module}:2.13.0 | |
idp_facebook | com.facebook.android:facebook-android-sdk:14.1.1 | |
idp_googlegame | com.google.android.gms:play-services-auth:20.6.0 | |
security | com.google.android.material:material:1.6.1 | |
payment | com.android.billingclient:billing:6.0.1 | |
4.4.0 | gamesdk | com.google.android.gms:play-services-ads-identifier:18.0.0 |
idp_kakao | com.kakao.sdk:{module}:2.18.0 | |
idp_facebook | com.facebook.android:facebook-android-sdk:14.1.1 | |
idp_googlegame | com.google.android.gms:play-services-auth:20.6.0 | |
security | com.google.android.material:material:1.6.1 | |
payment | com.android.billingclient:billing:6.0.1 | |
firebase | com.google.firebase:firebase-bom:32.8.1 |
만약 게임에서 위 라이브러리와 dependencies가 겹치는 외부 라이브러리를 사용하는 경우 아래와 같이 해당 링크를 제거하여 버전이 높은 쪽으로 사용할 수 있습니다.
build.gradle(app level)
dependencies { ... implementation ('com.kakaogame:gamesdk:{KAKAO_SDK_VERSION}') { exclude group: 'com.google.android.gms', module: 'play‐services-ads' // 제거하고자 하는 라이브러리 exclude group: 'com.android.support' // 그룹 전체 라이브러리를 제거할 수도 있습니다. support 버전이 안 맞아 빌드 에러가 나는 경우 설정으로 변경 가능 ... } } |
아래는 페이스북 SDK 버전을 게임에서 원하는 SDK버전으로 변경하는 예시입니다.
build.gradle(app level)
dependencies { ... implementation ('com.kakaogame:idp_facebook:{KAKAO_SDK_VERSION}') { exclude group: 'com.facebook.android', module: 'facebook-android-sdk' } implementation 'com.facebook.android:facebook-android-sdk:4.39.0' } |
Crashlytics를 사용하지 않는 개발사에서는 아래와 같이 제거하실 수 있습니다.
build.gradle(app level)
dependencies { ... implementation ("com.kakaogame:firebase:$KAKAO_GAME_SDK_VERSION") { exclude group: 'com.crashlytics.sdk.android', module: 'crashlytics' } } |
1.2.3. IDP 인증 정보 설정
1.2.3.1. 카카오 인증 정보 설정
src/main/res/values/kakao_game_kakao_auth.xml 에 아래 리소스 파일 추가 및 value 설정합니다.
"카카오앱키"값은 발급 받은 값으로 변경이 필요합니다.
res/values/kakao_game_kakao_auth.xml
<?xml version="1.0" encoding="UTF-8"?> <resources> <string name="kakao_app_key">[카카오앱키]</string> <string name="kakao_scheme">kakao[카카오앱키]</string> <string name="kakaotalk_host">kakaotalk</string> <string name="kakaolink_host">kakaolink</string> <string name="kakaostory_host">kakaostory</string> </resources> |
1.2.3.2. 페이스북 인증 정보 설정
src/main/res/values/kakao_game_facebook_auth.xml 에 아래 리소스 파일 추가 및 value 설정합니다.
"페이스북앱키"값은 발급 받은 값으로 변경 필요합니다.
res/values/kakao_game_facebook_auth.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="facebook_app_id">[페이스북앱키]</string> <string name="facebook_client_token">[페이스북 클라이언트 토큰]</string> <!-- 페이스북 인증시 "public_profile", "email" 퍼미션이 기본 정의되어 있으며 추가로 필요한 Read 퍼미션이 있는 경우 아래 item 항목에 추가한다. Publish 퍼미션을 추가할 수 없다. --> <string-array name="facebook_read_pemissions"> <item></item> </string-array> </resources> |
1.2.3.3. 구글 인증 정보 설정
src/main/res/values/kakao_game_google_auth.xml 에 아래 리소스 파일 추가 및 value 설정합니다.
"구글앱아이디"값과 "구글웹클라이언트아이디"값은 발급 받은 값으로 변경 필요합니다.
res/values/kakao_game_google_auth.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="kg_google_app_id">[구글앱아이디]</string> <string name="kg_google_web_app_client_id">[구글웹클라이언트아이디]</string> </resources> |
1.2.3.4. SigninWithApple 인증 정보 설정
src/main/res/values/kakao_game_siwa_auth.xml 에 아래 리소스 파일 추가 및 value 설정합니다.
"SIWA클라이언트"값은 애플에서 발급 받은 값으로 변경 필요합니다.
res/values/kakao_game_siwa_auth.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="siwa_client_id">[SIWA클라이언트아이디]</string> </resources> |
1.2.3.5. 트위터 인증 정보 설정
src/main/res/values/kakao_game_twitter_auth.xml 에 아래 리소스 파일 추가 및 value 설정합니다.
"Twitter Consumer Key", "Twitter Consumer Secret"값은 트위터에서 발급 받은 값으로 변경 필요합니다.
res/values/kakao_game_twitter_auth.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="twitter_consumer_key">[Twitter Consumer Key]</string> <string name="twitter_consumer_secret">[Twitter Consumer Secret]</string> </resources> |
1.2.4. AndroidManifest.xml 파일 설정
게임 앱의 AndroidManifest.xml 파일에 아래 사항들을 설정하여야 합니다.
1.2.4.1. 공통 설정
SDK 최소 지원 버전은 23 이상으로 설정합니다
android:minSdkVersion="23"
SDK 타겟 버전을 31 으로 설정합니다.
android:exported 명시적 선언 추가
SDK 에서는 아래 퍼미션들을 공통으로 사용합니다
android.permission.INTERNET
android.permission.ACCESS_NETWORK_STATE
다중 화면 처리를 위한 설정을 추가합니다.
안드로이드 폰의 화면 분할 및 폴더블 폰에 대응하기 위해서 application 설정에 아래와 같이 추가합니다.
android:resizeableActivity="true"
각 추가되는 Activity 설정에 아래와 같이 추가합니다.
android:configChanges="orientation|screenSize|keyboard|screenLayout|screenSize|smallestScreenSize"
API 23 이상에서는 앱이 일반 텍스트 HTTP와 같은 일반 텍스트 네트워크 트래픽을 사용하는지 여부를 설정할 수 있습니다.
android:usesCleartextTraffic="true"
URLScheme 추가
아래와 같이 게임의 메인 Activity 에 intent filter 설정을 해주어야 합니다.
scheme은 "kakaogame" + 앱아이디 로 구성 됩니다.(예를들어 앱ID가 123456이면 scheme 값은 "kakaogame123456" 이 됩니다.)
AndroidManifest.xml (공통 설정)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" > <!-- KakaoGame SDK START --> <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="31" /> <!-- KakaoGame SDK END --> <!-- KakaoGame SDK START --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- KakaoGame SDK END --> <application android:usesCleartextTraffic="true" android:resizeableActivity="true"> <!-- MainActivity START : 퍼블리싱 가이드에만 포함됩니다: 시작 --> <activity android:name="com.companyname.MainActivity" android:configChanges="orientation|screenSize|keyboard|screenLayout|screenSize|smallestScreenSize" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="sensor" android:exported=”true” > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="kakaogame[앱아이디]" /> </intent-filter> ... </activity> <!-- MainActivity END : 퍼블리싱 가이드에만 포함됩니다: 끝 --> </application> </manifest> |
1.2.4.2. 카카오 인증 설정
메인 Activity에 아래 intent filter 선언이 추가 되어야 합니다.
AuthCodeHandlerActivity 선언과 intent filter 선언이 필요합니다.
Android 12 대응하여 exported가 명시적으로 선언되어야 합니다.
AndroidManifest.xml (카카오 인증 설정)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" > <application> <activity android:name=".MainActivity" android:exported=”true”> <!-- Kakao Auth START --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="@string/kakao_scheme" android:host="@string/kakaolink_host" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="@string/kakao_scheme" android:host="@string/kakaostory_host" /> </intent-filter> <!-- Kakao Auth END --> </activity> <activity android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity" android:exported=”true”> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="oauth" android:scheme="@string/kakao_scheme" /> </intent-filter> </activity> </application> </manifest> |
1.2.4.3. 구글 인증 설정
SignInHubActivity 선언이 추가 되어야 합니다.
com.google.android.gms.version/com.google.android.gms.games.APP_ID 메타 데이터 선언이 추가 되어야 합니다.
APP_ID에 숫자를 하드코딩하면 인증에 실패합니다. "@string/google_app_id" 형태로 작성하셔야 합니다.
AndroidManifest.xml (구글 인증 설정)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" > <application> <!-- Google Auth START --> <activity android:name="com.google.android.gms.auth.api.signin.internal.SignInHubActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/google_app_id" /> <!-- Google Auth END --> </application> </manifest> |
1.2.4.4. 페이스북 인증 설정
FacebookActivity 선언이 추가 되어야 합니다.
com.facebook.sdk.ApplicationId 메타 데이터 선언이 추가 되어야 합니다.
com.facebook.sdk.ClientToken 메타 데이터 선언이 추가 되어야 합니다.
AndroidManifest.xml (페이스북 인증 설정)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" > <application> <!-- Facebook Auth START --> <activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" /> <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token" /> <!-- Facebook Auth END --> </application> </manifest> |
1.2.4.5. 트위터 인증 설정
TwitterOAuthActivity 선언이 추가 되어야 합니다.
AndroidManifest.xml (트위터 인증 설정)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" > <application> <!-- Twiitter Auth Start --> <activity android:name="com.kakaogame.twitter.TwitterOAuthActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" /> <!-- Twitter Auth End --> </application> </manifest> |
1.2.4.6. Http 사용 설정
targetSdkVersion을 28 버전 이상으로 설정하고 http 통신을 사용하는 게임은 아래와 같은 설정이 필요합니다.
카카오 게임 SDK 내부에서는 http를 사용하지 않습니다. 개발사에서 cdn등 이슈로 http 콜이 필요한 경우에만 설정합니다.
http 콜이 필요한 도메인 설정
res/xml/network_security_config.xml 파일 생성하여 http 통신이 필요한 domain을 추가
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <!-- Add Your Http Domain --> <domain includeSubdomains="true">example.com</domain> </domain-config> </network-security-config>
AndroidManifest.xml 내 Application에 위에서 생성한 파일을 networkSecurityConfig 로 설정
AndroidManifest.xml
<application android:networkSecurityConfig="@xml/network_security_config">
1.2.4.7. 게임 내 지원 언어 리소스
라이브러리에서 게임 내 지원 언어 외 추가적인 언어 팩이 있을 때, 해당 언어를 제거하고 싶다면 아래 위치의 폴더를 제거 해주시면 됩니다.
예를 들어, 일본어 언어 설정을 제거하고 싶을 때에는 KakaoGameSDK>res>values-ja 폴더를 제거합니다.
1.2.5. 키 해시 확인 및 등록 방법
앱의 빌드를 위해서는 빌드 머신의 키 해시를 등록해야 하며 다음과 같은 방법으로 키 해시를 확인하실 수 있습니다.
디버그 키 해시 및 릴리즈 키 해시를 아래 가이드대로 구해서 [게임센터 > 게임관리 > 키해시등록] 메뉴에 등록해주세요.
1.2.5.1. 디버그 키 해시 구하기
Android SDK를 설치하면 androiddebugkey의 alias로 debug.keystore 파일에 개발용 인증서가 저장되어 있습니다. 인증서를 확인하는 방법은 아래와 같습니다. (주의: 아래는 실제 키 해시를 구하는 방법은 아닙니다.)
keytool -exportcert -alias androiddebugkey -keystore {debug_keystore_path} -storepass android -keypass android
keystore 등록해야할 키 해시는 아래와 같이 수행하여 구해야 합니다.
해당 샘플을 빌드한 머신에서 수행해야 합니다.
openssl 버전은 1.0.2 버전 혹은 그 이상것을 사용 해주시기 바랍니다.
keytool -exportcert -alias androiddebugkey -keystore {debug_keystore_path} -storepass android -keypass android | openssl sha1 -binary | openssl base64
위 방법은 리눅스에서는 정상 동작을 보증하나, 윈도우즈 환경에서는 제대로 값을 얻지 못할 수도 있습니다.
키 해시 오류가 날 경우, 아래의 방법으로도 시도해보시기 바랍니다.
keytool -exportcert -alias androiddebugkey -keystore {debug_keystore_path} > ./debug.txt openssl sha1 -binary debug.txt > debug_sha.txt openssl base64 -in debug_sha.txt > debug_base64.txt
[debug_keystore_path]
OS X와 리눅스 : Eclipse "ADT > Preferences > Android > Build > Default debug keystore" 에서 확인 가능합니다.
(예 : ~/.android/debug.keystore)Windows : Eclipse "Window > Preferences > Android > Build > Default debug keystore" 에서 확인 가능합니다.
Windows Vista와 Windows 7 (예: C:\Users\.android\debug.keystore)
Windows XP (예 : C:\Documents and Settings\.android\debug.keystore)
keytool : $JAVA_HOME/bin 아래에 존재합니다.
openssl : Windows의 경우는 다운 받아 설치합니다.
1.2.5.2. 릴리즈 키 해시 구하기
keytool -exportcert -alias [release_key_alias] -keystore [release_keystore_path] | openssl sha1 -binary | openssl base64 |
---|
invalid android_key_hash 오류 확인
키 해시를 구하여 게임센터에 등록한 후에도 지속적으로 <com.kakao.util.exception.KakaoException: AUTHORIZATION_FAILED : invalid android_key_hash or ios_bundle_id or web_site_url> 오류를 받는다면 아래와 같이 정상적인 키 해시를 사용하고 있는지 확인하실 수 있습니다.
게임에서 사용하는 MainActivity 클래스에서 onCreate()를 임시로 아래와 같이 변경합니다.MainActivity
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Add code to print out the key hash try { android.content.pm.Signature[] signatures; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { PackageInfo packageInfo = getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES); if (packageInfo == null || packageInfo.signingInfo == null) { Log.e("KeyHash:", "KeyHash is Null. "); } if(packageInfo.signingInfo.hasMultipleSigners()){ signatures = packageInfo.signingInfo.getApkContentsSigners(); } else { signatures = packageInfo.signingInfo.getSigningCertificateHistory(); } } else { PackageInfo info = getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); signatures = info.signatures; } for (android.content.pm.Signature signature : signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.e("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } }
위 코드를 실행시켜 Logcat 출력에 다음과 같이 표시된 메시지에서 키 해시를 확인합니다.
1.2.6. 빌드 확인
프로젝트가 정상적으로 빌드 되는지 확인합니다.
댓글 추가