Skip to content
Stove
Last Updated

Curious about the actual application flow?

Usage Scenarios / Checking Game News

Pop-up

Understanding


An SDK pop-up service that shows screens such as notices, events, and coupons to users inside the game. Each screen can be configured in various ways in Partners.
It supports both Mobile (Android/iOS) and PC, and the delivery method differs by platform.

Pop-up Types

Type Description Mobile PC
Auto pop-up Shows full-screen pop-ups in sequence without any user action on lobby entry. For ads/events.
Manual pop-up Shows the registered screen when the specified location is called. Used to display it under specific actions/conditions.
News pop-up Collects and shows notice posts. If there's no content, it shows "Coming soon".
Coupon pop-up Uses the coupon feature with an issued coupon number. (On PC, multi-platform games only)
Community Shows the STOVE Community as a pop-up. Called while keeping the user logged in.
Custom URL Shows a web page you built yourself in the built-in WebView.
Identity-verification pop-up Runs the in-game identity-verification procedure as a pop-up. (Korea only)

Coupon pop-up integration is covered on a separate page
For how to integrate the coupon pop-up, see the Coupon page in the Feature Guides.

Mobile / PC Comparison

Item Mobile PC
SDK Mobile SDK PCSDK View SDK (v3.1.0 or higher)
Pop-up display method Shows the pop-up in the SDK's built-in WebView Shows the pop-up in the View SDK's built-in WebView (Windows only)
Initialization order Pop-ups can be called after the user login completes Base SDK initialization → View SDK initialization order is required
Supported platforms Android (Kotlin/Java), iOS, Unity, Unreal Native C/C++, Unity, Unreal
Pop-up management Configured per event screen via Partners Configured per event screen via Partners (all game types supported)
Overlay feature Requires a separate setting to use the Overlay UI in View 2.8.2 or higher Not applicable

PC — be careful with the View SDK initialization order
ㅁ You must complete Base SDK integration and initialization before View SDK initialization (otherwise View SDK features can't be used).
ㅁ Perform View SDK initialization before using any other View SDK features.

Common Pop-up Settings

The items below can be configured in common for news, auto, and manual pop-ups.

Setting item Description
Close button Choose a custom image or a preset template (news/auto: 6 kinds, manual: 3 kinds).
Bottom navigation Can be turned ON/OFF. (Back, Forward, Refresh, Home ON/OFF)
Don't show today The button can be turned ON/OFF and set to 1 day / 7 days. (Supported for news/auto pop-ups only; not supported for manual pop-ups)

Integration Guide


Integration Preparation

Mobile

Item Details
User login User login must be completed.
Register the pop-up in Partners Register pop-up info in Partners (except for the direct-call method).
Overlay UI setting (optional) A separate setting when using Overlay (View 2.8.2 or higher).

PC (PCSDK)

Item Details
Base SDK integration and initialization Complete Base SDK integration and initialization before View SDK initialization.
Register the pop-up in Partners Register basic info (world id) in Partners, then configure display.
Game-profile setup ㅁ When using field/character info, the game profile must be set before using pop-up features
ㅁ Use BaseSDK's Base_SetGameProfile API
Check pop-up-supported games ㅁ Register pop-up metadata in Partners before calling the PC SDK pop-up API
ㅁ Usable by both multi-platform games and PC-only games

Development


Mobile

This is how to call each pop-up API of the STOVE SDK View module. The code is separated into tabs by platform, so pick only the platform you use.

News Pop-up

A pop-up that collects and shows notice posts at once. You can configure the details per event screen in Partners.

  • Close button: a custom image or one of 6 preset templates
  • Bottom navigation (Back/Forward/Refresh/Home) ON/OFF
  • "Don't show today" button ON/OFF (1 day / 7 days)

csharp
public void News()
{
    ViewUI.News((Result result, Dictionary<string, string> dictionary) =>
    {
        if (result.IsSuccessful)
        {
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) =>
            {
                /** ex) keep the current screen **/
            });
        }
    });
}

kotlin
private fun newsPopup(activity: Activity) {
    ViewUI.news(activity) { result, map ->
        //closed view
    }
}

ErrorCodes

DomainErrorCodeDescription
com.stove.success0Success
com.stove.server404The path variable wasn't provided, or the API address was wrong
com.stove.base.network10001NoConnectionError
com.stove.base.network10002TimeoutError

Auto Pop-up

The ad/event pop-up shown most on the game lobby screen. On in-game entry, full-screen pop-ups are shown in sequence without any user touch.

  • Close button: a custom image or one of 6 preset templates
  • Bottom navigation (Back/Forward/Refresh/Home) ON/OFF
  • "Don't show today" button ON/OFF (1 day / 7 days)
  • During auto pop-ups, depending on Partners settings, a store pop-up may be shown, and item payment is possible within the web view.

Result-handling guide
Auto pop-ups are an ad area shown without user touch, so don't block the game flow at the callback. In the success callback, keep the screen as-is, and if payment occurred via a store pop-up, separately request the game server to sync the payment result. Delegate failures to OperationUI.HandleResult(result, ...) so the SDK shows the appropriate guidance screen.


csharp
public void AutoPopup()
{
    ViewUI.Popup((Result result, Dictionary<string, string> dictionary) =>
    {
        if (result.IsSuccessful)
        {
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) =>
            {
                /** ex) keep the current screen **/
            });
        }
    });
}

kotlin
private fun autoPopup(activity: Activity) {
    ViewUI.popup(activity) { result, map ->
        //closed view
    }
}

ErrorCodes

DomainErrorCodeDescription
com.stove.success0Success
com.stove.server1000WRONG_API_USAGE
com.stove.server2000SERVICE_ERROR
com.stove.server90000Error: request accessToken is not exists.
com.stove.server90001Error: accessToken invalid.
com.stove.base.network10001NoConnectionError
com.stove.base.network10002TimeoutError

Manual Pop-up

When you call a manual pop-up with a defined location at the desired place in the game, the registered event screen is shown. Used to conditionally show a pop-up on a specific in-game UI touch or screen entry.

  • Close button: a custom image or one of 6 preset templates
  • Bottom navigation (Back/Forward/Refresh/Home) ON/OFF

Parameters

ParameterTypeDescription
locationintPop-up location (1–5)

csharp
public void ManualPopup()
{
    /**
     * location : pop-up location (int)
     **/
    ViewUI.Popup("location", (Result result, Dictionary<string, string> dictionary) =>
    {
        if (result.IsSuccessful)
        {
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) =>
            {
                /** ex) keep the current screen **/
            });
        }
    });
}

kotlin
private fun manualPopup(activity: Activity) {
    ViewUI.popup(activity, 1) { result, map ->
        //closed view
    }
}

ErrorCodes

DomainErrorCodeDescription
com.stove.success0Success
com.stove.server404The path variable wasn't provided, or the API address was wrong
com.stove.server70004When the ui_location value is 0
com.stove.base.network10001NoConnectionError
com.stove.base.network10002TimeoutError

Using Coupons

Use the coupon feature by passing a coupon number issued in Partners. On Android, using ViewUI.coupon on the in-game screen shows the STOVE coupon-input window.

  • How to register coupons: see the Partners Coupon Management manual
  • Server development guide: when a user enters a coupon and the grant conditions are met, the grant info is stored in STOVE ItemBox. The game server can implement either real-time delivery (Notification) or request (API Call). See Integrating ItemBox.

Branching by error-code group
Coupon errors differ in the user-notice message and whether retry is possible. Write the callback branches by the groups below.

  • Prompt re-entry (5105 invalid coupon / 5031 daily verification-count exceeded / 6026 usage-count exceeded): show the message and keep the input window open to accept input again.
  • Close the input window + notice (5125 already used / 5130 disabled / 5135 expired / 5161 registration period ended / 5169 not within usage period / 5202 already registered): show the message and close the input window. Retrying the same coupon is meaningless.
  • Eligibility notice (5162 country / 5164 world / 5200 usage target / 5165 coupon-box only / 100 PC-cafe only / 2605 membership not usable): inform the user they're ineligible and close the input window.
  • Re-authenticate (997 Not Verify / 998 Expired): re-fetch Auth.accessToken or guide the user into the re-login flow. Delegate other system errors (999, 6002) to OperationUI.HandleResult.

csharp
public void UseCoupon()
{
    /**
     * code : coupon input (string)
     **/
    View.UseCoupon("code", (Result result) =>
    {
        if (result.IsSuccessful)
        {
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) =>
            {
                /** ex) keep the current screen **/
            });
        }
    });
}

kotlin
fun useCoupon(context: Context, code: String) {
    View.useCoupon(context, code) { result, map ->

    }
}

ErrorCodes

DomainErrorCodeDescription
com.stove.server100This coupon can only be used in a PC cafe.
com.stove.server997Not Verify AccessToken
com.stove.server998Expired AccessToken
com.stove.server999System Error
com.stove.server2605This membership account cannot use it.
com.stove.server5031You've exceeded the daily verification count.
com.stove.server5105Invalid coupon number.
com.stove.server5125This coupon has already been used.
com.stove.server5130This coupon has been disabled.
com.stove.server5135This coupon has expired.
com.stove.server5155You've exceeded this coupon's usage limit.
com.stove.server5161This coupon's registration period has expired.
com.stove.server5162This coupon can't be used in your country.
com.stove.server5164This coupon can't be used in this world.
com.stove.server5165This coupon can only be used from the coupon box.
com.stove.server5169It's not within this coupon's usage period.
com.stove.server5200You're not an eligible target for this coupon.
com.stove.server5202This coupon is already registered in the coupon box.
com.stove.server6002This coupon number can no longer be used.
com.stove.server6026The usage count has been exceeded.

Community

Shows the STOVE Community as a pop-up in-game. For the community to display correctly, the community must be pre-configured in Partners and the Partners key value must be registered in VIEW > community_id of the SDK Config.


csharp
public void Community()
{
    ViewUI.Community((Result result, Dictionary<string, string> dictionary) =>
    {
        if (result.IsSuccessful)
        {
            if (dictionary != null && dictionary.ContainsKey("received_data"))
            {
                string receivedData = dictionary["received_data"];
                Dictionary<string, object> data = Json.Deserialize(receivedData) as Dictionary<string, object>;

                if (data != null)
                {
                    if (data.TryGetValue("code", out object codeObj) && codeObj is long errorCode)
                    {
                        if (errorCode == 40104) {
                            /** SDK auth token expired — log out and go to the initial screen **/
                        }
                    }
                }
            }
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) => { });
        }
    });
}

kotlin
private fun community(activity: Activity) {
    ViewUI.community(activity) { result, map ->
        //closed view
    }
}

ErrorCodes

DomainErrorCodeDescription
com.stove.success0Success
com.stove.server11236Error : Access token is wrong.
com.stove.base.network10001NoConnectionError
com.stove.base.network10002TimeoutError

Calling a Community URL Directly

Calling a specific URL within the community the ordinary way results in a logged-out call. Using the interface below, you can call it while keeping the user logged in.

Handling the received_data response
The success callback's userInfo["received_data"] is a JSON string. After parsing, if code == 40104, the SDK auth token has expired, so guide the user into the re-login flow. Other codes can be handled per your game's defined format or ignored. Delegate the failure callback to OperationUI.HandleResult(result, ...).


csharp
public void CommunityWithURL()
{
    /**
     * url : url input (string)
     **/
    ViewUI.Community("url", (Result result, Dictionary<string, string> dictionary) =>
    {
        if (result.IsSuccessful)
        {
            if (dictionary != null && dictionary.ContainsKey("received_data"))
            {
                string receivedData = dictionary["received_data"];
                Dictionary<string, object> data = Json.Deserialize(receivedData) as Dictionary<string, object>;

                if (data != null)
                {
                    if (data.TryGetValue("code", out object codeObj) && codeObj is long errorCode)
                    {
                        if (errorCode == 40104) {
                            /** SDK auth token expired **/
                        }
                    }
                }
            }
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) => { });
        }
    });
}

kotlin
private fun community(activity: Activity, url: String) {
    ViewUI.community(activity, url) { result, map ->
        //closed view
    }
}

ErrorCodes

DomainErrorCodeDescription
com.stove.success0Success
com.stove.server11236Error : Access token is wrong.
com.stove.base.network10001NoConnectionError
com.stove.base.network10002TimeoutError

Custom URL

Shows a URL of your choice in a WebView. With ViewConfiguration, you can choose partial-screen or full-screen display.

Parameters

ParameterTypeDescription
viewRequestViewRequestThe config item for showing the View

Per-platform implementation — partial screen

csharp
public void Load()
{
    ViewConfiguration viewConfiguration = ViewConfiguration.Partial();
    ViewRequest viewRequest = new ViewRequest("url", viewConfiguration);
    ViewUI.Load(viewRequest, (Result result, Dictionary<string, string> dictionary) =>
    {
        if (result.IsSuccessful)
        {
            if (result.UserInfo != null && result.UserInfo.TryGetValue("userAction", out string userAction))
            {
                if (!string.IsNullOrEmpty(userAction) && userAction.Equals("withdraw_complete"))
                {
                    /** ex) game withdrawal complete **/
                }
            }
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) => { });
        }
    });
}

kotlin
private fun load(activity: Activity) {
    val url = "https://www.onstove.com/"
    val viewConfiguration = ViewConfiguration.partial()
    val viewRequest = ViewRequest(url, viewConfiguration = viewConfiguration)
    ViewUI.load(activity, viewRequest) { result, map ->
        if (result.isSuccessful()) {
            result.userInfo?.let { userInfo ->
                when (userInfo["userAction"]) {
                    "withdraw_complete" -> {
                        // Withdrawn state
                    }
                }
            }
        }
    }
}

Per-platform implementation — full screen

csharp
public void Load()
{
    ViewConfiguration viewConfiguration = ViewConfiguration.Full();
    ViewRequest viewRequest = new ViewRequest("url", viewConfiguration);
    ViewUI.Load(viewRequest, (Result result, Dictionary<string, string> dictionary) =>
    {
        if (result.IsSuccessful)
        {
            if (result.UserInfo != null && result.UserInfo.TryGetValue("userAction", out string userAction))
            {
                if (!string.IsNullOrEmpty(userAction) && userAction.Equals("withdraw_complete"))
                {
                    /** ex) game withdrawal complete **/
                }
            }
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) => { });
        }
    });
}

WebView Common Guide

This covers the header info, URI schemes, JavascriptInterface, and data send/receive patterns commonly used when showing a web page you built in the SDK WebView (news/auto/manual pop-ups, community, custom URL, etc.).


Info the SDK passes in the header when calling the WebView

If you build a web page yourself for game operations, you can use the following data. The data below is included in the header.

KeyDescription
authorizationThe token issued by the STOVE authentication server
characternoThe user's character number (included only if the game uses it)
ServerIDThe user's world (included only if the game uses it)
SDK-VersionThe View module's version (e.g., 2.0.0)
Accept-LanguageThe language set by the device or game (e.g., ko)



Communicating with the Web

The STOVE SDK supports predefined JavascriptInterface and URI schemes.

URI: Common

DefinitionDetailsExampleAvailable version
stovewebs://Goes to an external link (Safari, Chrome)stovewebs://naver.com → opens https://naver.com in the browser2.0.0
stovecommunitys://Opens the STOVE CommunityConverts stovecommunitys to https, then goes to the community view2.0.0

URI: Android only

DefinitionDetailsExampleAvailable version
intent://Goes to an external linkstovewebs://naver.com → goes to https://naver.com2.0.0
A scheme other than http/httpsStarts an Activity that can receive an ACTION_VIEW Intentmarket://details?id=com.stove.mstove.google → PlayStore, twitch://open?link_click_id=... → Twitch2.0.0

JavascriptInterface

DefinitionDetails
closeWebviewCloses the current view (can pass data to the SDK)
getDeviceInfoLooks up device info (received via StoveJSBridge.callback)
getValueLooks up a game property. Pass the key as a parameter (received via StoveJSBridge.callback)

Code example

javascript
function closeWebview(){
    if (window._StoveJSBridge) {
        window._StoveJSBridge.invoke("closeWebview", "data to pass to the game client", null);
    } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.StoveJS) {
        var message = { method: 'closeWebview', parameter: 'data to pass to the game client' };
        window.webkit.messageHandlers.StoveJS.postMessage(message);
    }
}
function getDeviceInfo(){
    if (window._StoveJSBridge) {
        window._StoveJSBridge.invoke("getDeviceInfo", null, "getDeviceInfoCallbackId");
    } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.StoveJS) {
        var message = { method: 'getDeviceInfo', callbackId: 'getDeviceInfoCallbackId' };
        window.webkit.messageHandlers.StoveJS.postMessage(message);
    }
}
function getValue(){
    if (window._StoveJSBridge) {
        window._StoveJSBridge.invoke("getValue", '{"key":"fetchKey"}', "getValueCallbackId");
        //If you need to specify a default, use the form '{"key":"fetchKey", "default":"testValue"}'
    } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.StoveJS) {
        var message = { method: 'getValue', callbackId: 'getValueCallbackId' };
        window.webkit.messageHandlers.StoveJS.postMessage(message);
    }
}

var StoveJSBridge = {
    callback: function(callbackId, error, result) {
        if(callbackId === "getDeviceInfoCallbackId") {
            const resultJSON = JSON.parse(result);
            const marketGameId = resultJSON.market_game_id;
            const deviceId = resultJSON.device_info.device_id;
            const osName = resultJSON.device_info.os_name;
            const adid = resultJSON.device_info.adid;
        } else if(callbackId === "getValueCallbackId") {
            const resultJSON = JSON.parse(result);
            const returnCode = resultJSON.return_code;
            if(returnCode === 0){
                const key = resultJSON.key;
                const value = resultJSON.value;
            } else if(returnCode === 39403) {
                //Not Exist Key
            } else if(returnCode === 39002) {
                //Invalid Params
            }
        }
    }
};



Receiving data from the JavascriptInterface in the SDK

You can receive the data passed via closeWebview from the web page through the received_data key of the SDK callback.


csharp
private void News()
{
    ViewUI.News((Result result, Dictionary<string, string> dictionary) =>
    {
        if (dictionary != null && dictionary.ContainsKey("received_data"))
        {
            string value = dictionary["received_data"];
        }
    });
}

Setting properties in the SDK for the web page to look up

Used for storing and looking up data between Game Client ↔ SDK ↔ Web. @since 2.1.0


csharp
public void SetProperties()
{
    AccessToken accessToken = Auth.AccessToken;
    if (accessToken == null) { return; }
    Dictionary<string, object> properties = new Dictionary<string, object>();
    properties.Add("testKey", "testValue");
    GameProfile gameProfile = accessToken.User.GameProfile;
    if (gameProfile == null)
    {
        accessToken.User.GameProfile = new GameProfile();
    }
    accessToken.User.GameProfile.Properties = properties;
}

Opening an External Browser (+SSO Integration)

Opens ON STOVE pages (coupon/community/customer support, etc.) in an external browser while keeping the authentication session.

⚠️ Caution
Guest accounts cannot use this feature.
Accounts logged in with a certificate (signing key) other than STOVE's are also prohibited from SSO external-browser calls. Always complete 'switch to STOVE account' before calling.


csharp
/**
 * url : "the url to open in the external browser: coupon or community, etc.";
 **/
public void OpenExternalUrl()
{
    AccessToken accessToken = Auth.AccessToken;
    if (accessToken == null) { return; }

    string url = "the url to open in the external browser: coupon or community, etc.";

    ViewUI.OpenExternalUrl(url, (Result result) =>
    {
        if (result.IsSuccessful)
        {
            // External-browser integration success
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) => { });
        }
    });
}

PC (PCSDK)

Prerequisites

  • Initialize ViewSDK with View_Initialize after Base SDK initialization completes. To specify the parent HWND for internal-mode pop-ups, use View_InitializeWithWndInfo(hwnd). If you use only external-browser mode, you can call View_Initialize without a parent HWND.
  • Base_RunCallback() must be called periodically in the game loop for async callbacks to work.
  • If you use character/field info in Partners settings, set the game profile first with Base_SetGameProfile.
  • The identity-verification pop-up returns NOT_SUPPORTED_COUNTRY (31) outside Korea.
  • The coupon pop-up is covered on a separate page. (See Coupon (Itembox))
  • Opening ON STOVE pages (community/customer support, etc.) in an external browser is an API of the BaseSDK module (Base_OpenExternalUrl), not the ViewSDK (pop-up) module. So it can be called once Base_Initialize completes. Only STOVE-related domains are allowed, and SSO login is kept.

Development Flow

  1. Initialization: after completing Base SDK initialization (Base_Initialize or Base_InitializeEx), initialize ViewSDK with View_Initialize. To use internal-mode pop-ups, use View_InitializeWithWndInfo, passing the game's main HWND.
  2. Show the pop-up: call the API that fits the timing/requirements. Every pop-up API takes WebViewMode (EXTERNAL: external browser / INTERNAL: SDK built-in webview) as its first argument. For auto/manual/news pop-ups, using the Ex-version API lets you also receive the pop-up-close callback (OnViewPopupDestroyFinished) separately from the display-complete callback.
    • Auto pop-up: View_AutoPopup(mode, onFinished) (use View_AutoPopupEx if you need the close event)
    • Manual pop-up: View_ManualPopup(resourceKey, mode, onFinished) (specify the pop-up to show with resourceKey; use View_ManualPopupEx if you need the close event)
    • News pop-up: View_NewsPopup(mode, onFinished) (use View_NewsPopupEx if you need the close event)
    • Identity-verification pop-up: View_VerifyIdentificationPopup(compareIdentifier, mode, onFinished, onDestroy) (specify compareIdentifier; Korea only)
    • Coupon pop-up: see the Coupon (Itembox) page
  3. Event handling: receive the display-complete callback and the pop-up-close callback to branch game progress. If you need to resume the game flow after the pop-up closes, handle it in the Ex-version API's close callback.
  4. Additional control: if needed, use View_SetPopupDisallowed for the don't-show-again setting and View_CloseAllPopups to close all at once.
  5. External-browser integration (BaseSDK): to open ON STOVE pages (community/customer support, etc.) in an external browser while keeping the auth session, call Base_OpenExternalUrl of the BaseSDK module, not ViewSDK. Only STOVE-related domains are allowed, and SSO login is kept. It's an async API, so the result comes via a callback at Base_RunCallback() time.
  6. Cleanup: just before the game exits, clean up ViewSDK with View_UnInitialize(), then call Base_UnInitialize().

Troubleshooting

SituationCauseSolution
You launched an auto pop-up after game start but no window appearsYou called a pop-up API before View_Initialize completed. ViewSDK features can be used only after initializing ViewSDK with View_Initialize (for internal-mode pop-ups, View_InitializeWithWndInfo) following Base SDK initialization.After completing Base SDK initialization, finish ViewSDK initialization with View_Initialize (for internal-mode pop-ups, View_InitializeWithWndInfo, passing the game's main HWND), then call the pop-up API to avoid issues.
The pop-up result callback isn't called for a long timeIf you don't call Base_RunCallback() in the main loop, the SDK can't find a point to deliver results to the game. Callbacks are designed to run on the thread that called Base_RunCallback().Call Base_RunCallback() every frame or at a regular interval in the game main loop (render loop). Usually calling it once between input handling and rendering avoids issues.
The identity-verification pop-up fails with NOT_SUPPORTED_COUNTRY (31) in non-Korea buildsThe identity-verification pop-up is a Korea-service-only feature, so it always returns error 31 outside Korea. Calling it as-is in a global build shows a meaningless failure message to users.First check the nation value (ISO 3166-1 ALPHA-2, "KR" for Korea) of StovePCGds obtained via Base_GetGds, and skip the identity-verification pop-up call when it's not Korea. Adding a branch so only Korea builds enter the call flow avoids issues.
When I open a new pop-up, the previously open pop-up suddenly closesOn a new pop-up call, ViewSDK closes all existing windows open on the same channel. This is intended behavior to prevent two pop-ups from showing at once.Simultaneous display isn't supported, so the previous pop-up closing is normal. Just proceed with the new pop-up call without extra handling to avoid issues.
The pop-up is hidden behind the game window and can't be clickedIf you don't set the parent window handle at ViewSDK initialization, the pop-up appears as a separate window and can go behind the game window. In exclusive fullscreen mode, internal-mode pop-ups can't come above the game window due to Windows API limits.Initialize ViewSDK by passing the game's main HWND to View_InitializeWithWndInfo. For exclusive-fullscreen games, always set the pop-up's WebViewMode to external mode to avoid issues.
The external-browser API (Base_OpenExternalUrl) won't compile/link or isn't calledExternal-browser integration is a BaseSDK module API, not ViewSDK, so including only the ViewSDK header won't find the symbol.Include the BaseSDK header (BaseSDK.h) and call it after BaseSDK initialization completes. It's independent of ViewSDK initialization.
Login (SSO) drops on a page opened in the external browserFor external-browser integration, SSO login is kept only on STOVE-related domains. Navigating from the opened page to a page requiring a different SSO login can drop the session.Pass only STOVE-related web page (community/customer support, etc.) URLs, and avoid flows that navigate to external domains.

To resume the game flow after the pop-up closes, use the Ex-version API's close callback
View_AutoPopupEx, View_ManualPopupEx, and View_NewsPopupEx also receive the OnViewPopupDestroyFinished callback, called when the pop-up window closes, separately from the display-complete callback. If you need to resume the game flow at close time (e.g., entering the next screen), handle it in this close callback.

Sample Code

cpp
#include "ViewSDK.h"

using namespace Stove::PCSDK;
using namespace Stove::PCSDK::Base;
using namespace Stove::PCSDK::View;

// 1) Initialize ViewSDK (after Base_Initialize completes)
auto initResult = View_Initialize();
if (!initResult.IsSuccessful())
{
    // Implement the logic for initialization failure.
    return;
}

// 2) Auto pop-up (use Ex if you need the close event)
//    The first argument is WebViewMode (EXTERNAL: external browser / INTERNAL: SDK built-in webview)
View_AutoPopupEx(
    WebViewMode::EXTERNAL,
    [](CallbackResult openResult) {
        if (openResult.GetResult().IsSuccessful())
        {
            // Handle pop-up open
        }
    },
    [](CallbackResult destroyResult) {
        // Resume the game flow when the pop-up closes
    }
);

// 3) Manual pop-up (specify the pop-up to show with resourceKey)
View_ManualPopup(L"your_resource_key", WebViewMode::EXTERNAL, /* onFinished */ nullptr);

// 4) Identity-verification pop-up (Korea only)
//    compareIdentifier=true: SDI validation / false: deliver simKey
View_VerifyIdentificationPopup(
    true, WebViewMode::INTERNAL,
    [](CallbackResult result) {
        if (!result.GetResult().IsSuccessful())
        {
            // Logic for failures such as NOT_SUPPORTED_COUNTRY(31)
        }
    },
    [](CallbackResult result, const wchar_t* simKey) {
        // Handle pop-up close (simKey delivered when compareIdentifier=false)
    });

// 5) Open external browser (BaseSDK module API — not ViewSDK, BaseSDK.h)
//    Only STOVE-related domains allowed; SSO kept.
{
    std::wstring url = L"https://www.onstove.com";
    Base_OpenExternalUrl(url.c_str(), [](CallbackResult callbackResult) {
        if (callbackResult.GetResult().IsSuccessful())
        {
            // Handle external-browser integration success
        }
    });
}

// 6) Clean up on exit
View_UnInitialize();
// Then call Base_UnInitialize

Frequently Asked Questions



Q1. What's the difference between auto and manual pop-ups?
A. Auto pop-ups show in-game full-screen pop-ups in sequence without user touch on in-game entry.
Manual pop-ups are used to show a pop-up at a desired location (location 1–5) under a specific UI-touch or screen-entry condition.
Q2. Is the news pop-up shown even if there's no content to display?
A. Yes; even if there's no content, when the pop-up is shown, a "Coming soon" message appears.
Use it when you want to collect and show notice posts at once.
Q3. I called the community pop-up but it opens in a logged-out state.
A. Calling the community URL the ordinary way results in a logged-out call.
Using the community interface the SDK provides keeps the user logged in.
Also, the community must be pre-configured in Partners, and the key value set in Partners must be registered in VIEW > community_id of the SDK Config.
Q4. Can guest accounts use the open-external-browser (SSO integration) feature?
A. No, guest accounts can't use this feature. Also, accounts logged in with a certificate (signing key) other than STOVE's are prohibited from SSO external-browser calls,
so you must complete 'switch to STOVE account' before calling this feature.
Q5. What happens if I call a pop-up API before PC SDK View SDK initialization?
A. You must implement the View SDK initialization step first to use View SDK features.
Base SDK integration and initialization must happen before View SDK initialization, and if Base SDK initialization isn't complete, View SDK features can't be used.
Q6. On PC SDK, does calling a pop-up API close the previously open pop-up?
A. Yes; calling a pop-up API closes all previously open pop-up windows before opening the new one.
The open/close callbacks are each called once regardless of the number of windows.
Q7. On PC SDK, I want to receive an event when the pop-up window closes.
A. Using the Ex-version API, you can receive the OnViewPopupDestroyFinished event when the pop-up window closes.
This applies to View_AutoPopupEx, View_ManualPopupEx, and View_NewsPopupEx.
The Ex version is functionally identical to the existing API and only adds the pop-up-close event.
Q8. In which countries can the identity-verification pop-up be used?
A. The identity-verification pop-up is a PC-only feature that works only in Korea.
Calling it outside Korea returns the NOT_SUPPORTED_COUNTRY (31) error.



Need to contact us directly? stove.developers@smilegate.com