ข้ามไปที่เนื้อหา

เข้าสู่ระบบและออกจากระบบ

การเข้าสู่ระบบในการตรวจสอบสิทธิ์ประกอบด้วยขั้นตอนดังต่อไปนี้

Note
  • เวอร์ชันที่ต่ำกว่า SDK 4.7.0 ไม่รองรับ Helper กรุณาอ้างอิง [ต่อไปนี้] สำหรับวิธีการเข้าสู่ระบบที่มีอยู่
  • สำหรับคำอธิบายของ AuthV4.Helper กรุณาอ้างอิงที่หน้า การตรวจสอบสิทธิ์

เข้าสู่ระบบ

การเข้าสู่ระบบในการตรวจสอบสิทธิ์ประกอบด้วยขั้นตอนดังต่อไปนี้

  1. การเข้าสู่ระบบอัตโนมัติและการเข้าสู่ระบบโดยปริยาย
  2. การเข้าสู่ระบบที่ชัดเจน
  3. ตรวจสอบบัญชี IdP ที่เข้าสู่ระบบบนอุปกรณ์
  4. การเข้าสู่ระบบแขก

Authv4Helper เป็นคลาสที่ดำเนินการชุดกระบวนการที่เกี่ยวข้องกับการเข้าสู่ระบบและออกแบบมาเพื่อไปยังหน้าจอที่เหมาะสมตามค่าการตอบกลับ โปรดดูจุดต่อไปนี้เมื่อกำหนดค่าการเข้าสู่ระบบ.

Note

Apple ไม่รองรับ Apple Game Center และการซื้อในแอปใน iOS enterprise builds ดังนั้นการเข้าสู่ระบบโดยอัตโนมัติด้วยบัญชี Apple Game Center ไม่สามารถใช้ได้ใน iOS enterprise builds และการเข้าสู่ระบบโดยชัดแจ้งก็ไม่สามารถใช้ Apple Game Center ได้เช่นกัน เมื่อสร้างสำหรับ iOS enterprise ประเภทการเข้าสู่ระบบในคอนโซลต้องไม่รวม Apple Game Center

Note
  • หากเกมมีเป้าหมายหลักที่เด็กอายุต่ำกว่า 13 ปี บริการเกม Google Play จะไม่สามารถนำมาใช้ได้ และดังนั้นการเข้าสู่ระบบโดยอัตโนมัติใน Google builds จะไม่สามารถใช้งานได้ สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ Quality Checklist for Google Play Games Services.
  • การเข้าสู่ระบบโดยอัตโนมัติสำหรับ Google Play Games ควรพยายามทำในระหว่างการเข้าสู่ระบบครั้งแรกเท่านั้น สำหรับรายละเอียดเพิ่มเติม โปรดดูที่คู่มือของนักพัฒนา Google 1.5 Remember if players declined signing-in.
Note
  • ในประเทศจีน การเข้าสู่ระบบแบบปริยายไม่สามารถใช้ได้บน Android เพราะเกม Google Play ไม่มีให้บริการ
  • ในประเทศจีน ไม่สามารถใช้ Facebook ได้ ดังนั้น Facebook จึงไม่ได้รวมอยู่ในรายการ IdP
  • เนื่องจากผู้ใช้ที่มีการรับรองชื่อจริงเท่านั้นที่สามารถเติมเงินหรือใช้ทรัพยากรจากบริการในประเทศจีน (มีผลตั้งแต่วันที่ 1 พฤษภาคม 2017) การเข้าสู่ระบบแบบผู้เยี่ยมชมจึงไม่ได้รวมอยู่ในรายการ IdP สำหรับการเข้าสู่ระบบจาก IP ของจีน
Note

iOS ไม่แสดงหน้าจอเข้าสู่ระบบแม้ว่า การเข้าสู่ระบบ Apple Game Center จะถูกยกเลิก ดังนั้น ข้อความแนะนำสามารถแสดงโดยตรงโดย SDK ที่เรียกใช้เมธอด showGameCenterLoginCancelDialog() ของคลาส AuthV4Helper หรือเลือกที่จะให้เกมแสดง หากคุณต้องการให้ข้อความสำหรับผู้ใช้ในการเชื่อมโยงบัญชี Game Center ใหม่อีกครั้ง ให้ใช้ ข้อความแนะนำการยกเลิก Game Center เมื่อผลลัพธ์ของการเรียกกลับ AuthV4.signIn(AuthV4.ProviderType.APPLE, ...) และ AuthV4.connect(AuthV4.ProviderType.APPLE, ...) เป็น Cancel.

Note

หากผู้ใช้พยายามเข้าสู่ระบบด้วย Apple ในขณะที่อุปกรณ์ของพวกเขายังไม่ได้เข้าสู่ระบบด้วย Apple ID จะเกิดข้อผิดพลาด AuthV4SignInAppleUnknown ในระหว่างกระบวนการเรียกใช้เมธอด connect(), signIn() ของคลาส AuthV4Helper ที่นี่ ป๊อปอัพคำแนะนำการเข้าสู่ระบบด้วย Apple ID จะถูกแสดงโดยอัตโนมัติ ดังนั้นสตูดิโอเกมจึงไม่จำเป็นต้องแสดงป๊อปอัพคำแนะนำแยกต่างหาก

หากผู้ใช้พยายามเข้าสู่ระบบด้วย Apple ในขณะที่อุปกรณ์ของพวกเขายังไม่ได้เข้าสู่ระบบด้วย Apple ID จะเกิดข้อผิดพลาด AuthV4SignInAppleUnknown ในระหว่างกระบวนการเรียกใช้เมธอด connect(), signIn() ของคลาส AuthV4Helper methods ข้อความแนะนำการเข้าสู่ระบบด้วย Apple ID จะถูกแสดงขึ้นโดยอัตโนมัติ ดังนั้นสตูดิโอเกมจึงไม่จำเป็นต้องแสดง popup แยกต่างหากสำหรับการแนะนำ

Note

สำหรับการเข้าสู่ระบบ PC X IdP สามารถเข้าสู่ระบบด้วยบัญชี X ได้ แต่ไม่รองรับการเข้าสู่ระบบผ่านการรวมบัญชี Google และ Apple บนหน้าจอเข้าสู่ระบบ X ในการเข้าสู่ระบบ X ด้วยการรวมบัญชี Google หรือ Apple คุณต้องเข้าสู่ระบบด้วยบัญชีที่เกี่ยวข้องในเบราว์เซอร์ภายนอกก่อน แล้วจึงดำเนินการเข้าสู่ระบบ X ในเกม
สำหรับการเข้าสู่ระบบ Steam Deck X IdP รองรับเฉพาะการเข้าสู่ระบบด้วยบัญชี X เท่านั้น

การเข้าสู่ระบบอัตโนมัติและการเข้าสู่ระบบโดยปริยาย

การเข้าสู่ระบบอัตโนมัติ

หมายความว่าผู้ใช้เข้าสู่ระบบโดยอัตโนมัติด้วยการเชื่อมโยงบัญชี Apple Game Center ของตนบน iOS และบัญชี Google Play Games ของตนบน Android โดยไม่ต้องเลือกวิธีการเข้าสู่ระบบ มันจะดำเนินการเข้าสู่ระบบอัตโนมัติและทำการเข้าสู่ระบบโดยปริยายในกรณีที่การเข้าสู่ระบบอัตโนมัติล้มเหลว

ในการใช้การเข้าสู่ระบบอัตโนมัติในสภาพแวดล้อม iOS คุณต้องเพิ่ม Game Center Entitlement และหากคุณตรวจสอบ 'Apple GameCenter' Dependency ใน Unity มันจะเพิ่ม Entitlement ที่เกี่ยวข้องโดยอัตโนมัติผ่าน Unity PostProcess ใน iOS Native Xcode จะเพิ่ม Game Center Entitlement โดยอัตโนมัติ

โหมดออฟไลน์

ใน Hive SDK v4 23.1.0 ขึ้นไป ฟีเจอร์การเข้าสู่ระบบอัตโนมัติ (AuthV4.signIn โดยใช้ ProviderType.AUTO หรือ AuthV4.Helper.signIn) สามารถให้บริการได้แม้ว่าผู้ใช้จะไม่ได้เชื่อมต่อกับเครือข่ายเมื่อเปิดแอปพลิเคชัน สำหรับการใช้งานโหมดออฟไลน์ กรุณาปฏิบัติตามคำแนะนำด้านล่าง

  1. คุณต้องได้ดำเนินการแอปออนไลน์สำเร็จสำหรับการเข้าสู่ระบบที่ชัดเจน, โดยนัย, แขก, หรือที่กำหนดเอง และได้รับ playerId และ playerToken

จากมุมมองของนักพัฒนาแอป จำเป็นต้องมีการเรียกใช้ AuthV4.Helper.signIn, AuthV4.showSignIn, หรือ AuthV4.signInWithAuthKey อย่างน้อยหนึ่งครั้งในขณะที่ออนไลน์เพื่อรับ playerId และ playerToken เป็นการตอบกลับ จากมุมมองของผู้ใช้ ผู้ใช้ต้องเข้าสู่ระบบแอปอย่างน้อยหนึ่งครั้งในขณะที่อุปกรณ์ของพวกเขาเชื่อมต่อกับเครือข่าย อย่างไรก็ตาม หากบัญชีของผู้ใช้ถูกระงับหรือจำกัดในขณะที่พวกเขาพยายามเข้าสู่ระบบครั้งล่าสุดในขณะที่ออนไลน์ ผู้ใช้จะไม่สามารถเข้าสู่ระบบได้แม้ในโหมดออฟไลน์

  1. เปิดโหมดออฟไลน์ในคอนโซล Hive App Center > Project Management > Game Details > Hive Product Settings.

การเข้าสู่ระบบอัตโนมัติในสภาพแวดล้อม Windows

สภาพแวดล้อมของ Windows ยังรองรับการเข้าสู่ระบบอัตโนมัติ ซึ่งสามารถเปิด/ปิดได้ใน Hive console app center อย่างไรก็ตาม การเข้าสู่ระบบอัตโนมัติใน Windows ทำงานแตกต่างจากบนมือถือ ความแตกต่างในการเข้าสู่ระบบอัตโนมัติใน Windows มีดังนี้

  • บนมือถือ สถานะการเข้าสู่ระบบจะถูกเก็บรักษาโดยอัตโนมัติหลังจากที่เข้าสู่ระบบ แต่บน Windows จะถูกเก็บรักษาเฉพาะเมื่อผู้ใช้เปิดใช้งานช่องทำเครื่องหมาย "จำฉันไว้ในระบบ" (แสดงที่ด้านล่างของรายการ IdP บน UI การเข้าสู่ระบบ) ในสถานการณ์อื่นๆ สถานะการเข้าสู่ระบบจะไม่ถูกเก็บรักษา
  • เมื่อเรียกใช้ AuthV4Helper.Connect บนมือถือ หากเปลี่ยนไปยังบัญชีใหม่ บัญชีใหม่จะเก็บสถานะการเข้าสู่ระบบโดยอัตโนมัติ แต่บน Windows เมื่อเปลี่ยนไปยังบัญชีใหม่ บัญชีใหม่จะไม่เก็บสถานะการเข้าสู่ระบบโดยอัตโนมัติ

การเข้าสู่ระบบโดยปริยาย

  • กระบวนการเข้าสู่ระบบโดยอัตโนมัติ

AuthV4.Helper.signIn จะพยายามเข้าสู่ระบบโดยอัตโนมัติด้วยการใช้คีย์โทเค็นการตรวจสอบสิทธิ์ของ PlayerID หากไม่มีคีย์โทเค็นการตรวจสอบสิทธิ์ที่เข้าสู่ระบบก่อนหน้านี้ มันจะเข้าสู่ระบบอัตโนมัติไปยัง Apple Game Center สำหรับ iOS และ Google Play Games สำหรับ Android หากการเข้าสู่ระบบล้มเหลว มันจะกำหนดค่าหน้าจอการเข้าสู่ระบบที่เหมาะสมตามค่าการตอบกลับ

Note

เพื่อใช้การเข้าสู่ระบบอัตโนมัติ คุณต้องเพิ่ม Game Center Entitlement หากคุณได้ตรวจสอบ 'Apple GameCenter' Dependency แล้ว Entitlement ที่เกี่ยวข้องจะถูกเพิ่มโดยอัตโนมัติผ่าน Unity PostProcess.

Note

เมื่อใช้คลาส AuthV4Helper

หากผู้ใช้ที่กำลังเล่นเกมปฏิเสธความพยายามในการเข้าสู่ระบบโดยปริยายระหว่าง PGS ระบบจะจดจำสิ่งนี้และจะไม่พยายามเข้าสู่ระบบโดยปริยายอีกต่อไป แม้ว่าการเข้าสู่ระบบอัตโนมัติจะเป็นไปได้ในขณะที่เซสชันของผู้เล่นยังคงอยู่ ระบบจะยังคงจดจำสถานะของการเข้าสู่ระบบโดยปริยายที่ถูกปฏิเสธเนื้อหานี้อิงจากคู่มือบริการเกม Google Play

ต่อไปนี้คือตัวอย่างโค้ดที่ทำการเข้าสู่ระบบโดยอัตโนมัติ

API Reference: hive.AuthV4.Helper.signIn

// Attempt to log in (signIn) with Hive SDK
AuthV4.Helper.signIn (delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {

    if (result.isSuccess()) {
        // Login successful
    } else if (result.needExit()) {
        // TODO: Implement app exit functionality
        // e.g.) Application.Quit();
    } else {
        switch (result.code) {
            case ResultAPI.Code.AuthV4ConflictPlayer:
                // Account conflict
                break;
            case ResultAPI.Code.AuthV4HelperImplifiedLoginFail:
                // Failed implicit login
                // ex) AuthV4.showSignIn(...);
                break;
            default:
                // Other exceptions
                break;
        }
    }
});
#include "HiveAuthV4.h"

// พยายามเข้าสู่ระบบ (signIn) กับ Hive SDK
FHiveAuthV4::Helper::SignIn(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
    if (Result.IsSuccess()) {
        // เข้าสู่ระบบสำเร็จ
    } else if (Result.NeedExit()) {
        // TODO: Implement app exit functionality
        // e.g.) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
    } else {
        switch (Result.Code) {
            case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
                // ขัดแย้งบัญชี
                break;
            case FHiveResultAPI::ECode::AuthV4HelperImplifiedLoginFail:
                // ล้มเหลวในการเข้าสู่ระบบโดยอัตโนมัติ
                // ex) FHiveAuthV4::ShowSigIn()
                break;
            default:
                // ข้อยกเว้นอื่น ๆ
                break;
        }
    }
}));

API Reference: Auth4::Helper::signIn

// Attempt to sign in (signIn) with Hive SDK
AuthV4::Helper::signIn([=](ResultAPI const & result, std::shared_ptr playerInfo) {

    if (result.isSuccess()) {
        // Login successful
    } else if (result.needExit()) {
        // TODO: Implement app exit functionality
        // Cocos2d-x engine users
        // e.g. exit(0);
        // Unreal engine users
        // e.g. UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
    } else {
        switch (result.code) {
            case ResultAPI::AuthV4ConflictPlayer:
                // Account conflict
                break;
            case ResultAPI::AuthV4HelperImplifiedLoginFail:
                // Failed implicit login
                // ex) AuthV4.showSignIn(...);
                break;
            default:
                break;
        }
    }
});

API Reference: hive.AuthV4.Helper.signIn

// พยายามเข้าสู่ระบบ (signIn) ด้วย Hive SDK
AuthV4.Helper.signIn(object : AuthV4.Helper.AuthV4HelperListener {
    override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
        if (result.isSuccess) {
            // เข้าสู่ระบบสำเร็จ
        } else if (result.needExit()) {
            // TODO: Implement app exit functionality
            // e.g.) exitProcess(0)
        } else {
            when (result.code) {
                ResultAPI.Code.AuthV4ConflictPlayer -> {
                    // ข้อขัดแย้งของบัญชี
                }
                ResultAPI.Code.AuthV4HelperImplifiedLoginFail -> {
                    // ล้มเหลวในการเข้าสู่ระบบโดยอัตโนมัติ
                    // ex) AuthV4.showSignIn(...)
                }
                else -> {
                    // สถานการณ์ข้อยกเว้นอื่น ๆ
                }
            }
        }
    }
})

API Reference: com.hive.AuthV4.Helper.signIn

// Hive SDK AuthV4 authentication UI request
AuthV4.Helper.signIn(new AuthV4.Helper.AuthV4HelperListener() {
    @Override
    public void onAuthV4Helper(ResultAPI result, PlayerInfo playerInfo) {

        if (result.isSuccess()) {
            // การตรวจสอบสิทธิ์สำเร็จ
        } else if (result.needExit()) {
            // TODO: Implement app exit functionality
            // e.g.) System.exit(0);
        } else {
            switch (result.code) {
                case ResultAPI.Code.AuthV4ConflictPlayer:
                    // ข้อขัดแย้งบัญชี
                    break;
                case ResultAPI.Code.AuthV4HelperImplifiedLoginFail:
                    // ล้มเหลวในการเข้าสู่ระบบโดยนัย
                    // ex) AuthV4.showSignIn(...);
                    break;
                default:
                    // ข้อยกเว้นอื่น ๆ
                    break;    
            }
        }
    }
});

API Reference: HIVEAuthV4Helper:signIn

// Hive SDK AuthV4 authentication UI request
AuthV4Interface.helper().signIn { (result, playerInfo) in

    if result.isSuccess() {
        // การตรวจสอบสิทธิ์สำเร็จ
    } else if result.needExit() {
        // TODO: Implement app exit functionality
        // e.g.) exit(0)
    } else {
        switch result.getCode() {
            case .authV4ConflictPlayer:
                // ข้อขัดแย้งบัญชี
                break
            case .authV4HelperImplifiedLoginFail:
                // ล้มเหลวในการเข้าสู่ระบบโดยอัตโนมัติ
                // ex) AuthV4.showSignIn(...)
                break
            default:
                // ข้อยกเว้นอื่น ๆ
                break
            }
        }
    }
}

API Reference: HIVEAuthV4:signIn

// Attempt to sign in (signIn) to Hive SDK    
[[HIVEAuthV4 helper] signIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {

    if (result.isSuccess) {
        // การเข้าสู่ระบบสำเร็จ 
    }
    else if (result.needExit) {
        // TODO: Implement app exit functionality
        // ex) exit(0);
    }
    else {
        switch (result.code) {
            case kAuthV4ConflictPlayer:
                // ข้อขัดแย้งบัญชี
                break;    
            case kAuthV4HelperImplifiedLoginFail:
                // การเข้าสู่ระบบโดยนัยล้มเหลว
                // ex) [HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
                // // ทำอะไรบางอย่าง...
                // }];
                break;
            default:
                // ข้อยกเว้นอื่น ๆ
                break;   
        }
    }
}];

พฤติกรรมการเข้าสู่ระบบโดยอัตโนมัติ: มือถือ

การเข้าสู่ระบบโดยอัตโนมัติบนมือถือ (Hive SDK Unity Android, แพลตฟอร์ม Android/iOS เป็นต้น) (AuthV4.Helper.signIn) จะมีการแสดงกล่องโต้ตอบเพื่อถามผู้ใช้ว่าต้องการเข้าสู่ระบบด้วยบัญชีที่เข้าสู่ระบบล่าสุดในกรณีที่มีความขัดแย้งของบัญชีเมื่อเข้าสู่ระบบด้วยบัญชีที่แตกต่างหลังจากการเข้าสู่ระบบครั้งแรก

พฤติกรรมการเข้าสู่ระบบโดยปริยาย: PC

การเข้าสู่ระบบโดยอัตโนมัติบน PC (เช่น Hive SDK Unity สำหรับ Windows และแพลตฟอร์ม Windows อื่น ๆ) (AuthV4.Helper.signIn) จะเข้าสู่ระบบโดยอัตโนมัติกับบัญชีที่เข้าสู่ระบบล่าสุดเมื่อเข้าสู่ระบบด้วยบัญชีที่แตกต่างหลังจากการเข้าสู่ระบบครั้งแรก ไม่มีการชนกันของบัญชีเกิดขึ้น

การเข้าสู่ระบบที่ชัดเจน

การเข้าสู่ระบบแบบชัดเจนหมายถึงกระบวนการที่ผู้ใช้เลือก IdP เพื่อทำการตรวจสอบสิทธิ์ หากการเข้าสู่ระบบอัตโนมัติและการเข้าสู่ระบบแบบปริยายล้มเหลว ให้ดำเนินการให้การเข้าสู่ระบบแบบชัดเจนเกิดขึ้นเมื่อผู้ใช้คลิกที่ชื่อเรื่องหลังจากย้ายไปยังหน้าจอชื่อเกม

UI การเข้าสู่ระบบที่ชัดเจนสามารถใช้ UI ที่จัดเตรียมโดย Hive SDK หรือปรับแต่งได้โดยใช้รายการ IdP ที่ส่งคืนเป็นผลหลังจากการเริ่มต้น Hive SDK เสร็จสิ้น หากคุณกำลังปรับแต่ง UI โปรดดูที่ส่วน การปรับแต่งการเข้าสู่ระบบที่ชัดเจน

รายการ IdP ถูกควบคุมและจัดเตรียมโดยแพลตฟอร์ม Hive ตามนโยบายของแต่ละประเทศ ตัวอย่างเช่น ในประเทศจีน เกม Google Play และ Facebook ไม่สามารถใช้งานได้สำหรับแขก

สกรีนช็อตการเข้าสู่ระบบที่ชัดเจน

UI การเลือก IdP ที่จัดเตรียมโดย SDK

เมื่อทำการติดตั้งโดยใช้ UI ที่จัดเตรียมโดย SDK

ในการดำเนินการเข้าสู่ระบบแบบชัดเจนโดยใช้ UI ที่จัดเตรียมโดย SDK คุณสามารถเรียกใช้ showSignIn() เมธอดเพื่อเรียก UI รายการ IdP ได้เลย

Note

หากผู้ใช้ปิด UI การเลือก IdP ที่จัดเตรียมโดย SDK โดยการกดปุ่ม 'X' จะต้องมีวิธีการเข้าสู่ระบบอีกครั้ง ผู้ใช้ยังไม่ได้เข้าสู่ระบบ

Note

เพื่อปรับแต่งการลงชื่อเข้าใช้ที่ชัดเจน โปรดดูที่ ต่อไปนี้.

API Reference: hive.AuthV4.showSignIn

// Hive SDK AuthV4 authentication UI request
AuthV4.showSignIn((ResultAPI result, AuthV4.PlayerInfo playerInfo)=>{
    if (result.isSuccess()) {
        // Authentication successful
        // playerInfo : authenticated user information

        // ตัวอย่างการดึงข้อมูลอีเมล
        foreach (KeyValuePair<AuthV4.ProviderType, AuthV4.ProviderInfo> entry in playerInfo.providerInfoData) {

            AuthV4.ProviderInfo providerInfo = entry.Value;
            if(providerInfo.providerEmail != null && providerInfo.providerEmail != "") {
                string email = providerInfo.providerEmail;
                break;
            }
        }
    }
    else if (result.needExit()) {
        // TODO: Implement app exit functionality
        // e.g.) Application.Quit();
    }
});
#include "HiveAuthV4.h"

// การร้องขอ UI การตรวจสอบสิทธิ์ Hive SDK AuthV4
FHiveAuthV4::ShowSignIn(FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
    if (Result.IsSuccess()) {
        // การตรวจสอบสิทธิ์สำเร็จ (PlayerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์) 

        // ตัวอย่างการดึงข้อมูลอีเมล
        for (const auto& ProviderInfoEntry : PlayerInfo.ProviderInfoData) {
            FHiveProviderInfo ProviderInfo = ProviderInfoEntry.Value;
            FString Email = ProviderInfo.ProviderEmail;
        }
    } else if (Result.NeedExit()) {
        // TODO: Implement app exit functionality
        // ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
    }
}));

API Reference: AuthV4::showSignIn

// Hive SDK AuthV4 authentication UI request
AuthV4::showSignIn([=](ResultAPI const & result, PlayerInfo const & playerInfo) {
    if (result.isSuccess()) {
        // Authentication successful
        // playerInfo: Authenticated user information

        // ตัวอย่างการดึงข้อมูลอีเมล
        for(auto it = playerInfo.providerInfoData.begin(); it != playerInfo.providerInfoData.end(); ++it) {
            hive::ProviderInfo providerInfo = it->second;
            if(!providerInfo.providerEmail.empty()) {
                std::string email = providerInfo.providerEmail;
                break;
            }
        }
    }
    else if (result.needExit()) {
        // TODO: Implement app exit functionality
        // สำหรับผู้ใช้เอนจิน Cocos2d-x
        // ตัวอย่าง) exit(0);
        // สำหรับผู้ใช้เอนจิน Unreal
        // ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
    }
});

API Reference: com.hive.AuthV4.showSignIn

// Hive SDK AuthV4 authentication UI request
AuthV4.showSignIn(object : AuthV4.AuthV4SignInListener {
    override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
        if (result.isSuccess) {
            // Authentication successful
            // playerInfo: Authenticated user information

            // ตัวอย่างการดึงข้อมูลอีเมล
            playerInfo?.let {
                for ((key, value) in it.providerInfoData) {
                    var providerInfo: AuthV4.ProviderInfo = value
                    if(providerInfo.providerEmail.isNotEmpty()) {
                        val email = providerInfo.providerEmail
                        break
                    }
                }
            }
        } else if (result.needExit()) {
            // TODO: Implement app exit functionality
            // e.g.) exitProcess(0)
        }
    }
})

API Reference: com.hive.AuthV4.showSignIn

// Hive SDK AuthV4 authentication UI request
AuthV4.showSignIn(new AuthV4.AuthV4SignInListener() {
    @Override
    public void onAuthV4SignIn(ResultAPI result, AuthV4.PlayerInfo playerInfo) {

        if (result.isSuccess()) {
            // การตรวจสอบสิทธิ์สำเร็จ
            // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์

            // ตัวอย่างการดึงข้อมูลอีเมล
            if(playerInfo != null) {
                for (Map.Entry<AuthV4.ProviderType, AuthV4.ProviderInfo> entry : playerInfo.getProviderInfoData().entrySet()) {
                    AuthV4.ProviderInfo providerInfo = entry.getValue();
                    if (providerInfo.getProviderEmail() != "") {
                        String email = providerInfo.getProviderEmail();
                        break;
                    }
                }
            }
        }
        else if (result.needExit()) {
            // TODO: Implement app exit functionality
            // e.g.) System.exit(0);
        }
    }
});

เอกสารอ้างอิง API: HIVEAuthV4:showSignIn

var email = String()

// Hive SDK AuthV4 authentication UI request
AuthV4Interface.showSignIn { (result, playerInfo) in

    if result.isSuccess() {
        // การตรวจสอบสิทธิ์สำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์

        // ตัวอย่างการดึงข้อมูลอีเมล
        if let playerInfo = playerInfo {
            // ค้นหาข้อมูล providerInfo โดยใช้ providerEmail ที่มีอยู่ (ผู้ให้บริการที่เข้าสู่ระบบในปัจจุบัน)
            for key in playerInfo.providerInfoData.keys {
                if let providerInfo = playerInfo.providerInfoData[key],
                    providerInfo.providerEmail.count > 0 {
                    // providerEmail != ""
                    email = providerInfo.providerEmail
                    break
                }
            }
        }
    } else if result.needExit() {
        // TODO: Implement app exit functionality
        // e.g.) exit(0)
    }
}

API Reference: HIVEAuthV4:showSignIn

__block NSString* email = @"";

// Hive SDK AuthV4 การขอ UI การตรวจสอบสิทธิ์
[HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {

    if([result isSuccess]){
        // การตรวจสอบสิทธิ์สำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์

        // ตัวอย่างการดึงข้อมูลอีเมล
        if(playerInfo != nil) {
            // กำลังค้นหาข้อมูล providerInfo ด้วย providerEmail (ผู้ให้บริการที่เข้าสู่ระบบอยู่ในขณะนี้)
            for (NSString* key in playerInfo.providerInfoData.allKeys) {
                HIVEProviderInfo* providerInfo = playerInfo.providerInfoData[key];
                if (providerInfo != nil && providerInfo.providerEmail.length > 0) {
                    // providerEmail != ""
                    email = providerInfo.providerEmail;
                    break;
                }
            }
        }
    } else if ([result needExit]) {
        // TODO: Implement app exit functionality
        // e.g. exit(0);
    }
}];

การปรับแต่งการเข้าสู่ระบบแบบชัดเจน

UI ที่ปรับแต่งได้สำหรับการเข้าสู่ระบบที่ชัดเจนสามารถนำไปใช้ได้โดยใช้ providerTypeList โดย providerTypeList เป็นตัวจัดการการตอบกลับที่ส่งกลับเมื่อเรียกใช้วิธี AuthV4.setup() เพื่อเริ่มต้น SDK Hive หรือเมื่อเรียกใช้วิธี AuthV4.Helper.getIDPList() หลังจากการเริ่มต้น ฟีเจอร์นี้ใช้เมื่อคุณต้องการแสดงหน้าจอเข้าสู่ระบบตาม UI ของเกมหรือเปิดเผยการรวมกับ IdP เฉพาะ หลังจากนำ UI ที่ปรับแต่งได้ไปใช้แล้ว ให้ทำการเข้าสู่ระบบโดยเรียกใช้วิธี signIn() พร้อมกับ ProviderType ที่ต้องการตามการกระทำของผู้ใช้

Note
  • ภาพหน้าจอตัวอย่าง UI ที่แสดงเฉพาะปุ่มการรวม Facebook บนหน้าจอเข้าสู่ระบบ

ต่อไปนี้คือตัวอย่างโค้ดต้นทางที่สมมติสถานการณ์ที่ผู้ใช้เลือกการเข้าสู่ระบบ Google ใน UI การเข้าสู่ระบบที่กำหนดเอง

API Reference: hive.AuthV4.signIn

using hive;

AuthV4.signIn(AuthV4.ProviderType.GOOGLE, (ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
    if (result.isSuccess()) {
        // Call succeeded
        // playerInfo : authenticated user information.
        // Example of retrieving email information for ProviderType.GOOGLE
        Dictionary<AuthV4.ProviderType, AuthV4.ProviderInfo> providerInfoData = playerInfo.providerInfoData;
        AuthV4.ProviderInfo providerInfo = providerInfoData[AuthV4.ProviderType.GOOGLE];
        string email = providerInfo.providerEmail;
    }
});
#include "HiveAuthV4.h"

FHiveAuthV4::SignIn(EHiveProviderType::GOOGLE,
                    FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {

    if (Result.IsSuccess()) {
        // การเรียกสำเร็จ (PlayerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบแล้ว) 

        // ตัวอย่างการดึงข้อมูลอีเมลสำหรับ EHiveProviderType::GOOGLE
        TMap<EHiveProviderType, FHiveProviderInfo> ProviderInfoData = PlayerInfo.ProviderInfoData;
        if (const FHiveProviderInfo* ProviderInfo = ProviderInfoData.Find(EHiveProviderType::GOOGLE)) {
                FString Email = ProviderInfo->ProviderEmail;
        }
    }
}));

API Reference: Auth4::signIn

#include <HIVE_SDK_Plugin/HIVE_CPP.h>

AuthV4::signIn(ProviderType::GOOGLE, [=](ResultAPI const & result, PlayerInfo const & playerInfo) {
    if (result.isSuccess()) {
        // การเรียกสำเร็จ
        // playerInfo : ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์.

        // ตัวอย่างการดึงข้อมูลอีเมลสำหรับ ProviderType::GOOGLE
        map<ProviderType, ProviderInfo> providerInfoData = playerInfo.providerInfoData;
        ProviderInfo providerInfo = providerInfoData[ProviderType::GOOGLE];
        string email = providerInfo.providerEmail;
    }
});

API Reference: AuthV4.signIn

import com.hive.AuthV4
import com.hive.ResultAPI

AuthV4.signIn(AuthV4.ProviderType.GOOGLE, object : AuthV4.AuthV4SignInListener {
    override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
        if (result.isSuccess) {
            // การเรียกใช้สำเร็จ
            // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
            // ตัวอย่างการดึงข้อมูลอีเมลสำหรับ ProviderType.GOOGLE
            if (playerInfo != null) {
                val providerInfoData = playerInfo.providerInfoData
                val providerInfo = providerInfoData[AuthV4.ProviderType.GOOGLE]
                if (providerInfo != null) {
                    val email = providerInfo.providerEmail
                }
            }
        }
    }
})

API Reference: com.hive.Auth4.signIn

import com.hive.AuthV4;
import com.hive.ResultAPI;

AuthV4.signIn(AuthV4.ProviderType.GOOGLE, (result, playerInfo) -> {
    if (result.isSuccess()) {
        // การเรียกใช้สำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
        // ตัวอย่างการดึงข้อมูลอีเมลสำหรับ ProviderType.GOOGLE
        if (playerInfo != null) {
            HashMap<AuthV4.ProviderType, AuthV4.ProviderInfo> providerInfoData = playerInfo.getProviderInfoData();
            AuthV4.ProviderInfo providerInfo = providerInfoData.get(AuthV4.ProviderType.GOOGLE);
            if (providerInfo != null) {
                String email = providerInfo.getProviderEmail();
            }
        }
    }
});

API Reference: AuthV4Interface.signIn

import HIVEService

AuthV4Interface.signIn(.Google) { result, playerInfo in    
    if result.isSuccess() {
        // การเรียกสำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์.

        // ตัวอย่างการดึงข้อมูลอีเมลของ Google
        if 
            let playerInfo = playerInfo,  
            let providerInfo = playerInfo.providerInfoData["GOOGLE"] {
                let email = providerInfo.providerEmail
        }
    }
}

API Reference: HIVEAuth4:signIn

#import <HIVEService/HIVEService-Swift.h>

[HIVEAuthV4 signIn:HIVEProviderTypeGoogle handler:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
    if ([result isSuccess]){
        // การเรียกสำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบแล้ว.

        // ตัวอย่างการดึงข้อมูลอีเมลสำหรับ HIVEProviderTypeGoogle
        if(playerInfo != nil) {
            HIVEProviderInfo *providerInfo = playerInfo.providerInfoData[@"GOOGLE"];
            if(providerInfo != nil){
                NSString *email = providerInfo.providerEmail;
            }
        }
    }
}];

ตรวจสอบบัญชี IdP ที่เข้าสู่ระบบบนอุปกรณ์

การเข้าสู่ระบบอัตโนมัติใช้เฉพาะกุญแจโทเค็นการตรวจสอบสิทธิ์ของ PlayerID ที่บันทึกไว้เพื่อเข้าสู่ระบบ ในขณะที่การเข้าสู่ระบบแบบชัดเจนจะเข้าสู่ระบบบัญชีที่เชื่อมโยงกับ IdP หลายรายการ ในทั้งสองกรณี บัญชี IdP ของ PlayerID ที่เข้าสู่ระบบอาจแตกต่างจากบัญชี IdP ที่เข้าสู่ระบบในอุปกรณ์จริง (DevicePlayer) เราให้คำแนะนำในการรวมบัญชีทั้งสองเพื่อเตรียมความพร้อมสำหรับความสำเร็จในอนาคตหรือการใช้งานกระดานผู้นำ

  • ตรวจสอบ UI สำหรับการใช้ DevicePlayer ที่จัดเตรียมโดย SDK

ต่อไปนี้คือตัวอย่างโค้ดเพื่อตรวจสอบข้อมูล IdP

API Reference: AuthV4.Helper.syncAccount

using hive;

AuthV4.ProviderType providerType = AuthV4.ProviderType.GOOGLE;
AuthV4.Helper.syncAccount (providerType, delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {

    switch (result.code) {
        case ResultAPI.Code.Success:
            // ปกติ
            break;   
        case ResultAPI.Code.AuthV4ConflictPlayer:
            // ข้อขัดแย้งบัญชี
            // ex) เมื่อใช้ Hive UI
            // AuthV4.Helper.showConflict(...);
            // หรือ
            // ex) เมื่อทำการใช้งาน GameUI
            // AuthV4.Helper.resolverConflict(...);// เมื่อเลือกผู้ใช้ปัจจุบัน
            // AuthV4.Helper.switchAccount(...);// เมื่อเลือกสลับผู้ใช้ 
            break;
        default:  
            // ข้อยกเว้นอื่น ๆ
            break;
    }
});
#include "HiveAuthV4.h"

FHiveAuthV4::Helper::SyncAccount(ProviderType, 
                                 FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, 
                                                                                const TOptional<FHivePlayerInfo>& PlayerInfo) {

    switch (Result.Code) {
        case FHiveResultAPI::ECode::Success:
            // การตอบสนองปกติ
            break;
        case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
            // ความขัดแย้งของบัญชี
            // ex) เมื่อใช้ Hive UI
            // FHiveAuthV4::Helper::ShowConflict()
            // ex) เมื่อดำเนินการ Game UI
            // FHiveAuthV4::Helper::ResolveConflict() // การเลือกผู้ใช้ปัจจุบัน
            // FHiveAuthV4::Helper::SwitchAccount() // การเลือกเปลี่ยนผู้ใช้
            break;
        default:
            // สถานการณ์พิเศษอื่น ๆ
            break;
    }
}));

API Reference: AuthV4::Helper::syncAccount

#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;

ProviderType providerType = ProviderType::GOOGLE;
AuthV4::Helper::syncAccount(providerType, [=](ResultAPI const & result, shared_ptr<PlayerInfo> playerInfo) {

    switch (result.code) {
        case ResultAPI::Success:
            // ปกติ
            break;   
        case ResultAPI::AuthV4ConflictPlayer:
            // ข้อขัดแย้งของบัญชี
            // ex) เมื่อใช้ Hive UI
            // AuthV4::Helper::showConflict(...);
            // หรือ
            // ex) เมื่อดำเนินการ GameUI
            // AuthV4::Helper::resolverConflict(...);// เมื่อเลือกผู้ใช้ปัจจุบัน
            // AuthV4::Helper::switchAccount(...);// เมื่อเลือกที่จะเปลี่ยนผู้ใช้ 
            break;
        default:  
            // ข้อยกเว้นอื่น ๆ
            break;
    }
});

API Reference: AuthV4.Helper.syncAccount

import com.hive.AuthV4
import com.hive.ResultAPI

val providerType = AuthV4.ProviderType.GOOGLE
AuthV4.Helper.syncAccount(providerType, object : AuthV4.Helper.AuthV4HelperListener {
    override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {    
        when (result.code) {
            ResultAPI.Code.Success -> {
                // สำเร็จ
            }
            ResultAPI.Code.AuthV4ConflictPlayer -> {
                // ข้อขัดแย้งของบัญชี
                // ex) เมื่อใช้ Hive UI
                // AuthV4.Helper.showConflict(...);
                // หรือ
                // ex) เมื่อทำการใช้งาน GameUI
                // AuthV4.Helper.resolverConflict(...);// เมื่อเลือกผู้ใช้ปัจจุบัน
                // AuthV4.Helper.switchAccount(...);// เมื่อเลือกเปลี่ยนผู้ใช้ 
            }
            else -> {
                // ข้อยกเว้นอื่น ๆ
            }
        }
    }
})

API Reference: AuthV4.Helper.syncAccount

import com.hive.AuthV4;
import com.hive.ResultAPI;

AuthV4.ProviderType providerType = AuthV4.ProviderType.GOOGLE;
AuthV4.Helper.syncAccount(providerType, (result, playerInfo) -> {
    switch (result.getCode()) {
        case Success:
            // ปกติ  
        case AuthV4ConflictPlayer:    
            break;   
            // ข้อขัดแย้งของบัญชี
            // ex) เมื่อใช้ Hive UI
            // AuthV4.Helper.showConflict(...);
            // หรือ
            // ex) เมื่อดำเนินการ GameUI
            // AuthV4.Helper.resolverConflict(...);// เมื่อเลือกผู้ใช้ปัจจุบัน
            // AuthV4.Helper.switchAccount(...);// เมื่อเลือกการสลับผู้ใช้ 
            break;
        default:  
            // สถานการณ์ข้อยกเว้นอื่น ๆ
            break;
    }
});

API Reference: AuthV4Interface.helper().syncAccount

import HIVEService
let providerType: ProviderType = .Google

AuthV4Interface.helper().syncAccount(providerType) { result, playerInfo in
    switch result.getCode() {
        case .success:
        // ปกติ
        case .authV4ConflictPlayer:
        // ข้อขัดแย้งของบัญชี
        // ex) เมื่อใช้ Hive UI
        // AuthV4Interface.helper().showConflict(...);
        // หรือ
        // ex) เมื่อดำเนินการ GameUI
        // AuthV4Interface.helper().resolverConflict(...);// เมื่อเลือกผู้ใช้ปัจจุบัน
        // AuthV4Interface.helper().switchAccount(...);// เมื่อเลือกสลับผู้ใช้ 
        default:
        // สถานการณ์ข้อยกเว้นอื่น ๆ
        break
    }
}

API Reference: [HIVEAuthV4 helper] syncAccount

#import <HIVEService/HIVEService-Swift.h>

HIVEProviderType providerType = HIVEProviderTypeGoogle
[[HIVEAuthV4 helper] syncAccount: providerType handler: ^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
    switch ([result getCode]) {
        case HIVEResultAPICodeSuccess:
            // ปกติ
            break;    
        case HIVEResultAPICodeAuthV4ConflictPlayer:
            // ข้อขัดแย้งของบัญชี
            // ex) เมื่อใช้ Hive UI
            // [[HIVEAuthV4 helper] showConflict: ...];
            // หรือ
            // ex) เมื่อดำเนินการ GameUI
            // [[HIVEAuthV4 helper] resolverConflict:...];// เมื่อผู้ใช้ปัจจุบันถูกเลือก
            // [[HIVEAuthV4 helper] switchAccount:...];// เมื่อการเปลี่ยนผู้ใช้ถูกเลือก  
            break;
        default:  
            // ข้อยกเว้นอื่น ๆ
            break;
    }
}];

การเข้าสู่ระบบแขก

ฟีเจอร์การเข้าสู่ระบบผู้เยี่ยมชมช่วยให้ผู้ใช้สามารถเล่นเกมในโหมดผู้เยี่ยมชมโดยไม่ต้องเลือก IdP คุณสามารถเลือกการเข้าสู่ระบบผู้เยี่ยมชมจาก UI การเข้าสู่ระบบที่ชัดเจนที่จัดเตรียมโดย Hive SDK หรือดำเนินการเข้าสู่ระบบผู้เยี่ยมชมโดยตรงในเกมของคุณผ่านการปรับแต่ง สภาพแวดล้อม Windows ไม่รองรับการเข้าสู่ระบบผู้เยี่ยมชม

เมื่อเข้าสู่ระบบในฐานะแขก คุณต้องปฏิบัติตามนโยบายต่อไปนี้

นโยบายการเข้าสู่ระบบของแขก

  • ดำเนินการเกมเพื่อให้ผู้ใช้ที่ตรวจสอบตัวตนผ่าน IdP และผู้ใช้ที่เป็นแขกสามารถใช้งานได้ในลักษณะเดียวกัน ฟีเจอร์ส่วนใหญ่ของแพลตฟอร์ม Hive สามารถใช้งานได้แม้จะเข้าสู่ระบบในฐานะแขก ดังนั้นโปรดดำเนินการเกมของคุณเพื่อให้ผู้ใช้ที่เข้าสู่ระบบในฐานะแขกสามารถใช้งานเกมได้ในลักษณะเดียวกับผู้ใช้ที่เชื่อมโยงกับ IdP ตัวอย่างเช่น ผู้ใช้ที่เป็นแขกควรสามารถซื้อไอเท็มและทำการชำระเงินภายในเกมได้เช่นกัน
    • อย่าให้ฟีเจอร์ออกจากระบบสำหรับผู้ใช้ที่เป็นแขก หากผู้ใช้ออกจากระบบหลังจากเข้าสู่ระบบในฐานะแขก พวกเขาจะไม่สามารถเข้าสู่ระบบด้วย PlayerID เดิมได้อีกต่อไป ดังนั้นเมื่อผู้ใช้เข้าสู่ระบบในฐานะแขก อย่าให้ปุ่มออกจากระบบเพื่อป้องกันไม่ให้พวกเขาออกจากระบบ
    • นโยบายห้ามเข้าสู่ระบบของแขกในประเทศจีน เมื่อใช้ IP ของจีน ผู้ใช้ที่ผ่านการตรวจสอบชื่อจริงเท่านั้นที่สามารถเติมเงินและใช้ทรัพยากร (มีผลตั้งแต่วันที่ 1 พฤษภาคม 2017) ดังนั้นการเข้าสู่ระบบของแขกจึงไม่รวมอยู่ในรายชื่อ IdP ที่สามารถเข้าสู่ระบบด้วย IP ของจีน

ในการเข้าสู่ระบบในฐานะแขก ให้เรียกใช้เมธอด signIn() โดยใช้ ProviderType.GUEST เป็นพารามิเตอร์
นี่คือตัวอย่างโค้ดสำหรับการเข้าสู่ระบบในฐานะแขก

Note

ไม่มี providerInfoData ใน playerInfo สำหรับ PlayerID ในสถานะแขกที่ไม่มีการตรวจสอบ IdP ใดๆ

API Reference: hive.AuthV4.signIn

using hive;

AuthV4.signIn(AuthV4.ProviderType.GUEST, (ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
    if (result.isSuccess()) {
        // การตรวจสอบสิทธิ์สำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
    }
});
#include "HiveAuthV4.h"

FHiveAuthV4::SignIn(EHiveProviderType::GUEST, 
                    FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {

    if (Result.IsSuccess()) {
            // การเรียกสำเร็จ (PlayerInfo: ข้อมูลผู้ใช้ที่ผ่านการตรวจสอบแล้ว)
    }
}));

API Reference: Auth4::signIn

#include <HIVE_SDK_Plugin/HIVE_CPP.h>

using namespace std;
using namespace hive;
AuthV4::signIn(ProviderType::GUEST, [=](ResultAPI const & result, PlayerInfo const & playerInfo) {
    if (result.isSuccess()) {
        // การตรวจสอบสิทธิ์สำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
    }
});

API Reference: AuthV4.signIn

import com.hive.AuthV4
import com.hive.ResultAPI

AuthV4.signIn(AuthV4.ProviderType.GUEST, object : AuthV4.AuthV4SignInListener {
    override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
        if (result.isSuccess) {
            // การตรวจสอบสิทธิ์สำเร็จ
            // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
        }
    }
})

API Reference: com.hive.Auth4.signIn

import com.hive.AuthV4;
import com.hive.ResultAPI;

AuthV4.signIn(AuthV4.ProviderType.GUEST, (result, playerInfo) -> {
    if (result.isSuccess()) {
        // การตรวจสอบสิทธิ์สำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
    }
});

API Reference: AuthV4Interface.signIn

import HIVEService

AuthV4Interface.signIn(.Guest) { result, playerInfo in
    if result.isSuccess() {
        // การตรวจสอบสิทธิ์สำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ตรวจสอบสิทธิ์แล้ว
    }
}

API Reference: HIVEAuth4:signIn

#import <HIVEService/HIVEService-Swift.h>

[HIVEAuthV4 signIn: HIVEProviderTypeGuest handler: ^(ResultAPI *result, HIVEPlayerInfo *playerInfo) {
    if ([result isSuccess]) {
        // การตรวจสอบสิทธิ์สำเร็จ
        // playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
    }
}];

การเข้าสู่ระบบที่กำหนดเอง

การเข้าสู่ระบบแบบกำหนดเอง เป็นฟีเจอร์ที่ช่วยให้คุณสามารถดำเนินการเข้าสู่ระบบโดยใช้ IdP ที่รวมเข้ากับเกมเอง นอกเหนือจาก IdP ที่จัดเตรียมโดย Hive ลองสร้างคีย์การตรวจสอบสิทธิ์ (authKey) เพื่อใช้เมื่อเรียก API การเข้าสู่ระบบแบบกำหนดเองตามที่ระบุใน Authenticate v4 Custom Authentication.

หลังจากเรียกใช้ API การเข้าสู่ระบบแบบกำหนดเอง คุณสามารถเข้าถึงข้อมูล customProviderInfoData ผ่านอินสแตนซ์ของคลาส PlayerInfo ที่ได้รับใน callback เพื่อตรวจสอบข้อมูลของผู้ใช้ที่เข้าสู่ระบบแบบกำหนดเอง ProviderType (enum) ของ customProviderInfoData ถูกตั้งค่าเป็น CUSTOM อย่างสม่ำเสมอ และสามารถแยกแยะรายละเอียดได้โดยใช้ ProviderName (String)

ข้อมูลของ IdP ที่ใช้การเข้าสู่ระบบแบบกำหนดเองในเกมจะไม่รวมอยู่ในผลลัพธ์ของการเรียกใช้เมธอด setup() และ showSignIn() ของคลาส AuthV4

หากคุณได้รับ playerId และ playerToken หลังจากการดำเนินการครั้งแรกของการเข้าสู่ระบบแบบกำหนดเอง API ผลลัพธ์ของ authV4SessionExist(code) จะถูกส่งเป็น callback เมื่อ API การเข้าสู่ระบบแบบกำหนดเองถูกเรียกอีกครั้ง ในกรณีนี้คุณควรเรียก signIn() โดยใช้พารามิเตอร์ ProviderType.Auto เพื่อดำเนินการเข้าสู่ระบบอัตโนมัติด้วยบัญชีที่เข้าสู่ระบบก่อนหน้านี้ โปรดดูตัวอย่างโค้ดด้านล่าง

วิธีการ connect() และ disconnect() ของคลาส AuthV4 ไม่รองรับการรวมและการตัดการเชื่อมต่อเพิ่มเติมของ IdP การเข้าสู่ระบบที่กำหนดเอง วิธีการ connectWithAuthKey() และ disconnectWithName() รองรับการรวมและการตัดการเชื่อมต่อเพิ่มเติมของ IdP การเข้าสู่ระบบที่กำหนดเอง

นี่คือตัวอย่างโค้ดสำหรับการนำไปใช้ล็อกอินแบบกำหนดเอง

API Reference: hive.AuthV4.signIn

// การเข้าสู่ระบบ Twitter ที่ดำเนินการโดยตรงในเกม
Game.Login("CUSTOM_TWITTER", (string authKey) => {
    AuthV4.signInWithAuthKey(authKey, (ResultAPI result, PlayerInfo playerInfo) => {
        if (result.isSuccess()) {
            Dictionary<string, ProviderInfo> customProviderInfoData = playerInfo.customProviderInfoData;
            ProviderInfo providerInfo = customProviderInfoData["CUSTOM_TWITTER"];
            // ตรวจสอบข้อมูลการเชื่อมโยงผู้ใช้ต่อไปนี้
            providerInfo.providerType;     // ProviderType.CUSTOM, ประเภทที่กำหนดเองจะถูกกำหนดไว้ ดังนั้นต้องแยกแยะตาม providerName
            providerInfo.providerName;   // "CUSTOM_TWITTER"
            providerInfo.providerUserId;  // รหัสผู้ใช้ที่ใช้สำหรับการเข้าสู่ระบบ Twitter แบบกำหนดเอง
            return;
        }
        else if (result.code == ResultAPI.Code.AuthV4SessionExist) {
            // หาก playerId และ playerToken ได้รับการออกแล้วและต้องการการเข้าสู่ระบบอัตโนมัติ
            // TODO: AuthV4.signIn(ProviderType.AUTO, (ResultAPI _result, PlayerInfo playerInfo) => {});
        }
        else if (result.code == ResultAPI.Code.AuthV4NotInitialized) {
            // TODO: ต้องมีการเริ่มต้น SDK
        }
        else if (result.code == ResultAPI.Code.AuthV4InvalidParam) {
            // TODO: ตรวจสอบว่าค่าของ authKey ที่ให้มาคือ NULL หรือว่างเปล่า
        }
        else if (result.needExit()) {
            // TODO: Implement app exit functionality
            // ตัวอย่าง) Application.Quit();
        }
    });  
});
#include "HiveAuthV4.h"

// ทำการเข้าสู่ระบบ Twitter โดยตรงในเกมด้วยประเภท "CUSTOM_TWITTER"
void GameLogin(const FString& AuthKey)
{
    FHiveAuthV4::SignInWithAuthKey(AuthKey, FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {

        if (Result.IsSuccess()) {
            TMap<FString, FHiveProviderInfo> CustomProviderInfoData = PlayerInfo.CustomProviderInfoData;
            if (const FHiveProviderInfo* ProviderInfo = CustomProviderInfoData.Find(TEXT("CUSTOM_TWITTER"))) {
                    EHiveProviderType ProviderType = ProviderInfo->ProviderType; // EHiveProviderType::CUSTOM, custom types are fixed
                    FString ProviderName = ProviderInfo->ProviderName; // Need to distinguish by ProviderName
                    FString ProviderUserId = ProviderInfo->ProviderUserId; // User id used in the custom Twitter login
            }
        } else if (Result.NeedExit()) {
            // TODO: Implement app exit functionality
            // e.g.) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        } else if (Result.Code == FHiveResultAPI::ECode::AuthV4SessionExist) {
            // If playerId and playerToken have already been issued and automatic login is needed
            // TODO: FHiveAuthV4.SignIn(EHiveProviderType::GUEST, Delegate);
        } else if (Result.Code == FHiveResultAPI::ECode::AuthV4NotInitialized) {
            // TODO: SDK initialization needed
        } else if (Result.Code == FHiveResultAPI::ECode::AuthV4InvalidParam) {
            // TODO: Check if the value of the provided authKey is empty
        }
    }));
}

API Reference: Auth4::signIn

using namespace std;
using namespace hive;

// การเข้าสู่ระบบ Twitter ถูกนำไปใช้โดยตรงในเกม
Game::Login("CUSTOM_TWITTER", [=](string authKey) {
    AuthV4::signInWithAuthKey(authKey, [=](ResultAPI const & result, PlayerInfo const & playerInfo) {
        if (result.isSuccess()) {
            map<string, ProviderInfo> customProviderInfoData = playerInfo.customProviderInfoData;
            ProviderInfo providerInfo = customProviderInfoData["CUSTOM_TWITTER"];
            // ตรวจสอบข้อมูลการเชื่อมโยงผู้ใช้ดังต่อไปนี้
            providerInfo.providerType; // ProviderType::CUSTOM, ประเภทที่กำหนดเองมีการกำหนดไว้แล้ว ดังนั้นจึงต้องแยกแยะตาม providerName
            providerInfo.providerName; // "CUSTOM_TWITTER"
            providerInfo.providerUserId; // รหัสผู้ใช้ที่ใช้สำหรับการเข้าสู่ระบบ Twitter แบบกำหนดเอง
            return;
        }
        else if (result.code == ResultAPI::Code::AuthV4SessionExist) {
            // หาก playerId และ playerToken ได้รับการออกแล้วและต้องการการเข้าสู่ระบบอัตโนมัติ
            // TODO: AuthV4.signIn(ProviderType::AUTO, [=](ResultAPI const & _result, PlayerInfo const & playerInfo) {});
        }
        else if (result.code == ResultAPI::Code::AuthV4NotInitialized) {
            // TODO: ต้องมีการเริ่มต้น SDK
        }
        else if (result.code == ResultAPI::Code::AuthV4InvalidParam) {
            // TODO: ตรวจสอบว่าค่าของ authKey ที่ให้มานั้นเป็น NULL หรือว่างเปล่าหรือไม่
        }
        else if (result.needExit()) {
            // TODO: นำฟังก์ชันการออกจากแอปไปใช้
            // สำหรับผู้ใช้เครื่องยนต์ Cocos2d-x
            // e.g.) exit(0);
            // สำหรับผู้ใช้เครื่องยนต์ Unreal
            // e.g.) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        }
    });  
});

เอกสารอ้างอิง API: com.hive.Auth4.signIn

// Directly implemented Twitter login in the game
Game.Login("CUSTOM_TWITTER") { authKey: String ->

    AuthV4.signInWithAuthKey(authKey, object : AuthV4.AuthV4SignInListener {
        override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {

            if (result.isSuccess && playerInfo != null) {
                playerInfo.customProviderInfoData["CUSTOM_TWITTER"]?.let { providerInfo ->
                    providerInfo.providerType   // ProviderType.CUSTOM, custom types are fixed by Type, so need to distinguish by providerName
                    providerInfo.providerName   // "CUSTOM_TWITTER"
                    providerInfo.providerUserId // User id used for the custom Twitter login
                }
            }
            else if (result.needExit()) {
                // TODO: Implement app exit functionality
                // e.g.) exitProcess(0)
            }
            else if (result.code == ResultAPI.Code.AuthV4SessionExist) {
                // If playerId and playerToken have already been issued and automatic login is needed
                // TODO: AuthV4.signIn(AuthV4.ProviderType.AUTO, authV4SignInListener)
            }
            else if (result.code == ResultAPI.Code.AuthV4NotInitialized) {
                // TODO: SDK initialization needed
            }
            else if (result.code == ResultAPI.Code.AuthV4InvalidParam) {
                // TODO: Check if the value of the provided authKey is NULL or empty
            }
        }
    })
}

API Reference: com.hive.Auth4.signIn

// Twitter login implemented directly in the game
Game.Login("CUSTOM_TWITTER") { authKey: String ->
    AuthV4.signInWithAuthKey(authKey, new AuthV4.AuthV4SignInListener() {
        @Override
        public void onAuthV4SignIn(@NonNull ResultAPI result, @Nullable AuthV4.PlayerInfo playerInfo) {

            if(result.isSuccess() && playerInfo != null) {
                HashMap<String, AuthV4.ProviderInfo> customProviderInfoData = playerInfo.getCustomProviderInfoData();
                AuthV4.ProviderInfo providerInfo = customProviderInfoData.get("CUSTOM_TWITTER");
                // ตรวจสอบข้อมูลการเชื่อมโยงผู้ใช้ดังต่อไปนี้
                if (providerInfo != null){
                    providerInfo.getProviderType(); // AuthV4.ProviderType.CUSTOM, ประเภทที่กำหนดเองจะถูกกำหนดโดยประเภท ดังนั้นต้องแยกแยะตาม providerName
                    providerInfo.getProviderName(); // "CUSTOM_TWITTER"
                    providerInfo.getProviderUserId(); // รหัสผู้ใช้ที่ใช้สำหรับการเข้าสู่ระบบ Twitter แบบกำหนดเอง
                }
            } else if (result.needExit()) {
                // TODO: Implement app exit functionality
                // e.g.) System.exit(0);
            } else if (result.getCode() == ResultAPI.Code.AuthV4SessionExist) {
                // หาก playerId และ playerToken ได้รับการออกแล้วและต้องการเข้าสู่ระบบอัตโนมัติ
                // TODO: AuthV4.signIn(AuthV4.ProviderType.AUTO, authV4SignInListener)
            } else if (result.getCode() == ResultAPI.Code.AuthV4NotInitialized) {
                // TODO: จำเป็นต้องมีการเริ่มต้น SDK
            } else if (result.getCode() == ResultAPI.Code.AuthV4InvalidParam) {
                // TODO: ตรวจสอบว่าค่าของ authKey ที่ให้มาเป็น NULL หรือว่างเปล่าหรือไม่
            }
        }
    });
}

API Reference: HIVEAuth4:signIn

// การเข้าสู่ระบบ Twitter ถูกนำไปใช้โดยตรงในเกม
Game.login("CUSTOM_TWITTER") { (authKey) in
    AuthV4Interface.signInWithAuthKey(authKey) { (result, playerInfo) in
        if result.isSuccess() {
            let customProviderInfoData = playerInfo?.customProviderInfoData;
            let providerInfo = customProviderInfoData?["CUSTOM_TWITTER"]
            // ตรวจสอบข้อมูลการเชื่อมโยงผู้ใช้ต่อไปนี้
            providerInfo?.providerType;     // AuthProviderType, ประเภทที่กำหนดเองถูกกำหนดโดย Type ดังนั้นต้องแยกแยะโดย providerName
            providerInfo?.providerName;     // "CUSTOM_TWITTER"
            providerInfo?.providerUserId;   // รหัสผู้ใช้ที่ใช้สำหรับการเข้าสู่ระบบ Twitter แบบกำหนดเอง
            return
        }
        else if result.getCode() == .authV4SessionExist {
            // หาก playerId และ playerToken ได้รับการออกแล้วและต้องการการเข้าสู่ระบบอัตโนมัติ
            // TODO: AuthV4Interface.signIn(.auto) { (result, playerInfo) in }
        }
        else if result.getCode() == .authV4NotInitialized {
            // TODO: ต้องมีการเริ่มต้น SDK
        }
        else if result.getCode() == .authV4invalidParam {
            // TODO: ตรวจสอบว่าค่าของ authKey ที่ให้มานั้นเป็น nil หรือว่างเปล่า
        }
        else if result.needExit() {
            // TODO: นำฟังก์ชันการออกจากแอปไปใช้
            // e.g.) exit(0)
        }
    }
}

API Reference: HIVEAuth4:signIn

// Directly implemented Twitter login in the game
[Game login:@"CUSTOM_TWITTER" handler:^(NSString* authKey) {

    [HIVEAuthV4 signInWithAuthKey:authKey handler:^(HIVEResultAPI* result, HIVEPlayerInfo* playerInfo) {
        if (result.isSuccess) {
            NSDictionary<NSString*, HIVEProviderInfo*>* customProviderInfoData = playerInfo.customProviderInfoData;
            ProviderInfo* providerInfo = [customProviderInfoData objectForKey:@"CUSTOM_TWITTER"];
            // ตรวจสอบข้อมูลการเชื่อมโยงผู้ใช้ต่อไปนี้
            providerInfo.providerType;     // HIVEProviderTypeCustom, เนื่องจากประเภทที่กำหนดเองนั้นคงที่ ต้องแยกแยะตาม providerName
            providerInfo.providerName;   // "CUSTOM_TWITTER"
            providerInfo.providerUserId;  // รหัสผู้ใช้ที่ใช้ในการเข้าสู่ระบบ Twitter ที่กำหนดเอง
            return;
        }
        else if (result.getCode == HIVEResultAPICodeAuthV4SessionExist) {
            // หาก playerId และ playerToken ได้ออกแล้วและต้องการการเข้าสู่ระบบอัตโนมัติ
            // TODO: [HIVEAuthV4 signIn:HIVEProviderTypeAuto, handler:^(HIVEResultAPI* _result, HIVEPlayerInfo* playerInfo) {}];
        }
        else if (result.getCode == HIVEResultAPICodeAuthV4NotInitialized) {
            // TODO: ต้องการการเริ่มต้น SDK
        }
        else if (result.getCode == HIVEResultAPICodeAuthV4InvalidParam) {
            // TODO: ตรวจสอบว่าค่าของ authKey ที่ให้มานั้นเป็น NULL หรือว่างเปล่าหรือไม่
        }
        else if (result.needExit) {
            // TODO: นำฟังก์ชันการออกจากแอปไปใช้
            // ตัวอย่าง) exit(0);
        }
    }];   
}];

ชื่อผู้ใช้

เนื่องจากปัญหาต่างๆ เช่น COPPA ในสหรัฐอเมริกา เมื่อเข้าถึงและเข้าสู่ระบบในฐานะ IdP จากสหรัฐอเมริกาและดินแดนของมัน คุณต้องป้อนชื่อผู้ใช้เพื่อเปิดใช้งานการประมวลผลการตรวจสอบสิทธิ์การระบุตัวตนของผู้ใช้เพิ่มเติม สำหรับการอ้างอิง ประเทศที่รวมอยู่ในดินแดนของสหรัฐอเมริกาคือ อเมริกันซามัว (AS), กวม (GU), หมู่เกาะนอร์เทิร์นมาเรียนา (MP), เปอร์โตริโก (PR), หมู่เกาะเล็กน้อยของสหรัฐอเมริกา (UM) และหมู่เกาะเวอร์จินของสหรัฐอเมริกา (VI) หน้าจอป้อนชื่อผู้ใช้สำหรับการระบุตัวตนของผู้ใช้มีดังนี้

  • หน้าจอกรอกชื่อผู้ใช้ใช้เพื่อการระบุผู้ใช้เท่านั้นและจะแสดงเพียงครั้งเดียวในระหว่างการรวม IdP เบื้องต้น; จะไม่แสดงอีกต่อไป
  • หน้าจอกรอกชื่อผู้ใช้จะไม่แสดงในระหว่างการเข้าสู่ระบบในฐานะแแขก

การตรวจสอบคีย์โทเค็นการรับรองความถูกต้อง

เซิร์ฟเวอร์เกมสามารถตรวจสอบความถูกต้องของคีย์โทเค็นโดยใช้ข้อมูลโทเค็น, playerId, และ DID ที่ส่งกลับหลังจากการเข้าสู่ระบบที่สำเร็จ การพิสูจน์ตัวตน Hive อนุญาตให้เข้าสู่ระบบจากหลายอุปกรณ์และการเข้าถึงพร้อมกัน

หากไม่อนุญาตให้เข้าถึงซ้ำด้วยบัญชีเดียวกัน เซิร์ฟเวอร์เกมจะแสดงข้อความแจ้งเตือนบนอุปกรณ์ที่เชื่อมต่อก่อนและจากนั้นจะสิ้นสุดเกม ทำให้เกมสามารถดำเนินการต่อได้บนอุปกรณ์ที่เชื่อมต่อภายหลัง ในกรณีนี้ หากคุณพยายามเข้าถึงเกมอีกครั้งโดยไม่สิ้นสุดเกม บันทึกการเล่นของคุณอาจไม่สะท้อนอย่างถูกต้อง เพื่อใช้ฟีเจอร์นี้ คุณต้องจัดการกับคีย์โทเค็นที่ได้รับการตรวจสอบแล้วหรือจัดการกับคีย์เซสชันของเกมเองโดยใช้มัน

โปรดดูที่ API เซิร์ฟเวอร์การตรวจสอบความถูกต้องของโทเค็น เพื่อดำเนินการฟีเจอร์นี้

การตรวจจับการเปลี่ยนแปลงบัญชี IdP ในพื้นหลัง

ผู้ใช้สามารถเปลี่ยนบัญชีเกม Apple Game Center หรือ Google Play ของตนได้โดยไปที่การตั้งค่าอุปกรณ์ในขณะที่เกมกำลังทำงานอยู่ หากคุณต้องการตรวจสอบว่าบัญชี IdP ในระหว่างการเล่นเกมแตกต่างจากบัญชี IdP ที่เชื่อมโยงกับ PlayerID ปัจจุบันหรือไม่ ให้เรียก setProviderChangedListener() หลังจากเริ่มต้น SDK โดยการเรียก API นี้ คุณจะได้รับเหตุการณ์ที่ระบุว่าบัญชี IdP ที่ตั้งไว้ในอุปกรณ์ได้เปลี่ยนแปลงเมื่อเกมกลับมาทำงานอีกครั้ง

iOS ทำงานเมื่อบัญชี Apple Game Center ถูกเปลี่ยน และ Android ทำงานเมื่อบัญชี Google Play Games ถูกเปลี่ยน และการตอบสนองจะถูกส่งมอบเฉพาะเมื่อ PlayerID ที่เข้าสู่ระบบในปัจจุบันเชื่อมโยงกับ IdP นั้น เมื่อได้รับเหตุการณ์การเปลี่ยนแปลงบัญชี IdP UI จะถูกกำหนดค่าเพื่อให้ผู้ใช้เลือกว่าจะใช้บัญชี IdP ที่เข้าสู่ระบบในอุปกรณ์หรือไม่ หากผู้ใช้เลือกบัญชี IdP ที่เข้าสู่ระบบในอุปกรณ์ signOut จะถูกเรียกเพื่อออกจากระบบ และจากนั้นจะดำเนินการเข้าสู่ระบบโดยอัตโนมัติ

Warning

อุปกรณ์ที่ติดตั้งเกม Google Play ที่เผยแพร่หลังจากเดือนกรกฎาคม 2021 ไม่สามารถเปลี่ยนบัญชี IdP ในพื้นหลังได้เนื่องจากปัญหาการดำเนินงานกับเกม Google Play.

Note

ฟีเจอร์นี้อาจทำให้เกิดการหยุดชะงักในเกมและขอให้เปลี่ยนบัญชี และสามารถใช้ได้เฉพาะในช่วงเวลาที่จำเป็นต้องมีการซิงค์บัญชี เช่น การเข้าสู่ล็อบบี้หรือร้านค้า

ต่อไปนี้คือตัวอย่างโค้ดที่ตั้งค่าเพื่อรับเหตุการณ์เมื่อผู้ใช้เริ่มเกมใหม่และบัญชี IdP ที่ตั้งไว้ในอุปกรณ์ได้เปลี่ยนแปลง

API Reference: hive.AuthV4.setProviderChangedListener

using hive;

AuthV4.setProviderChangedListener((ResultAPI result, AuthV4.ProviderInfo providerInfo) => {
    if (!result.isSuccess()) {
        return;
    }

    if (providerInfo != null && providerInfo.providerType == AuthV4.ProviderType.APPLE) {
        // เปลี่ยนข้อมูลผู้ใช้ GameCenter
    }
});
#include "HiveAuthV4.h"

FHiveAuthV4::SetProviderChangedListener(FHiveAuthV4OnCheckProviderDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHiveProviderInfo& ProviderInfo) {
    if (Result.IsSuccess()) {
            // การเรียกสำเร็จ ตรวจสอบข้อมูลผู้ใช้ที่เปลี่ยนแปลงผ่านวัตถุ ProviderInfo
    }
}));

API Reference: AuthV4::setProviderChangedListener

#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;

AuthV4::setProviderChangedListener([=](ResultAPI const & result, ProviderInfo const & providerInfo) {
    if (!result.isSuccess()) {
        return;
    }

    if (providerInfo != null && providerInfo.providerType == ProviderType::GOOGLE) {
        // เปลี่ยนบัญชีบริการเกม Google Play
    }
});

เอกสารอ้างอิง API: AuthV4.setProviderChangedListener

import com.hive.AuthV4
import com.hive.ResultAPI

AuthV4.setProviderChangedListener(object : AuthV4.AuthV4CheckProviderListener {
    override fun onDeviceProviderInfo(result: ResultAPI, providerInfo: AuthV4.ProviderInfo?) {
        if (!result.isSuccess) {
            return
        }

        if (providerInfo != null && providerInfo.providerType == AuthV4.ProviderType.GOOGLE) {
            // เปลี่ยนบัญชีบริการเกม Google Play
        }
    }
})

API Reference: com.hive.AuthV4.setProviderChangedListener

import com.hive.AuthV4;
import com.hive.ResultAPI;

AuthV4.setProviderChangedListener((result, providerInfo) -> {
    if (!result.isSuccess()) {
        return;
    }

    if (providerInfo != null && providerInfo.getProviderType() == AuthV4.ProviderType.GOOGLE) {
        // เปลี่ยนบัญชี Google Play Game Service
    }
});

เอกสาร API: AuthV4Interface.setProviderChangedListener

import HIVEService

AuthV4Interface.setProviderChangedListener() { result, providerInfo in 
    if !result.isSuccess() {
        return
    }

    if let providerInfo = providerInfo, providerInfo.providerType == .Apple {
        // เปลี่ยนข้อมูลผู้ใช้ GameCenter
    }
}

API Reference: HIVEAuthV4:setProviderChangedListener

#import <HIVEService/HIVEService-Swift.h>

[HIVEAuthV4 setProviderChangedListener: ^(HIVEResultAPI *result, ProviderInfo *providerInfo) {
    if (![result isSuccess]) {
        return;
    }

    if (providerInfo != nil && providerInfo.providerType == HIVEProviderTypeApple) {
        // เปลี่ยนข้อมูลผู้ใช้ GameCenter
    }
}];

การเริ่มต้นข้อมูลเกม

อย่าทำการออกจากระบบเมื่อเริ่มต้นข้อมูลเกม เนื่องจาก PlayerID จะไม่ถูกลบ อาจเกิดความขัดแย้งระหว่างบัญชีได้ คุณควรทำให้แน่ใจว่าไม่ทำการออกจากระบบจนกว่าผู้ใช้จะร้องขออย่างชัดเจน เนื่องจากพวกเขาควรสามารถเล่นต่อไปได้ด้วยบัญชีที่เข้าสู่ระบบอยู่ในขณะนี้

ออกจากระบบ

Warning
  • เมื่อออกจากระบบ ข้อมูลการตรวจสอบสิทธิ์ PlayerId และข้อมูลเซสชัน PlayerToken รวมถึงข้อมูลเซสชัน IDP ทั้งหมดจะถูกลบ
  • ค่าที่ตั้งโดย API ทั้งหมดที่เริ่มต้นด้วย set จะไม่ถูกตั้งค่าใหม่หรือลบ
    • วิธีการทั้งหมดที่เริ่มต้นด้วย set ในคลาส Configuration, Auth, Auth v4, Promotion และ Push
    • ตัวอย่างที่เป็นตัวแทน ได้แก่ Configuration.setServer, Configuration.setUseLog, Configuration.setGameLanguage, Configuration.setHiveCertificationKey, Auth.setEmergencyMode, AuthV4.setProviderChangedListener, Promotion.setUserEngagementReady, Promotion.setAddtionalInfo, Push.setRemotePush, Push.setForegroundPush เป็นต้น วิธีการทั้งหมดที่เริ่มต้นด้วย set จะอยู่ในหมวดหมู่นี้
    • ตั้งแต่ Hive SDK v4 24.3.0 จะมีการคืนรหัสข้อผิดพลาดเมื่อผู้ใช้ที่เป็นแขกออกจากระบบ หลังจากนั้น เซสชันของไคลเอนต์และเซิร์ฟเวอร์จะถูกเก็บรักษาไว้
  • ขอบเขตความถูกต้องของค่าที่ตั้งผ่านวิธีการที่เริ่มต้นด้วย set ใน SDK จะถูกเก็บรักษาไว้ภายในวงจรชีวิตของแอป โดยไม่คำนึงถึงสถานะการเข้าสู่ระบบหรือออกจากระบบ

หากคุณได้เข้าสู่ระบบ Hive แล้ว PlayerID และกุญแจโทเค็นการรับรองความถูกต้องจะถูกออกให้ การออกจากระบบจะทำหน้าที่รีเซ็ต PlayerID และกุญแจโทเค็นการรับรองความถูกต้อง เมื่อคุณเรียกใช้วิธีการ signOut() เพื่อทำการออกจากระบบ คุณจะถูกนำกลับไปยังชื่อเกม และจะมีการเข้าสู่ระบบอย่างชัดเจนเมื่อคุณคลิกที่ชื่อเกม

Note
  • เมื่อออกจากระบบในสถานะผู้ใช้แขก จะไม่สามารถค้นหา PlayerID เดิมได้อีก ดังนั้นโปรดดำเนินการให้ไม่สามารถออกจากระบบในสถานะแขกได้
  • สถานะการเชื่อมโยง IdP ของ PlayerID จะไม่เปลี่ยนแปลงแม้หลังจากออกจากระบบ
  • เมื่อการออกจากระบบเสร็จสิ้น จะย้ายไปยังชื่อเกม และจะมีการเข้าสู่ระบบอย่างชัดเจนเมื่อคลิกที่ชื่อเกม
  • หลังจากออกจากระบบ จะมีการเข้าสู่ระบบโดยอัตโนมัติก่อนเมื่อเริ่มแอปใหม่

นี่คือตัวอย่างโค้ดที่ทำการออกจากระบบ

API Reference: hive.AuthV4.signOut

using hive;    

AuthV4.Helper.signOut (delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {    
    switch(result.code) {    
        case ResultAPI.Code.Success:    
            // Logout successful    
            break;    
        default:    
            // Other exceptions    
            break;    
    }    
});
#include "HiveAuthV4.h"

FHiveAuthV4::Helper::SignOut(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
    AHIVESDKV4TesterGameMode::getGameModeInstance()->appendLogString(ELogType::AuthV4Helper ,TEXT("Helper::SignOut Result = %s"), *(Result.ToString()));
    switch (Result.Code) {
        case FHiveResultAPI::ECode::Success:
            // Logout successful
            break;
        default:
            // Other exceptions
            break;
    }
}));

API Reference: AuthV4::signOut

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
using namespace std;    
using namespace hive;    

AuthV4::Helper::signOut([=](ResultAPI const & result, shared_ptr playerInfo) {    
    switch (result.code) {    
        case ResultAPI::Success:    
            // Logout successful    
            break;    
        default:    
            // Other exceptions    
            break;    
    }    
});

เอกสาร API: AuthV4.Helper.signOut

import com.hive.AuthV4
import com.hive.ResultAPI

AuthV4.Helper.signOut(object : AuthV4.Helper.AuthV4HelperListener {
    override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
        when (result.code) {
            ResultAPI.Code.Success -> {
                // ออกจากระบบสำเร็จ
            }
            else -> {
                // สถานการณ์ข้อยกเว้นอื่น ๆ
            }
        }
    }
})

เอกสารอ้างอิง API: AuthV4.Helper.signOut

import com.hive.AuthV4;
import com.hive.ResultAPI;

AuthV4.Helper.signOut((result, playerInfo) -> {
    switch (result.getCode()) {
        case Success:
            // Logout successful
            break;
        default:
            // Other exceptions
            break;
    }
});

เอกสาร API: AuthV4Interface.helper().signOut()

import HIVEService

AuthV4Interface.helper().signOut() { result, playerInfo in
    switch result.getCode() {
        case .success:
            // Logout successful
        default:
            // Other exceptions
            break
    }}

เอกสารอ้างอิง API: [HIVEAuthV4 helper] signOut

#import <HIVEService/HIVEService-Swift.h>

[[HIVEAuthV4 helper] signOut: ^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
    switch ([result getCode]) {
        case HIVEResultAPICodeSuccess:
            // Login successful
            break;
        default:
            // Other exceptions
            break;
    }
}];

ข้อความแจ้งยกเลิกศูนย์เกม

Language Phrase
Korean การเข้าสู่ระบบ Apple Game Center ถูกยกเลิก.
กรุณาเข้าสู่ระบบที่ [การตั้งค่า > Game Center] เพื่อซิงค์กับบัญชี Game Center ของคุณและลองอีกครั้ง.
English การเข้าสู่ระบบของคุณไปยัง Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า> Game Center] เพื่อซิงค์กับบัญชี Game Center และลองอีกครั้ง.
Japanese การเข้าสู่ระบบ Apple Game Center ถูกยกเลิก.
กรุณาเข้าสู่ระบบที่ [การตั้งค่า > Game Center] เพื่อลองอีกครั้ง.
Simplified Chinese Apple Game Center ได้ออกจากระบบ.
หากคุณต้องการซิงค์กับบัญชี Game Center กรุณาเข้าสู่ระบบอีกครั้งที่ [การตั้งค่า> Game Center] และลองอีกครั้ง.
Traditional Chinese การเข้าสู่ระบบ Apple Game Center ถูกยกเลิก.
หากคุณต้องการเชื่อมโยงบัญชี Game Center กรุณาเข้าสู่ระบบที่ [การตั้งค่า > Game Center] และลองอีกครั้ง.
French การเชื่อมต่อของคุณไปยัง Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า > Game Center] เพื่อซิงค์บัญชี Game Center ของคุณและลองอีกครั้ง.
German การเข้าสู่ระบบไปยัง Apple Game Center ถูกยกเลิก.
ซิงค์กับบัญชี Game Center ผ่าน [การตั้งค่า > Game Center]. เข้าสู่ระบบและลองอีกครั้ง.
Russian การเข้าสู่ระบบของคุณไปยัง Game Center ถูกยกเลิก.
เข้าสู่ระบบไปยัง Game Center ผ่าน [การตั้งค่า > Game Center] และลองอีกครั้ง.
Spanish การเข้าสู่ระบบของคุณไปยัง Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า>Game Center] เพื่อซิงค์กับบัญชี Game Center และลองอีกครั้ง.
Portuguese การเข้าสู่ระบบของคุณไปยัง Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า>Game Center] เพื่อซิงค์กับบัญชี Game Center และลองอีกครั้ง.
Indonesian การเข้าสู่ระบบไปยัง Apple Game Center ถูกยกเลิก.
เชื่อมต่อบัญชี Game Center ของคุณโดยการเข้าสู่ระบบที่ [การตั้งค่า > Game Center] และลองอีกครั้ง.
Malaysian การเข้าสู่ระบบของคุณไปยัง Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า>Game Center] เพื่อซิงค์กับบัญชี Game Center และลองอีกครั้ง.
Vietnamese การเข้าสู่ระบบไปยัง Apple Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า > Game Center] เพื่อซิงค์กับบัญชี Game Center ของคุณและลองอีกครั้ง.
Thai การเข้าสู่ระบบของคุณไปยัง Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า>Game Center] เพื่อเชื่อมต่อกับบัญชี Game Center ของคุณและลองอีกครั้ง.
Italian การเข้าสู่ระบบของคุณไปยัง Apple Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า > Game Center] เพื่อซิงค์บัญชีของคุณกับ Game Center และลองอีกครั้ง.
Turkish การเข้าสู่ระบบของคุณไปยัง Apple Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า>Game Center] เพื่อเข้าถึงบัญชี Game Center ของคุณและลองอีกครั้ง.
Arabic การเข้าสู่ระบบของคุณไปยัง Game Center ถูกยกเลิก.
เข้าสู่ระบบที่ [การตั้งค่า> Game Center] เพื่อซิงค์กับบัญชี Game Center ของคุณและลองอีกครั้ง.