메타 데이터의 끝으로 건너뛰기
메타 데이터의 시작으로 이동

You are viewing an old version of this content. View the current version.

현재와 비교 View Version History

« 이전 버전 8 다음 »


Initialization and Status Change Event Processing


SDK Initialization

This process sets and initializes the app information used by the SDK.

It must be called before any other API when the game starts.

#include "KakaoGameV4.h"

/**
 * Perform initialization using the information set in Unreal Editor
 */
FKGTApplication::InitSDK();

Start

When a game is started, it must call the Start function to notify the Kakao Game SDK that it has been started.

UI functions such as platform announcements, update news, and term agreements are performed when the Start function of the Kakao Game SDK is called.

If there exists a prior user login record, the automatic login function is also performed, and the result is sent through the callback function inputted in the game when the method is called.

Therefore, the game can use the results to decide whether to authenticate the user first or whether to resume a previous game.

#include "KakaoGameV4.h"

FKGTApplication::Start(FKGTResultDelegate::CreateLambda([=](FKGTResult result)
{
  if (result.IsSuccess())
  {
    // If the start is successful
    
    // Check if auto-login is enabled
    bool isLoggedIn = FKGTPlayer::IsLoggedIn();
    
    if (isLoggedIn)
    {
      // The current Player's ID issued by the platform
      FString playerId = FKGTPlayer::GetCurrentPlayer().GetPlayerId();

      // Platform access token
      FString accessToken = FKGTPlayer::GetAccessToken();

      // Retrieve the current IDP authentication information
      FKGTIdpProfile idpProfile = FKGTPlayer::GetCurrentPlayer().GetIdpProfile();

      // [TODO] Move to the game screen.
    }
    else
    {
      // [TODO] If auto-login is not enabled, move to the login screen.
    }
  }
  else
  {
    // If the start fails - since initialization failed, retry the start or close the app.
    int32 resultCode = result.GetCode();

    if (resultCode == FKGTResultCode::NetworkFailure || resultCode == FKGTResultCode::ServerTimeout || resultCode == FKGTResultCode::ServerConnectionFailed)
    {
      // [TODO] If a network error occurs, notify the user that the start failed due to a network issue and retry.
    }
    else
    {
      // [TODO] If other errors occur, notify the user and request a retry of the start process. If the issue persists, check the error code and logs to determine the cause.
    }
  }
}));

Pause

If the game is moved to the background, the game must call the Pause API to notify the Kakao Game SDK that it has become inactive.

When the Pause API is called, the Kakao Game SDK disconnects the connected session and stops periodically sending heartbeats to prevent battery consumption.

#include "KakaoGameV4.h"

// Called when the game enters a background state (e.g., switching to another app or exiting via the home button).
// Register with ApplicationWillEnterBackgroundDelegate so that SDK Pause can be called.
FCoreDelegates::ApplicationWillEnterBackgroundDelegate.AddUObject(this, &UApplicationWidget::Pause);

FKGTApplication::Pause(FKGTResultDelegate::CreateLambda([=](FKGTResult result) {
  // The result always returns a success (200) response.
}));

Resume

If the game is moved back to the foreground from the background, it must call the Resume API to notify the Kakao Game SDK that it has become active.

The Kakao Game SDK checks whether the authentication has expired when the Resume method is called and restores the session depending on the check. The result is then sent through the callback function inputted in the game when the method is called.

The game can use the results to decide whether to authenticate the user again or whether to resume a previous game.

#include "KakaoGameV4.h"

// Called when the game returns to the foreground
// Register with ApplicationHasEnteredForegroundDelegate so that SDK Resume can be called.
FCoreDelegates::ApplicationHasEnteredForegroundDelegate.AddUObject(this, &UApplicationWidget::Resume);

FKGTApplication::Resume(FKGTResultDelegate::CreateLambda([=](FKGTResult result) {
	if (result.IsSuccess())
	{
		// [TODO] If the resume is successful, resume the game screen.
	}
	else
	{
		// [TODO] If resume fails, navigate to the login screen if it’s an authentication failure; otherwise, show an error popup and check if the user wants to retry.
		if (result.Code == FKGTResultCode::AuthFailure || result.Code == FKGTResultCode::IdpAuthFailure)
        {
			// [TODO] If the start fails - Initialization failed, so you should either retry the start or close the app.
		}
		else
		{
			// [TODO] If other errors occur, provide an error notification and retry the resume. If the issue persists, close the app.
		}
	}
});

Setting Up Auto Login in a Windows Environment

This feature is supported in the Windows environment.

If you do not use the default login UI provided by the SDK and instead implement your own login UI, the SDK offers a feature to set up auto login.

  • If you do not configure auto login, the SDK will not create a file for automatic login by default.

  • The file for auto login is created and stored in an encrypted format in the folder ".kakaogames" under the name ".access". This is because multiple users can exist on a single PC."

  • When a game is uninstalled and then reinstalled, if the auto login file remains, the SDK checks whether an encrypted ".access" file exists in the location of the Windows SDK file (KakaoGame.dll). If the file is valid, the SDK loads the file containing the auto login information and performs the auto login.

  • If the auto login files are corrupted, the SDK will delete them.

  • If the auto login file exists and the user logs out or withdraws, the auto login file will be deleted.

#include "KakaoGameV4.h"

// Set whether to use auto-login; if not set, it defaults to not using auto-login
// When auto-login is enabled and login is successful, auto-login information is generated
// If auto-login information exists, auto-login will proceed automatically during the next KGTApplication start, so to remove the auto-login information, you need to log out
bool useAutoLogin = true;
FKGTApplication::SetUseAutoLogin(useAutoLogin);

Login


매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Login SDK Example'.

Logging In Without Using the Default Login UI

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Login SDK Example'.

#include "KakaoGameV4.h"

// Set the IdpCode for the login
EKGTIdpCode idpCode = EKGTIdpCode::Kakao;

// Log in with a specific IDP
FKGTPlayer::Login(idpCode, FKGTResultDelegate::CreateLambda([=](FKGTResult result)
{
  if (result.IsSuccess())
  {
    // The current Player's ID issued by the platform
    FString playerId = FKGTPlayer::GetCurrentPlayer().GetPlayerId();

    // Platform access token
    FString accessToken = FKGTPlayer::GetAccessToken();

    // Retrieve the current IDP authentication information
    FKGTIdpProfile idpProfile = FKGTPlayer::GetCurrentPlayer().GetIdpProfile();
    
    // [TODO] Since the login was successful, proceed to the game screen.
  }
  else
  {
    // IDP login or platform login failed
    // [TODO] If login fails, inform the user and prompt them to retry.

    int32 resultCode = result.GetCode();

    if (resultCode == FKGTResultCode::NetworkFailure || resultCode == FKGTResultCode::ServerTimeout || resultCode == FKGTResultCode::ServerConnectionFailed)
    {
      // [TODO] If a network error occurs, notify the user that the start failed due to a network issue and retry.
    }
    else if (resultCode == FKGTResultCode::Forbidden)
    {
      // [TODO] During the CBT period, authentication may not be possible for users who are not allowed. Provide an appropriate notification to the user.
    }
    else if (resultCode == FKGTResultCode::UserCanceled)
    {
      // [TODO] Since the user canceled during the login process, the login screen should be maintained.
    }
    else
    {
      // [TODO] If other errors occur, provide an error notification and prompt the user to retry logging in. It is necessary to check the error code and logs to determine the cause.
    }
  }
}));

Logging In Through the Launcher

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Login SDK Example'.

#include "KakaoGameV4.h"

// The bridgeToken received through the launcher
FString bridgeToken = "";

FKGTPlayer::LoginWithBridgeToken(bridgeToken, FKGTResultDelegate::CreateLambda([=](FKGTResult result)
{
  if (result.IsSuccess())
  {
    // The current Player's ID issued by the platform
    FString playerId = FKGTPlayer::GetCurrentPlayer().GetPlayerId();
    // Platform access token
    FString accessToken = FKGTPlayer::GetAccessToken();
    // Retrieve the current IDP authentication information
    FKGTIdpProfile idpProfile = FKGTPlayer::GetCurrentPlayer().GetIdpProfile();
    // Additional information received through the launcher
    TSharedPtr<FJsonObject> bridgeTokenPayload = FKGTPlayer::GetCurrentPlayer().GetBridgeTokenPayload();
    // [TODO] Log in to the game server and proceed to the game screen
  }
  else
  {
    // Handle login failure.
    // [TODO] If login fails, inform the user and prompt them to retry.
    int32 resultCode = result.GetCode();
    if (resultCode == FKGTResultCode::NetworkFailure || resultCode == FKGTResultCode::ServerTimeout || resultCode == FKGTResultCode::ServerConnectionFailed)
    {
      // [TODO] If a network error occurs, prompt the user to retry logging in.
    }
    else if (resultCode == FKGTResultCode::Forbidden)
    {
      // [TODO] During the CBT period, authentication may not be possible for users who are not allowed. Display a notification to the user, and after clicking confirm, implement the app to exit.
    }
    else if (resultCode == FKGTResultCode::UserCanceled)
    {
      // [TODO] Since the user canceled during the login process, the login screen should be maintained.
    }
    else
    {
      // [TODO] If other errors occur, provide an error notification and prompt the user to retry logging in.
      // It is necessary to check the error code and logs to determine the cause.
    }
  }
}));

Logout


매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Logout SDK Example'.

Logging Out Without Using the Default Logout UI

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Logout SDK Example'.

#include "KakaoGameV4.h"

// Logout request
FKGTPlayer::Logout(FKGTResultDelegate::CreateLambda([=](FKGTResult result)
{
  if (result.IsSuccess())
  {
    // Logout successful
    // [TODO] Return to the start screen
  }
  else
  {
    // Logout failed
  }
}));

Unregistration


매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Unregistration SDK Example'.

Unregistering Without Using the Default Unregistration UI

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Unregistration SDK Example'.

#include "KakaoGameV4.h"

// Unregistration (account deletion) request
FKGTPlayer::Unregister(showUI, FKGTResultDelegate::CreateLambda([=](FKGTResult result)
{
  if (result.IsSuccess())
  {
    // Unregistration successful
    // [TODO] Return to the start screen
  }
  else
  {
    // Unregistration failed
  }
}));

Account Linking


매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Account Linking SDK Example'.

Linking Accounts Without Using the Default Account Linking UI

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Account Linking SDK Example'.

#include "KakaoGameV4.h"

// Set the IdpCode for the login
EKGTIdpCode idpCode = EKGTIdpCode::Kakao;

// Connect the account with a specific IDP
FKGTPlayer::Connect(idpCode, FKGTResultDelegate::CreateLambda([=](FKGTResult result)
{
  if (result.IsSuccess())
  {
    // IDP connection successful
    // The Player ID does not change.
  }
  else
  {
    // IDP connection failed
    int32 resultCode = result.GetCode();

    if (resultCode == FKGTResultCode::NotAuthorized)
    {
      // If the current session is not logged in
    }
    else if (resultCode == FKGTResultCode::InvalidState)
    {
      // If the currently authenticated IDP is not eligible for account connection
    }
    else if (resultCode == FKGTResultCode::AlreadyUsedIDPAccount)
    {
      // If the account is already connected to another IDP
    }
    else
    {
      // Other errors occurred
    }
  }
}));

Profile


Retrieve My Information

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Profile SDK Example'.

#include "KakaoGameV4.h"

FKGTPlayer player = FKGTPlayer::GetCurrentPlayer();

// Platform playerId
FString playerId = player.GetPlayerId();

// Platform AccessToken
FString accessToken = FKGTPlayer::GetAccessToken();

// idpProfile information
FKGTIdpProfile idpProfile = player.GetIdpProfile();

Retrieve My IDP Information

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Profile SDK Example'.

#include "KakaoGameV4.h"

FKGTPlayer player = FKGTPlayer::GetCurrentPlayer();

// Retrieve IDP information
FKGTIdpProfile idpProfile = player.GetIdpProfile();
EKGTIdpCode idpCode = idpProfile.GetIdpCode();
FString idpUserId = idpProfile.GetIdpUserId();

// Retrieve Kakao IDP information
// If the login state is with Kakao
if (idpCode == EKGTIdpCode::Kakao)
{
  // Retrieve Kakao IDP information
  FKGTKakaoProfile *kakaoProfile = (FKGTKakaoProfile*)&idpProfile;
  
  // Kakao UUID
  FString uuid = kakaoProfile->GetUUID();
  
  // If the same Kakao user is using a different app, return the same group user token
  FString groupUserToken = kakaoProfile->GetGroupUserToken();  
  
  // Remaining number of invites that can be sent today
  int32 remainingInviteCount = kakaoProfile->GetRemainingInviteCount();
  
  // Whether the app is registered
  bool isAppRegistered = kakaoProfile->IsAppRegistered();
  
  // Whether message reception is allowed
  bool isAllowedMessage = kakaoProfile->IsAllowedMessage();
}

System Information


Retrieve Language Code

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_System Information SDK Example'.

#include "KakaoGameV4.h"

FString languageCode = FKGTSystem::GetLanguageCode();

Retrieve Country Code

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_System Information SDK Example'.

#include "KakaoGameV4.h"

FString countryCode = FKGTSystem::GetCountryCode();

Retrieve IP-based Country Code

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_System Information SDK Example'.

#include "KakaoGameV4.h"

FString geoCountryCode = FKGTSystem::GetGeoCountryCode();

Retrieve Device ID

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_System Information SDK Example'.

#include "KakaoGameV4.h"

FString deviceId = FKGTSystem::GetDeviceId();

Retrieve Device Model

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_System Information SDK Example'.

#include "KakaoGameV4.h"

FString deviceModel = FKGTSystem::GetDeviceModel();

Retrieve OS Name

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_System Information SDK Example'.

#include "KakaoGameV4.h"

FString osName = FKGTSystem::GetOSName();

Retrieve Network Connection Status

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_System Information SDK Example'.

#include "KakaoGameV4.h"

bool isNetworkConnected = FKGTSystem::IsNetworkConnected();

Retrieve Connected Network Type

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_System Information SDK Example'.

#include "KakaoGameV4.h"

FString networkType = FKGTSystem::GetNetworkType();

Kakao Integration Feature


Setting Up KakaoTalk Game Message Reception

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Kakao Integration Feature SDK Example'.

#include "KakaoGameV4.h"

// Display the view to set KakaoTalk game message reception preferences
FKGTKakaoTalk::ShowSetting(FKGTResultWithIsAllowMeDelegate::CreateLambda([=](FKGTResult result, bool isAllowMe)
{
  if (result.IsSuccess())
  {
    // Successfully set KakaoTalk game message reception settings
    // isAllowMe - Whether message reception is allowed as per the settings
  }
  else if (result.GetCode() == FKGTResultCode::NotKakaoTalkUser)
  {
    // The logged-in user is not a 'KakaoTalk' user. (For cases where the user is not a KakaoTalk user)
  }
  else
  {
    // Failed to set KakaoTalk game message reception settings
  }
}));

Retrieve KakaoTalk Profile

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Kakao Integration Feature SDK Example'.

#include "KakaoGameV4.h"

// Retrieve KakaoTalk profile
FKGTKakaoTalk::TalkProfile(FKGTResultWithKakaoTalkProfileDelegate::CreateLambda([=](FKGTResult result, FKGTKakaoTalkProfile profile)
{
  if (result.IsSuccess())
  {
    // Successfully retrieved KakaoTalk profile
    // profile - The KakaoTalk profile information of the logged-in user
  }
  else if (result.GetCode() == FKGTResultCode::NotKakaoTalkUser)
  {
    // The logged-in user is not a 'KakaoTalk' user. (For cases where the user is not a KakaoTalk user)
  }
  else
  {
    // Failed to retrieve KakaoTalk profile
  }
}));

Retrieve KakaoTalk Game Friend List

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Kakao Integration Feature SDK Example'.

#include "KakaoGameV4.h"

// Retrieve game friend list
FKGTKakaoTalk::Friends(FKGTResultWithPlayerListDelegate::CreateLambda([=](FKGTResult result, TArray<FKGTPlayer> playerList)
{
  if (result.IsSuccess())
  {
    // Successfully retrieved KakaoTalk game friends list.
    for (FKGTPlayer player : playerList)
    {
      FKGTIdpProfile idpProfile = player.GetIdpProfile();
      FKGTKakaoFriendProfile *kakaoFriendProfile = (FKGTKakaoFriendProfile*)&idpProfile;
    }
  }
  else if (result.GetCode() == FKGTResultCode::NotKakaoTalkUser)
  {
    // The logged-in user is not a 'KakaoTalk' user. (For cases where the user is not a KakaoTalk user)
  }
  else
  {
    // Failed to retrieve KakaoTalk game friends list
  }
}));

Sending KakaoTalk Game Messages

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Kakao Integration Feature SDK Example'.

#include "KakaoGameV4.h"

// Kakao friend profile retrieved through the friends API
FKGTKakaoFriendProfile *kakaoFriendProfile;

// [TODO] Set the template ID
FString templateId = TEXT("");

// [TODO] Set the parameters for the message template
TMap<FString, FString> argumentDic;
argumentDic.Add(TEXT("${nickname}"), kakaoFriendProfile->GetNickname());
argumentDic.Add(TEXT("rog_link"), TEXT("test=100&hello=20111"));

// Send a KakaoTalk game message
FKGTKakaoTalk::SendGameMessage((*kakaoFriendProfile), templateId, argumentDic, FKGTResultDelegate::CreateLambda([=](FKGTResult result)
{
  if (result.IsSuccess())
  {
    // Successfully sent the KakaoTalk chat message
  }
  else
  {
    if (result.GetCode() == FKGTResultCode::MessageSettingDisabled)
    {
      // The recipient has set message reception to be disabled
    }
    else if (result.GetCode() == FKGTResultCode::ExceedDailyUsage)
    {
      // Occurs when the daily quota for sending messages to a specific app (regardless of the recipient) is exceeded.
    }
    else if (result.GetCode() == FKGTResultCode::ExceedMonthlyUsage)
    {
      // Occurs when the monthly quota for sending messages to a specific person for a specific app is exceeded.
    }
    else
    {
      // Failed to send KakaoTalk chat message
    }
  }
}));

Sending KakaoTalk Friend Invitation Messages

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Kakao Integration Feature SDK Example'.

#include "KakaoGameV4.h"

// [TODO] Set whether to display as a popup window
bool isSingle = true;

// [TODO] Set whether to display as a popup window
bool isPopup = true;
  
// [TODO] Set the template ID
FString templateId = TEXT("");

// [TODO] Set the parameters for the message template
TMap<FString, FString> argumentDic;
argumentDic.Add(TEXT("${nickname}"), TEXT("nickname"));

FKGTKakaoTalk::SendInviteMessage(isSingle, isPopup, templateId, argumentDic, FKGTResultWithKakaoUserListDelegate::CreateLambda([=](FKGTResult result, TArray<FKGTKakaoUser> users)
{
  if (result.IsSuccess())
  {
    // Successfully sent KakaoTalk invite message
    for (FKGTKakaoUser user : users)
    {
      // Check the list of users to whom the invite message was sent
    }
  }
  else
  {
    // If all failed (need to return a common cause)
    if (result.GetCode() == FKGTResultCode::MessageSettingDisabled)
    {
      // The recipient has set message reception to be disabled
    }
    else if (result.GetCode() == FKGTResultCode::ExceedDailyUsage)
    {
      // Occurs when the daily quota for sending messages to a specific app (regardless of the recipient) is exceeded.
    }
    else if (result.GetCode() == FKGTResultCode::ExceedMonthlyUsage)
    {
      // Occurs when the monthly quota for sending messages to a specific person for a specific app is exceeded.
    }
    else
    {
      // Failed to send KakaoTalk chat message
    }
  }
}));

Adding a KakaoTalk Channel

매크로 처리 오류 'excerpt-include' : No link could be created for 'EN_Kakao Integration Feature SDK Example'.

#include "KakaoGameV4.h"

// [TODO] Set the channel ID
int32 channelId = 0;

FKGTKakaoTalk::AddChannel(channelId, FKGTResultDelegate::CreateLambda([=](FKGTResult result)
{
  if (result.IsSuccess())
  {
    // Successfully added the channel
  }
  else if (result.GetCode() == FKGTResultCode::NotKakaoTalkUser)
  {
    // The logged-in user is not a 'KakaoTalk' user. (For cases where the user is not a KakaoTalk user)
  }
  else
  {
    // Failed to add the channel
  }
}));

Retrieve the list of friends to whom I sent an invite message

내 초대 메시지로 가입한 친구 목록을 조회하는 예제입니다.

가입한 친구가 없는 경우 빈 객체로 전달됩니다.

#include "KakaoGameV4.h"

// [TODO] Set the event ID
int32 eventId = 0;

// Retrieve the list of players I invited
FKGTKakaoInvitation::Joiners(eventId, FKGTResultWithJoinersDelegate::CreateLambda([=](FKGTResult result, TArray<FKGTPlayer> players)
{
  if (result.IsSuccess())
  {
    // Successfully retrieved the list of players I invited
    for (FKGTPlayer player : players)
    {
      // Recipient's player ID
      FString playerId = player.GetPlayerId();
      FKGTIdpProfile idpProfile = player.GetIdpProfile();
      FKGTKakaoFriendProfile *kakaoProfile = (FKGTKakaoFriendProfile*)&idpProfile;
      // Recipient's nickname
      FString nickname = kakaoProfile->GetNickname();
      // Recipient's profile thumbnail image
      FString thumbnailImageUrl = kakaoProfile->GetThumbnailImageUrl();
      // Check if the recipient has a withdrawal history. Use this flag to display withdrawal information in the UI.
      bool isUnregistered = kakaoProfile->IsUnregistered();
    }
  }
  else if (result.GetCode() == FKGTResultCode::NotKakaoTalkUser)
  {
    // The logged-in user is not a 'KakaoTalk' user. (For cases where the user is not a KakaoTalk user)
  }
  else
  {
    // Failed to retrieve the list
  }
}));

Retrieve the count of friends to whom I sent an invite message

내가 초대 메시지를 보낸 친구 숫자를 조회하는 예제입니다.

#include "KakaoGameV4.h"

// [TODO] Set the event ID
int32 eventId = 0;

// Retrieve the count of players I invited
FKGTKakaoInvitation::ReceiversCount(eventId, FKGTResultWithReceiversCountDelegate::CreateLambda([=](FKGTResult result, int32 totalReceiversCount, int32 joinersCount)
{
  if (result.IsSuccess())
  {
    // Successfully retrieved the counts
    // totalReceiversCount - Total number of friends
    // joinersCount - Number of friends who joined the game
  }
  else if (result.GetCode() == FKGTResultCode::NotKakaoTalkUser)
  {
    // The logged-in user is not a 'KakaoTalk' user. (For cases where the user is not a KakaoTalk user)
  }
  else
  {
    // Failed to retrieve the counts
  }
}));
  • 레이블 없음