--- title: "Android SDK" slug: "game-gamepot3-android-sdk" tags: ["GAMEPOT 3.0"] updated: 2026-09-17T09:07:47Z published: 2026-09-17T09:07:47Z canonical: "guide.ncloud-docs.com/game-gamepot3-android-sdk" stale: true --- > ## Documentation Index > Fetch the complete documentation index at: https://guide.ncloud-docs.com/llms.txt > Use this file to discover all available pages before exploring further. # Android SDK Classic/VPC 환경에서 이용 가능합니다. Android 환경을 위한 GAMEPOT Android SDK 사용법을 안내합니다. SDK를 설치하고 환경을 구성함으로써 게임과 대시보드를 연동할 수 있습니다. ## 요구 사양 Android용 GAMEPOT SDK를 사용하기 위한 요구 사양은 다음과 같습니다. - 최소 사양은 Android level 24 이상입니다. 하위 버전 지원이 필요하면 [문의채널](https://www.ncloud.com/support/question)로 문의해 주십시오. ## SDK 설치 및 환경 구성 Android SDK를 설치한 후 환경을 구성하여 GAMEPOT 대시보드와 게임을 연동하고 게임 개발에 필요한 기능을 사용할 수 있습니다. GAMEPOT SDK에서 지원하는 언어는 아래와 같습니다. - 한국어, 영어, 이탈리아어, 태국어, 베트남어, 일본어, 중국어(간체/번체), 인도네시아어, 독일어, 스페인어, 프랑스어 게임팟 초기화 시 등록한 언어로 자동 표기되며, 미지원 언어는 영어로 표시됩니다. ### SDK 설치 GAMEPOT Android SDK를 설치하고 프로젝트를 구성하려면 다음 절차를 따르십시오. 1. `build.gradle` 또는 `build.gradle.kts` 파일에 NBase SDK를 추가해 주십시오. 2. GAMEPOT 3.0부터는 Gradle 설정으로 외부 라이브러리를 간편하게 통합할 수 있습니다. #### Kotlin Gradle 설정 Kotlin DSL을 사용하는 프로젝트에서는 다음 설정을 추가해 주십시오. 1. 프로젝트 루트 `build.gradle.kts` 파일에 다음 설정을 추가해 주십시오. Kotlin: ``` dependencyResolutionManagement { repositories { ... google() maven(url = "https://repo.nbase.io/repository/nbase-releases") } } ``` 1. 앱 모듈(`Module: app`)의 `build.gradle.kts` 파일에 다음 설정을 추가해 주십시오. Kotlin: ``` dependencies { ... implementation("io.nbase:nbasesdk:latest.release") } ``` 구글 로그인과 구글 스토어 결제를 함께 사용하는 경우에는 다음 예시를 참고해 주십시오. Kotlin: ``` dependencies { ... implementation("io.nbase:nbasesdk:latest.release") implementation("io.nbase:nbase-adapter-provider-google:latest.release") implementation("io.nbase:nbase-adapter-billing-googleplay:latest.release") } ``` #### Java Gradle 설정 Groovy DSL을 사용하는 프로젝트에서는 다음 설정을 추가해 주십시오. 1. 프로젝트 루트 `build.gradle` 파일에 다음 설정을 추가해 주십시오. Groovy: ``` allprojects { repositories { ... google() maven { url "https://repo.nbase.io/repository/nbase-releases" } } } ``` 1. 앱 모듈(`Module: app`)의 `build.gradle` 파일에 다음 설정을 추가해 주십시오. Groovy: ``` dependencies { ... implementation("io.nbase:nbasesdk:latest.release") } ``` 구글 로그인과 구글 스토어 결제를 함께 사용하는 경우에는 다음 예시를 참고해 주십시오. Groovy: ``` dependencies { ... implementation("io.nbase:nbasesdk:latest.release") implementation("io.nbase:nbase-adapter-provider-google:latest.release") implementation("io.nbase:nbase-adapter-billing-googleplay:latest.release") } ``` 지원 가능한 AOS 종속 모듈은 다음과 같습니다. | Name | Description | Dependency modules | | --- | --- | --- | | io.nbase:nbasesdk | 게임팟 기본 모듈 | X | | io.nbase:nbase-adapter-provider-google | 구글 로그인 | X | | io.nbase:nbase-adapter-provider-apple | 애플 로그인 | X | | io.nbase:nbase-adapter-provider-facebook | 페이스북 로그인 | com.facebook.android:facebook-login:latest.release | | io.nbase:nbase-adapter-provider-kakao | 카카오 로그인 | X | | io.nbase:nbase-adapter-provider-line | 라인 로그인 | X | | io.nbase:nbase-adapter-provider-naver | 네이버 로그인 | X | | io.nbase:nbase-adapter-provider-huawei | 화웨이 로그인 | X | | io.nbase:nbase-adapter-provider-playgame | 구글플레이게임 로그인 | X | | io.nbase:nbase-adapter-provider-x | X 로그인 | X | | io.nbase:nbase-adapter-billing-googleplay | 구글 스토어 | com.android.billingclient:billing:8.0.0 | | io.nbase:nbase-adapter-billing-onestore | 원스토어 | X | | io.nbase:nbase-adapter-billing-galaxy | 갤럭시 스토어 | X | | io.nbase:nbase-adapter-billing-huawei | 화웨이 스토어 | X | 게스트 로그인의 경우 기본 모듈에 포함되어 있습니다. ### 사전 준비 SDK를 적용하기 전에 필요한 필수 설정 항목을 다음과 같이 확인해 주십시오. 1. 프로젝트 ID와 프로젝트 키는 **대시보드** > **프로젝트 설정**에서 복사해 주십시오. 2. 로그인, 스토어, 연동에 대한 환경 설정은 **대시보드** > **프로젝트 설정**에서 수행해 주십시오. 3. 로그인별로 [로그인 수단별 환경 설정](/docs/game-gamepot3-google-integration)을 참조하여 콘솔에 설정하고 대시보드에 추가해 주십시오. 4. 인앱 결제를 사용하는 경우 [스토어별 환경 설정](/docs/game-gamepot3-google-play-store)을 참조하여 콘솔에 설정하고 대시보드에 추가해 주십시오. 5. 인앱 결제를 위한 각 스토어의 아이템을 **대시보드** > **결제** > **인앱**에서 등록해 주십시오. ### 초기화 초기화를 수행하려면 게임을 시작할 때 로드되는 첫 장면에 사용되는 개체에 아래 코드를 추가해 주십시오. Kotlin: ``` import android.util.Log import com.nbase.sdk.NBase import com.nbase.sdk.Store NBase.initialize(activity, projectId, projectKey, storeId, language, region) { init, e -> if (e != null) { Log.e("NBase", e.message ?: "initialize fail") } else { Log.i("NBase", "initialize success: ${init.toString()}") } } ``` Java: ``` import android.util.Log; import com.nbase.sdk.NBase; import com.nbase.sdk.Store; NBase nBase = NBase.INSTANCE; nBase.initialize(activity, projectId, projectKey, Store.GOOGLE, language, region, (init, e) -> { if (e != null) { Log.e("NBase", "initialize fail: " + e.getMessage()); } else { Log.i("NBase", "initialize success: " + init.toString()); } return null; }); ``` - **Parameters** 다음 표는 초기화에 필요한 매개변수를 설명합니다. | Key | Type | Description | Required | | --- | --- | --- | --- | | projectId | String | 프로젝트 ID (**대시보드** → **프로젝트 설정**) | O | | projectKey | String | 프로젝트 키 (**대시보드** → **프로젝트 설정**) | O | | storeId | String | 스토어 ID (아래 표 참고) | O | | language | String | 언어 코드(en, ko, jp 등) | O | | region | String | 리전명(kr, jp, sg, us, eu, preview) | O | 스토어 식별자는 다음 표를 참고해 주십시오. | Key | Description | | --- | --- | | Store.GOOGLE | 구글 스토어 | | Store.ONE | 원스토어 | | Store.GALAXY | 갤럭시 스토어 | | Store.AMAZON | 아마존 스토어 | | Store.HUAWEI | 화웨이 스토어 | - **Callback** 다음 표는 초기화 콜백으로 전달되는 정보를 설명합니다. | Key | Type | Description | | --- | --- | --- | | status | Boolean | 상태 | | language | String | 언어 | | country | String | 국가 | | remote_ip | String | IP | | platform | String | 플랫폼 | | sandbox | Boolean | 샌드박스 여부 | ## 로그인 기능 로그인 기능을 이용하여 다양한 인증 수단으로 사용자를 인증하는 방법을 설명합니다. ### 로그인 기능 사용 개발사가 구현한 로그인 UI에서 SDK 로그인 기능을 호출하려면 다음 코드를 참고해 주십시오. Kotlin: ``` import android.content.Intent import android.util.Log import com.nbase.sdk.NBase import com.nbase.sdk.Provider NBase.signIn(activity, Provider.GOOGLE.toString()) { user, e -> if (e != null) { if (e.errorCode == 414) { // Maintenance // Maintenance Log.e("NBase", "Maintenance: " + e.message) // Maintenance message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus) { status, err -> // Popup handling } */ } else if (e.errorCode == 413) { // Update // Update Log.e("NBase", "Update: " + e.message) // Update message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus) { status, err -> // Popup handling } */ } else { // signIn Failed Log.e("NBase", "signIn Failed: " + e.errorCode + ", " + e.message) } } else { // signIn Success Log.e("NBase", "signIn Success: " + user.toString()) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) NBase.onActivityResult(requestCode, resultCode, data) } ``` Java: ``` import android.content.Intent; import android.util.Log; import com.nbase.sdk.NBase; import com.nbase.sdk.Provider; NBase nBase = NBase.INSTANCE; nBase.signIn(activity, Provider.GOOGLE.toString(), (user, e) -> { if (e != null) { if (e.getErrorCode() == 414) { // Maintenance // Maintenance Log.e("NBase", "Maintenance: " + e.getMessage()) // Maintenance message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus, (status, err) -> { // Popup handling } */ } else if (e.getErrorCode() == 413) { // Update // Update Log.e("NBase", "Update: " + e.getMessage()) // Update message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus, (status, err) -> { // Popup handling } */ } else { // signIn Failed Log.e("NBase", "signIn Failed: " + e.getErrorCode() + ", " + e.getMessage()); } } else { // signIn Success Log.e("NBase", "signIn Success: " + user.toString()); } return null; }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); nBase.onActivityResult(requestCode, resultCode, data); } ``` 업데이트 또는 점검 시 SDK에서 제공하는 자체 팝업을 사용하려면 아래 코드를 추가해 주십시오. Kotlin: ``` NBase.showAppStatusPopup(activity, appStatus){ status, e -> if (status.close){ // App Close } else if (status.next){ // Next, Optional update } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.showAppStatusPopup(activity, appStatus){ status, e -> if (status.getClose()){ // App Close } else if (status.getNext()){ // Next, Optional update } } ``` - **Provider** 다음 표는 로그인 기능에서 사용할 서비스 타입을 설명합니다. | Key | Description | | --- | --- | | Provider.GOOGLE | 구글 | | Provider.ANONYMOUS | 게스트 | | Provider.FACEBOOK | 페이스북 | | Provider.APPLE | 애플 | | Provider.KAKAO | 카카오 | | Provider.GOOGLEPLAY | 구글플레이게임 | | Provider.STEAM | 스팀 | | Provider.X | X | | Provider.LINE | 라인 | | Provider.NAVER | 네이버 | | Provider.GITHUB | 깃허브 | | Provider.MICROSOFT | 마이크로소프트 | | Provider.HUAWEI | 화웨이 | - **User** 다음 표는 User 객체의 필드를 설명합니다. | Key | Type | Description | | --- | --- | --- | | id | string | 유저의 고유 ID | | socialId | string | 소셜 ID | | name | string | 이름 (제공해 주는 경우) | | email | string | 이메일 (제공해 주는 경우) | | token | string | 토큰 | | age | int | 나이 (제공해 주는 경우) | | profile | string | 프로필 (제공해 주는 경우) | | customField | string | 커스텀 필드 | | isSignUp | bool | 가입 여부 | | appStatus | AppStatus | 점검/업데이트 상태 | - **AppStatus** 다음 표는 AppStatus 객체의 필드를 설명합니다. | Key | Type | Description | | --- | --- | --- | | message | string | 메시지 | | startedAt | long | 시작 시간 | | endedAt | long | 종료 시간 | | currentAppVersion | string | 현재 앱 버전 | | updateAppVersion | string | 업데이트 앱 버전 | | currentAppVersionCode | string | 현재 앱 버전 코드 | | updateAppVersionCode | string | 업데이트 앱 버전 코드 | | isForce | bool | 강제 업데이트 여부 | | url | string | 점검/업데이트 등록된 URL | ### SDK 자체 제공 로그인 UI GAMEPOT SDK가 제공하는 완성된 형태의 로그인 UI를 사용할 수 있습니다. SDK가 제공하는 로그인 UI를 호출하려면 아래 코드를 사용해 주십시오. Kotlin: ``` NBase.openSignInUI(activity) { user, e -> if (e != null) { if (e.errorCode == 414) { // Maintenance // Maintenance Log.e("NBase", "Maintenance: " + e.message) // Maintenance message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus) { status, err -> // Popup handling } */ } else if (e.errorCode == 413) { // Update // Update Log.e("NBase", "Update: " + e.message) // Update message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus) { status, err -> // Popup handling } */ } else { // signIn Failed Log.e("NBase", "signIn Failed: " + e.errorCode + ", " + e.message) } } else { // signIn Success Log.e("NBase", "signIn Success: " + user.toString()) } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.openSignInUI(activity, (user, e) -> { if (e != null) { if (e.getErrorCode() == 414) { // Maintenance // Maintenance Log.e("NBase", "Maintenance: " + e.getMessage()) // Maintenance message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus, (status, err) -> { // Popup handling } */ } else if (e.getErrorCode() == 413) { // Update // Update Log.e("NBase", "Update: " + e.getMessage()) // Update message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus, (status, err) -> { // Popup handling } */ } else { // signIn Failed Log.e("NBase", "signIn Failed: " + e.getErrorCode() + ", " + e.getMessage()); } } else { // signIn Success Log.e("NBase", "signIn Success: " + user.toString()); } return null; }); ``` ### 자동 로그인 (옵션) 초기화한 후 마지막으로 로그인한 인증 수단으로 자동 로그인을 시도할 수 있습니다. 자동 로그인을 시도하기 전에 마지막 로그인 Provider 타입을 확인하는 것이 좋습니다. Kotlin: ``` // 마지막 로그인 Provider 타입 확인 val lastProviderType = NBase.getLastProviderType() if (lastProviderType != Provider.NONE) { // 유효한 Provider가 있을 때만 자동 로그인 시도 NBase.signInLastLoggedIn(activity) { user, e -> if (e != null) { if (e.errorCode == 414) { // Maintenance // Maintenance Log.e("NBase", "Maintenance: " + e.message) // Maintenance message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus) { status, err -> // Popup handling } */ } else if (e.errorCode == 413) { // Update // Update Log.e("NBase", "Update: " + e.message) // Update message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus) { status, err -> // Popup handling } */ } else { // signIn Failed Log.e("NBase", "signIn Failed: " + e.errorCode + ", " + e.message) } } else { // signIn Success Log.e("NBase", "signIn Success: " + user.toString()) } } } else { // 마지막 로그인 정보가 없음 Log.e("NBase", "No last login provider found") } ``` Java: ``` NBase nBase = NBase.INSTANCE; // 마지막 로그인 Provider 타입 확인 Provider lastProviderType = nBase.getLastProviderType(); if (lastProviderType != Provider.NONE) { // 유효한 Provider가 있을 때만 자동 로그인 시도 nBase.signInLastLoggedIn(activity, (user, e) -> { if (e != null) { if (e.getErrorCode() == 414) { // Maintenance // Maintenance Log.e("NBase", "Maintenance: " + e.getMessage()) // Maintenance message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus, (status, err) -> { // Popup handling } */ } else if (e.getErrorCode() == 413) { // Update // Update Log.e("NBase", "Update: " + e.getMessage()) // Update message /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, user?.appStatus, (status, err) -> { // Popup handling } */ } else { // signIn Failed Log.e("NBase", "signIn Failed: " + e.getErrorCode() + ", " + e.getMessage()); } } else { // signIn Success Log.e("NBase", "signIn Success: " + user.toString()); } return null; }); } else { // 마지막 로그인 정보가 없음 Log.e("NBase", "No last login provider found"); } ``` - **getLastProviderType()** 마지막으로 로그인한 Provider 타입을 반환합니다. 다음 표는 getLastProviderType() 메서드의 반환 값을 설명합니다. | Return Type | Description | | --- | --- | | Provider | 마지막 로그인 Provider 타입 | - **signInLastLoggedIn() Parameter** 마지막으로 로그인한 인증 수단으로 자동 로그인을 시도합니다. 다음 표는 signInLastLoggedIn() 메서드의 매개변수를 설명합니다. | Key | Type | Description | Required | | --- | --- | --- | --- | | activity | Activity | 현재 액티비티 | O | - **Callback** 다음 표는 자동 로그인 콜백으로 전달되는 값을 설명합니다. | Key | Type | Description | | --- | --- | --- | | user | User | 로그인 성공 시 사용자 정보 | | error | Error | 로그인 실패 시 에러 정보 | ### 로그아웃 게임팟 사용자 계정을 로그아웃하려면 아래 코드를 사용해 주십시오. Kotlin: ``` NBase.signOut(activity) { status, e -> if (e != null) { Log.e("NBase", "signOut Fail") Log.e("NBase", "error.message : " + e.message.toString()) } else { Log.e("NBase", "signOut") Log.e("NBase", "status : " + status.toString()) // 로그아웃 성공 후 처리 로직 } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.signOut(activity, (status, e) -> { if (e != null) { Log.e("NBase", "signOut Fail"); Log.e("NBase", "error.message : " + e.getMessage()); } else { Log.e("NBase", "signOut"); Log.e("NBase", "status : " + status.toString()); // 로그아웃 성공 후 처리 로직 } return null; }); ``` - **Parameter** 다음 표는 getLastProviderType() 메서드의 매개변수를 설명합니다. | Key | Type | Description | Required | | --- | --- | --- | --- | | activity | Activity | 현재 액티비티 | O | - **Callback** 다음 표는 로그아웃 콜백으로 전달되는 값을 설명합니다. | Key | Type | Description | | --- | --- | --- | | status | Boolean | 로그아웃 성공 여부 | ### 회원 탈퇴 SDK 회원탈퇴 기능을 사용하려면 아래 코드를 사용해 주십시오. Kotlin: ``` NBase.deleteMember(providerId) { status, e -> if (e != null) { Log.e("NBase", "deleteMember Fail") Log.e("NBase", "error.message : " + e.message.toString()) } else { Log.e("NBase", "deleteMember") Log.e("NBase", "status : " + status.toString()) // 회원 탈퇴 성공 후 처리 로직 } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.deleteMember(providerId, (status, e) -> { if (e != null) { Log.e("NBase", "deleteMember Fail"); Log.e("NBase", "error.message : " + e.getMessage()); } else { Log.e("NBase", "deleteMember"); Log.e("NBase", "status : " + status.toString()); // 회원 탈퇴 성공 후 처리 로직 } return null; }); ``` - **Parameters** 다음 표는 회원 탈퇴 시 전달해야 하는 매개변수를 설명합니다. | Key | Type | Description | Required | | --- | --- | --- | --- | | providerId | Provider | 로그인한 Provider 타입(예: Provider.GOOGLE, Provider.ANONYMOUS 등) | O | - **Callback** 다음 표는 회원 탈퇴 콜백 값을 설명합니다. | Key | Type | Description | | --- | --- | --- | | status | Boolean | 회원 탈퇴 성공 여부 | ### 자체 아이디 비밀번호 인증 (옵션) 사용자가 이메일 주소와 비밀번호를 사용하여 로그인할 수 있게 하는 인증 메서드입니다. 사용자의 이메일 주소와 비밀번호를 기반으로 사용자 인증을 수행합니다. Kotlin: ``` NBase.signInWithPassword(activity, username, password) { user, e -> if (e != null) { Log.e("NBase", e.message) } else { Log.e("NBase", user) } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.signInWithPassword(activity, username, password, (user, e) -> { if (e != null) { Log.e("NBase", "signInWithPassword fail: " + e.getMessage()); } else { Log.e("NBase", "signInWithPassword success: " + user.toString()); } return null; }); ``` ### 자격 증명으로 로그인 (옵션) 외부에서 획득한 소셜 계정의 자격 증명(Access Token)을 사용하여 로그인하려면 아래 코드를 사용해 주십시오. Kotlin: ``` NBase.signInWithCredential(activity, Provider.GOOGLE.ToString(), providerToken) { user, e -> if (e != null) { Log.e("NBase", e.message) } else { Log.e("NBase", user) } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.signInWithCredential(activity, Provider.GOOGLE.toString(), providerToken, (user, e) -> { if (e != null) { Log.e("NBase", "signInWithCredential fail: " + e.getMessage()); } else { Log.e("NBase", "signInWithCredential success: " + user.toString()); } return null; }); ``` - **Parameter** 다음 표는 자격 증명 로그인에 필요한 매개변수를 설명합니다. | Key | Type | Description | Required | | --- | --- | --- | --- | | activity | Activity | 현재 액티비티 | O | | providerId | Provider | 연동할 Provider 타입 | O | | providerToken | String | 소셜 계정의 Access Token | O | - **Callback** 다음 표는 자격 증명 로그인 콜백 값을 설명합니다. | Key | Type | Description | | --- | --- | --- | | user | User | 로그인 성공 시 사용자 정보 | | error | Error | 로그인 실패 시 에러 정보 | ## 외부 계정 연동 기능 GAMEPOT 사용자 계정에 외부 소셜 계정을 연동하고 관리하는 기능을 안내합니다. ### 외부 계정 연동 기능 사용 현재 게임팟 사용자 계정에 다른 소셜 계정을 연동하려면 아래 코드를 사용해 주십시오. Kotlin: ``` NBase.createLinking(activity, providerId) { linkingId, e -> if (e != null) { Log.e("NBase", "createLinking Fail") Log.e("NBase", "error.message : " + e.message.toString()) } else { Log.e("NBase", "createLinking") Log.e("NBase", "linkingId : " + linkingId.toString()) // 계정 연동 성공 후 처리 로직 } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.createLinking(activity, providerId, (linkingId, e) -> { if (e != null) { Log.e("NBase", "createLinking Fail"); Log.e("NBase", "error.message : " + e.getMessage()); } else { Log.e("NBase", "createLinking"); Log.e("NBase", "linkingId : " + linkingId); // 계정 연동 성공 후 처리 로직 } return null; }); ``` - **Parameter** 다음 표는 계정 연동에 필요한 매개변수를 설명합니다. | Key | Type | Description | Required | | --- | --- | --- | --- | | activity | Activity | 현재 액티비티 | O | | providerId | Provider | 연동할 Provider 타입 (예: Provider.GOOGLE, Provider.FACEBOOK 등) | O | - **Callback** 다음 표는 계정 연동 콜백 값을 설명합니다. | Key | Type | Description | | --- | --- | --- | | linkingId | String | 연동 성공 시 반환되는 연동 ID | ### 연동 리스트 확인 현재 게임팟 사용자 계정에 연동된 소셜 계정 목록을 확인하려면 아래 코드를 사용해 주십시오. Kotlin: ``` NBase.getLinkedLists { linkings, e -> if (e != null) { Log.e("NBase", "getLinkedLists Fail") Log.e("NBase", "error.message : " + e.message.toString()) } else { Log.e("NBase", "getLinkedLists") Log.e("NBase", "linkings : " + linkings.toString()) // 연동 목록 확인 후 처리 로직 } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.getLinkedLists((linkings, e) -> { if (e != null) { Log.e("NBase", "getLinkedLists Fail"); Log.e("NBase", "error.message : " + e.getMessage()); } else { Log.e("NBase", "getLinkedLists"); Log.e("NBase", "linkings : " + linkings.toString()); // 연동 목록 확인 후 처리 로직 } return null; }); ``` - **Callback** 다음 표는 계정 연동 목록 확인 시 제공되는 값을 설명합니다. | Key | Type | Description | | --- | --- | --- | | linkings | List | 연동된 계정 목록 | - **Linking** 다음 표는 Linking 객체의 필드를 설명합니다. | Key | Type | Description | | --- | --- | --- | | id | String | 연동 ID (계정 연동 해제 시 사용) | | username | String | 소셜 ID | | provider | String | 소셜 provider 타입 | ### 연동 해제 현재 게임팟 사용자 계정에서 특정 소셜 계정 연동을 해제하려면 아래 코드를 사용해 주십시오. Kotlin: ``` NBase.deleteLinking(linkingId) { status, e -> if (e != null) { Log.e("NBase", "deleteLinking Fail") Log.e("NBase", "error.message : " + e.message.toString()) } else { Log.e("NBase", "deleteLinking") Log.e("NBase", "status : " + status.toString()) // 연동 해제 성공 후 처리 로직 } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.deleteLinking(linkingId, (status, e) -> { if (e != null) { Log.e("NBase", "deleteLinking Fail"); Log.e("NBase", "error.message : " + e.getMessage()); } else { Log.e("NBase", "deleteLinking"); Log.e("NBase", "status : " + status.toString()); // 연동 해제 성공 후 처리 로직 } return null; }); ``` - **Parameter** 다음 표는 계정 연동 해제에 필요한 매개변수를 설명합니다. | Key | Type | Description | Required | | --- | --- | --- | --- | | linkingId | String | 해제할 연동 ID (createLinking 또는 getLinkedLists에서 획득) | O | - **Callback** 다음 표는 계정 연동 해제 콜백 값을 설명합니다. | Key | Type | Description | | --- | --- | --- | | status | Boolean | 연동 해제 성공 여부 | ## 앱 상태 확인 현재 클라이언트의 점검/업데이트 상태를 확인하려면 아래 코드를 사용해 주십시오. Kotlin: ``` NBase.checkAppStatus(activity) { status, error -> when (status) { is NBaseAppStatus.Maintenance -> { // Maintenance /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, status) { popupStatus, e -> // Popup handling } */ } is NBaseAppStatus.Update -> { // Update /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup NBase.showAppStatusPopup(activity, status) { popupStatus, e -> // Popup handling } */ } null -> { // AppStatus Success or Error if (error != null) { Log.e("NBase", "checkAppStatus error: $error") } else { Log.e("NBase", "checkAppStatus success") } } } } ``` Java: ``` NBase nBase = NBase.INSTANCE; nBase.checkAppStatus(activity, (status, error) -> { if (status instanceof NBaseAppStatus.Maintenance) { // Maintenance /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup nBase.showAppStatusPopup(activity, status, (popupStatus, e) -> { // Popup handling }); */ } else if (status instanceof NBaseAppStatus.Update) { // Update /* case 1: Use in-game popup implemented directly by the developer case 2: Call the code below to use the SDK's own popup nBase.showAppStatusPopup(activity, status, (popupStatus, e) -> { // Popup handling }); */ } else if (status == null) { // AppStatus Success or Error if (error != null) { Log.e("NBase", "checkAppStatus error: " + error.toString()); } else { Log.e("NBase", "checkAppStatus success"); } } return null; }); ``` ## 문제 해결 자주 발생하는 오류와 해결 방법을 안내합니다. **Q. 안드로이드에서 `androidx.security.crypto.MasterKeys` 클래스를 찾지 못했다는 오류가 발생합니다.** A. `MasterKeys` 클래스를 찾지 못해 발생한 오류입니다. 다음 종속성을 `build.gradle` 또는 `build.gradle.kts` 파일에 추가해 주십시오. Groovy: ``` implementation("androidx.security:security-crypto:1.0.0") ``` **Q. 구글 로그인 시 `10: Developer console is not set up correctly.` 오류가 발생합니다.** A. 구글 Cloud 콘솔에 등록된 웹 애플리케이션의 OAuth 2.0 Client ID와 Client Secret이 GAMEPOT 대시보드에 정확히 기입되었는지 확인해 주십시오. **Q. 구글 로그인 시 `16: Cannot find a matching credential.` 오류가 발생합니다.** A. 구글 Cloud 콘솔에 등록된 OAuth 2.0 안드로이드 클라이언트의 패키지 이름과 앱의 SHA-1 값이 일치하는지 확인해 주십시오.