--- url: /api-sdk/sdk/gameplay-js/reference.md description: Gameplay 객체가 제공하는 메서드와 에러 코드 전체 명세 --- # 게임플레이 JS SDK 레퍼런스 이 문서는 `Gameplay` 객체가 제공하는 메서드와 에러 코드 전체를 다룹니다. 설치와 초기화 방법은 먼저 [설치·초기화](/api-sdk/sdk/gameplay-js/) 를 참고해 주세요. ## 초기화 ### init(options) ```ts declare function init(options: GameplayInitOptions): Promise; type GameplayInitOptions = { gameName: string; gameCode: string; appId: number; clientKey?: string; accessToken?: string; appUserId?: string; tiara?: boolean | GameplayTiaraOptions; ad?: GameplayAdOptions; webview?: GameplayWebviewOptions; ui?: GameplayManagedUIOptions; }; type GameplayTiaraOptions = { thirdAdAgree?: boolean; }; type GameplayManagedUIOptions = { container?: HTMLElement; navigation?: GameplayNavigationControlsOptions; }; type GameplayAdOptions = { preload?: boolean; }; type GameplayWebviewOptions = { statusBarOverlay?: boolean; statusBarColor?: string; orientation?: 'portrait' | 'landscape'; scrollEnabled?: boolean; bouncesEnabled?: boolean; pullToRefreshEnabled?: boolean; linkPreviewEnabled?: boolean; backSwipeEnabled?: boolean; }; ``` SDK를 초기화합니다. 페이지 라이프사이클당 1회 호출을 권장하며, 초기화가 끝나기 전에 다시 호출하면 먼저 시작된 호출과 동일한 Promise를 공유합니다. | 옵션 | 타입 | 설명 | | --- | --- | --- | | `gameName` | `string` | 필수게임 이름. 닫기 버튼을 눌렀을 때 SDK가 띄우는 [이탈 확인 팝업](/api-sdk/sdk/gameplay-js/ui#나가기-버튼)의 제목으로 쓰입니다 | | `gameCode` | `string` | 필수파트너사가 정해 게임플레이 파트너센터에 등록한 게임 코드. [단축 URL 생성](/api-sdk/share/short-url)의 `gameCode` · 광고 CPID 와 같은 값입니다 | | `appId` | `number` | 필수카카오디벨로퍼스 앱 ID. 게임 로그에서 `appUserId` 의 짝으로 쓰입니다. 확인 방법은 [앱 ID](https://developers.kakao.com/docs/ko/app-setting/app#app-id) 참고 | | `clientKey` | `string` | 카카오디벨로퍼스가 발급하는 JavaScript 키. 생략하면 카카오 JS SDK 로드를 건너뜁니다. 이후 `talkShare` 호출은 `KAKAO_NOT_AVAILABLE` 이 됩니다 | | `accessToken` | `string` | 카카오 계정 access token. 게임 로그를 카카오 계정과 연결합니다. `appUserId` 와 둘 중 하나를 지정합니다 | | `appUserId` | `string` | 카카오 앱 사용자 ID. 단독으로는 쓸 수 없고 `appId` 와 짝을 이룹니다 | | `tiara` | `boolean` | [`GameplayTiaraOptions`](#type-gameplaytiaraoptions) | 기본값 `true`게임 로그 자동 전송. 이미 [Tiara Web SDK](/api-sdk/sdk/tiara-web)를 직접 연동한 게임은 `false` 로 끕니다. 아래 표 참고 | | `ad` | [`GameplayAdOptions`](#type-gameplayadoptions) | 기본값 `{preload: true}`끄더라도 광고 API 를 호출하면 그 시점에 로드됩니다 | | `webview` | [`GameplayWebviewOptions`](#type-gameplaywebviewoptions) | 웹뷰 초기 상태를 선언형으로 지정합니다 | | `ui` | [`GameplayManagedUIOptions`](#type-gameplaymanageduioptions) | managed UI 부트스트랩. 아래 표 참고 | `accessToken` · `appUserId` · `tiara` 는 게임 로그에 쓰입니다. 아래 [게임 로그](#게임-로그)를 참고하세요. `webview` 의 각 필드는 톡 버전과 플랫폼 제약이 다릅니다. | 필드 | 톡 버전 | 플랫폼 | 설명 | | --- | --- | --- | --- | | `statusBarOverlay` | 26.5.0+ | Android · iOS | 웹뷰를 상태바 영역까지 확장합니다 (전체화면) | | `statusBarColor` | 26.6.0+ | Android · iOS | 상태바 배경색. `#RRGGBB` 형식 | | `orientation` | 26.3.0+ | Android · iOS | 화면 방향 | | `scrollEnabled` | 26.7.0+ | Android · iOS | 웹뷰 스크롤·오버스크롤 제스처 | | `bouncesEnabled` | 26.7.0+ | iOS | 오버스크롤 바운스만 개별 제어 | | `pullToRefreshEnabled` | 26.7.0+ | iOS | 당겨서 새로고침 | | `linkPreviewEnabled` | 26.7.0+ | iOS | 링크 롱프레스 미리보기 | | `backSwipeEnabled` | 26.3.0+ | iOS | 좌측 엣지 백 스와이프. 26.8.0 부터 게임웹뷰 기본값은 `false` 이므로, 켜야 할 때만 지정합니다 | `webview` 로 지정한 항목은 대응하는 개별 메서드와 같은 동작이며, **init 에서 선언하는 것이 권장 경로입니다.** 개별 메서드는 게임 도중 값을 다시 바꿔야 할 때만 사용합니다. 각 필드와 대응하는 메서드의 관계는 이 문서의 해당 메서드 항목에서 밝힙니다. `ui` 의 각 필드는 다음과 같습니다. | 필드 | 타입 | 설명 | | --- | --- | --- | | `container` | `HTMLElement` | 기본값 `document.body`SDK가 UI를 붙일 요소. 게임이 별도 루트 안에서 화면을 그리는 경우에만 지정합니다 | | `navigation` | [`GameplayNavigationControlsOptions`](/api-sdk/sdk/gameplay-js/ui#navigation) | 초기 navigation 구성. 표시 여부는 이 안의 `visible` 이 정합니다 | `ui` 를 생략하면 navigation이 기본 구성으로 표시됩니다. modal·toast·bottom sheet·loader는 `ui` 값과 무관하게 **호출한 시점에** 뜹니다. `ui` 가 정하는 것은 navigation 하나입니다. 안전영역과 상태바 오버레이는 navigation 표시 여부와 무관하게 늘 조회해 반영합니다. navigation을 띄우지 않아도 modal·toast가 그 기준선을 그대로 씁니다. ### navigation 을 숨긴 채 시작하기 `navigation.visible` 을 `false` 로 주면 `init` 이 navigation을 그리지 않습니다. **UI를 끄는 것이 아닙니다** — 호출한 컴포넌트는 그때 뜨고, `container` 도 그대로 적용됩니다. 구성과 표시는 다른 축이라, 구성은 미리 해두고 숨긴 채 시작할 수 있습니다. ```ts await Gameplay.init({ gameName: '게임 이름', gameCode: 'sample-game', appId: 1234567, ui: {navigation: {visible: false, backgroundColor: '#000000'}, container: myRoot}, }); // navigation은 뜨지 않습니다. 부른 컴포넌트만 뜹니다. Gameplay.UI.Modal.open({title: '알림'}); // 필요해지면 이때 뜹니다. 위에서 준 구성 그대로입니다. Gameplay.UI.Navigation.show(); ``` ::: danger 숨긴 동안에는 사용자가 게임웹뷰를 벗어날 수 없습니다 나가기(닫기) 버튼이 navigation 안에 있습니다. 숨긴 동안 게임이 자체 종료 동선을 제공하지 않으면 사용자가 게임에 갇힙니다. 연출 때문에 잠깐 숨겼다면 **반드시 되돌리세요.** 종료 경로가 있는지는 SDK가 보장하지 못하므로 심사에서 확인합니다. 자체 UI를 이미 가진 게임이 SDK를 단계적으로 들일 때 쓰는 값입니다. 새로 연동하는 게임은 `visible` 을 건드리지 마세요. ::: 성공하면 별도 값 없이 Promise가 resolve됩니다. `clientKey` 를 지정했거나 `window.Kakao` 객체가 이미 로드되어 있으면, `init()` 내부에서 카카오 JS SDK 를 로드합니다. 이 로드가 실패하거나 응답이 없으면 `init()` 이 `KAKAO_NOT_AVAILABLE` 로 reject됩니다. **`clientKey` 를 쓰는 게임은 `init()` 호출을 반드시 try/catch 로 감싸 주세요.** 감싸지 않으면 광고 차단기·CSP 차단·네트워크 지연 같은 상황에서 unhandled rejection 이 됩니다. 그 외 내부 동작은 `init()` 을 막지 않습니다. 광고 SDK 선로드 실패는 `init()` 을 실패시키지 않고 광고 생성 메서드를 호출하는 시점에 `AD_SDK_NOT_AVAILABLE` 로 드러나며, `webview` 옵션 적용 실패와 안전영역·상태바 오버레이 조회 실패도 각각 내부에서 처리되어 `init()` 을 막지 않습니다. ```ts try { await Gameplay.init({ gameName: '게임 이름', gameCode: 'sample-game', appId: 1234567, clientKey: 'YOUR_JAVASCRIPT_KEY', webview: { orientation: 'landscape', scrollEnabled: false, }, }); } catch (error) { // isGameplaySdkError 의 정의는 아래 [에러](#gameplaysdkerror) 항목을 참고해 주세요. if (isGameplaySdkError(error) && error.code === 'KAKAO_NOT_AVAILABLE') { // clientKey 를 지정했으므로 카카오 JS SDK 로드에 실패하면 이 코드로 reject됩니다. } else { // 예상하지 못한 실패입니다. throw error; } } ``` ### 게임 로그 게임 로그(Tiara)는 **SDK 가 대신 보냅니다.** Tiara Web SDK 를 직접 연동하지 않아도 되고, 게임이 구현할 항목도 없습니다. | SDK 가 보내는 로그 | 시점 | | --- | --- | | `SDK_UI_게임_조회` | init 직후 | | `SDK_UI_게임_체류시간` | 백그라운드 전환과 페이지 이탈 | | `SDK_UI_더보기_클릭` | 더보기 목록이 열릴 때 | | `SDK_UI_더보기_{메뉴명}_클릭` | 더보기 항목 클릭 | | `SDK_UI_닫기_클릭` · `SDK_UI_접기_클릭` | 상단 버튼 클릭 | | `SDK_UI_게임종료_팝업_노출` | 종료 확인 팝업 노출 | | `SDK_UI_게임종료_팝업_확인_클릭` · `SDK_UI_게임종료_팝업_취소_클릭` | 팝업 버튼 클릭 | ::: warning 이미 Tiara 를 직접 연동했다면 `tiara: false` 로 꺼 주세요. 켠 채로 두면 같은 로그가 두 번 쌓입니다. ::: 게임이 넣는 값은 `gameCode` 와 카카오 사용자 식별값입니다. `gameCode` 는 로그의 `section`(`sdk_ui_{gameCode}`)과 `page_meta.id` 가 되고, 식별값은 `accessToken` 하나이거나 `appUserId` + `appId` 입니다. `clientKey` 를 준 경우에는 `appUserId` + `clientKey` 조합도 성립합니다. `svcDomain` · `page` · `thirdProvideAgree` 같은 나머지 항목은 SDK 가 채웁니다. 식별값을 넣지 않아도 게임은 정상 동작하지만, 그 로그는 카카오 분석 환경에서 집계·활용할 수 없습니다. 더보기 항목 클릭은 메뉴명을 액션명에 넣어 하나로 보냅니다. 기본 항목은 `SDK_UI_더보기_공유하기_클릭` · `SDK_UI_더보기_문의하기_클릭` 이 되고, `dropdown.items` 로 덧붙인 항목은 그 `label` 이 메뉴명이 됩니다. 액션명에 쓸 수 없는 문자는 빠집니다 — 글자·숫자·`_` 만 남습니다(`게임 가이드(신규)` → `SDK_UI_더보기_게임가이드신규_클릭`). ::: tip 액션명이 [게임 로그 설정](/api-sdk/sdk/tiara-game-logs)과 다릅니다 그 문서는 Tiara Web SDK 를 직접 연동하는 게임용입니다. 게임플레이 JS SDK 는 `section` · `page` · 액션명이 모두 다른 별도 명세를 씁니다 — 두 경로의 로그를 분석 단계에서 가를 수 있어야 하기 때문입니다. 직접 구현할 항목이 없으므로 게임이 두 명세를 구분할 필요는 없습니다. | | 직접 연동 | 게임플레이 JS SDK | | --- | --- | --- | | `section` | `SDK_{게임ID}` | `sdk_ui_{gameCode}` | | `page` | `SDK게임` | `SDK_UI` | | 액션명 | `SDK_게임_조회` · `게임_더보기_클릭` 등 | `SDK_UI_` 접두어로 통일 | ::: `tiara` 는 `boolean` 또는 설정 객체를 받습니다. 켜지는 것은 `true` 와 같고 설정만 얹으므로, `tiara: true` 와 `tiara: {}` 는 결과가 같습니다. | 필드 | 타입 | 설명 | | --- | --- | --- | | `thirdAdAgree` | `boolean` | 광고 마케팅 정보 제공 동의 여부. 사용자가 고르는 값이라 동의·미동의가 모두 발생합니다 | **값을 모르면 주지 않습니다.** 주지 않으면 SDK 가 동의 여부를 설정하지 않아 미설정 상태로 남습니다. 로그인 전이라 아직 모르는 상태를 `false` 로 적어 보내면 동의한 사용자를 미동의로 기록하게 됩니다. 제3자 정보 제공 동의(`thirdProvideAgree`)는 옵션이 아닙니다. 게임플레이 진입 자체가 그 동의를 필수로 거치므로 SDK 가 `true` 로 고정합니다. ### isAvailable(capability) ```ts declare function isAvailable(capability: GameplayCapability): boolean; type GameplayCapability = Exclude< keyof typeof Gameplay, 'version' | 'init' | 'isAvailable' | 'onTalkEventMessage' | 'UI' >; ``` 메서드가 현재 환경에서 실제로 지원되는지 동기적으로 점검합니다. 카카오톡 버전은 패치·백포트 빌드가 섞여 있어 버전 비교만으로는 지원 여부를 정확히 알 수 없으므로, 기능 분기가 필요하면 항상 이 메서드로 직접 확인합니다. | 파라미터 | 타입 | 설명 | | --- | --- | --- | | `capability` | [`GameplayCapability`](#type-gameplaycapability) | 필수확인할 메서드 이름. `version` · `init` · `isAvailable` · `onTalkEventMessage` · `UI` 를 제외한 `Gameplay` 의 모든 메서드 이름 중 하나입니다 | 메서드가 실제로 지원되면 `true`, 아니면 `false` 를 반환합니다. 동기 함수이며 어떤 코드도 던지지 않습니다. ```ts if (Gameplay.isAvailable('setScrollEnabled')) { await Gameplay.setScrollEnabled(false); } ``` ### version ```ts declare const version: string; ``` 로드된 SDK 번들의 버전입니다. 메서드가 아니라 값이라 호출하지 않으며, `init()` 전에도 읽을 수 있습니다. SDK `1.0.0-beta.1` 부터 제공합니다. 그 이전 버전에서는 `undefined` 입니다. ```ts console.log(Gameplay.version); // '1.0.0-beta.1' ``` 평소에는 쓸 일이 없습니다. `