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

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

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

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 ประเภทการเข้าสู่ระบบใน console จะต้องไม่รวม Apple Game Center

Note
  • หากเกมมีเป้าหมายหลักสำหรับเด็กอายุต่ำกว่า 13 ปี บริการเกม Google Play จะไม่สามารถใช้งานได้ และไม่สามารถใช้การเข้าสู่ระบบโดยปริยายในเวอร์ชัน Google ได้ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ Quality Checklist for Google Play Games Services.
    • การเข้าสู่ระบบโดยปริยายสำหรับเกม Google Play ควรพยายามทำในระหว่างการเข้าสู่ระบบครั้งแรกเท่านั้น สำหรับข้อมูลเพิ่มเติม โปรดดูที่คู่มือของนักพัฒนา Google 1.5 Remember if players declined signing-in.
Note
  • ในประเทศจีน ไม่สามารถใช้เกม Google Play ได้ ดังนั้นการเข้าสู่ระบบโดยปริยายจึงไม่สามารถใช้ได้บน Android
  • ในประเทศจีน ไม่สามารถใช้ 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, ...) คือ ยกเลิก.

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 เท่านั้น

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

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

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

ในการใช้การเข้าสู่ระบบอัตโนมัติในสภาพแวดล้อม iOS คุณต้องเพิ่ม Game Center Entitlement ซึ่ง Unity จะเพิ่มโดยอัตโนมัติผ่าน Unity PostProcess หากคุณเลือก 'Apple GameCenter' Dependency ใน 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.
Note

เพื่อให้การลงชื่อเข้าใช้ Google แบบปริยายสำหรับผู้ใช้ของอุปกรณ์ Android OS ในโหมดออฟไลน์ โปรดดูที่ ต่อไปนี้

การเข้าสู่ระบบอัตโนมัติในสภาพแวดล้อมของ 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 sign 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:
  k              // 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
        // For Cocos2d-x engine users
        // e.g. exit(0);
        // For 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:
                // Implicit login failed
                // ex) AuthV4.showSignIn(...);
                break;
            default:
                break;
        }
    }
});

API Reference: hive.AuthV4.Helper.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 -> {
                    // ลงชื่อเข้าใช้โดยปริยายล้มเหลว
                    // e.g.) 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) จะส่งผลให้เกิดสถานการณ์ความขัดแย้งของบัญชีเมื่อเข้าสู่ระบบด้วยบัญชีที่แตกต่างหลังจากการเข้าสู่ระบบครั้งแรก โดยจะส่งคืนรหัสผลลัพธ์เป็น AuthV4ConflictPlayer และจะมีการแสดงกล่องโต้ตอบเพื่อถามผู้ใช้ว่าต้องการเข้าสู่ระบบด้วยบัญชีที่เข้าสู่ระบบล่าสุดหรือไม่ (AuthV4.Helper.showConflict การดำเนินการ)


อย่างไรก็ตาม การลงชื่อเข้าใช้ Google โดยไม่ต้องใช้รหัสผ่านในสภาพแวดล้อมมือถือ Android จะทำงานแตกต่างกันดังนี้


ในสภาพแวดล้อมมือถือ Android การเข้าสู่ระบบด้วย Google Sign-in แบบอิมพลิซิตจะส่งกลับความสำเร็จหรือความล้มเหลวโดยไม่ทำให้เกิดความขัดแย้งของบัญชี (AuthV4ConflictPlayer) ซึ่งแตกต่างจากสภาพแวดล้อมมือถืออื่น ๆ ในภาพด้านบน Legacy Support Google Authentication หมายถึงการเข้าสู่ระบบแบบอิมพลิซิตสำหรับ Google Sign-in ในสภาพแวดล้อมมือถือ Android.

หลังจากที่เข้าสู่ระบบสำเร็จ หากผู้ใช้พยายามที่จะ การรวม IdP หรือเรียก ความสำเร็จและกระดานผู้นำของ Google จะมี UI แสดงขึ้นมาเพื่อเลือกบัญชี Google (สร้างเซสชันการเข้าสู่ระบบใหม่) หาก PlayerInfo ของบัญชีที่เข้าสู่ระบบอยู่แล้วถูกตรวจสอบและบัญชี Google ที่เลือกใหม่แตกต่างจากข้อมูลนี้ จะเกิดความขัดแย้งของบัญชี (AuthV4ConflictPlayer) ในจุดนี้ หากคุณ จัดการกับสถานการณ์ความขัดแย้งของบัญชี คุณสามารถเข้าสู่ระบบด้วยบัญชี Google ที่เลือกใหม่ได้


ในสถานการณ์ที่ไม่มีเซสชันการเข้าสู่ระบบที่มีอยู่ (เช่น เมื่อแอปถูกติดตั้งและทำงานเป็นครั้งแรก) การเข้าสู่ระบบแบบอิมพลิซิตของ Google Sign-in ในสภาพแวดล้อมมือถือ Android จะแสดงพฤติกรรมที่แตกต่างกันขึ้นอยู่กับสถานการณ์ดังต่อไปนี้

  1. สถานการณ์ที่มีบัญชี Google บัญชีเดียวที่เข้าสู่ระบบในแอปอยู่ในการตั้งค่าบัญชีของอุปกรณ์ Android OS (สถานการณ์ที่บัญชี Google ได้เข้าสู่ระบบในอุปกรณ์ Android OS)
    • เข้าสู่ระบบด้วยบัญชี Google
  2. สถานการณ์ที่มีบัญชี Google สองบัญชีหรือมากกว่าที่เข้าสู่ระบบในแอปอยู่ในการตั้งค่าบัญชีของอุปกรณ์ Android OS (สถานการณ์ที่บัญชี Google เฉพาะได้เข้าสู่ระบบในอุปกรณ์ Android OS)
    • แสดง UI ที่อนุญาตให้เลือกหนึ่งในบัญชี Google ที่เข้าสู่ระบบ
    • เข้าสู่ระบบหลังจากเลือกบัญชีจาก UI
    • หากผู้ใช้ปิด UI โดยไม่เลือกบัญชี Google ใด ๆ ให้แสดง UI ที่มีรายการบัญชี Google ทั้งหมดที่มีอยู่ในการตั้งค่าบัญชีของอุปกรณ์ Android OS
    • หากผู้ใช้เลือกบัญชี Google ที่ต้องการจากรายการ UI ของบัญชี Google ทั้งหมด ให้เข้าสู่ระบบด้วยบัญชีนั้น
  3. สถานการณ์ที่ไม่มีบัญชี Google ที่เข้าสู่ระบบในแอป
    • แสดง UI ที่มีรายการบัญชี Google ทั้งหมดที่มีอยู่ในการตั้งค่าบัญชีของอุปกรณ์ Android OS
    • หากผู้ใช้เลือกบัญชี Google ที่ต้องการจากรายการ UI ของบัญชี Google ทั้งหมด ให้เข้าสู่ระบบด้วยบัญชีนั้น


ภาพด้านล่างแสดงตัวอย่าง UI สำหรับสามสถานการณ์ข้างต้น จากทางซ้าย พวกเขาสอดคล้องกับสถานการณ์ 1, 2 และ 3.

Note

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการรับรองความถูกต้องของ Google โปรดดูที่ Google Credential Manager.

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

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

การเข้าสู่ระบบอย่างชัดเจน

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

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

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

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

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

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

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

Note

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

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 the app exit functionality
        // e.g.) Application.Quit();
    }
});
#include "HiveAuthV4.h"

// Hive SDK AuthV4 การร้องขอ UI การตรวจสอบสิทธิ์
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 engine users
        // ตัวอย่าง) exit(0);
        // Unreal engine users
        // ตัวอย่าง) 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);
    }
}];


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

  1. สถานการณ์ที่บัญชี Google หนึ่งบัญชีเข้าสู่ระบบในแอปพลิเคชันและปรากฏในการตั้งค่าบัญชีของอุปกรณ์ Android OS (สถานการณ์ที่บัญชี Google ได้เข้าสู่ระบบในอุปกรณ์ Android OS)
    • เข้าสู่ระบบด้วยบัญชี Google ที่เกี่ยวข้อง
  2. สถานการณ์ที่บัญชี Google สองบัญชีหรือมากกว่าที่เข้าสู่ระบบในแอปพลิเคชันและปรากฏในการตั้งค่าบัญชีของอุปกรณ์ Android OS (สถานการณ์ที่บัญชี Google เฉพาะได้เข้าสู่ระบบในอุปกรณ์ Android OS)
    • แสดง UI ที่อนุญาตให้เลือกหนึ่งในบัญชี Google ที่เข้าสู่ระบบ
    • เข้าสู่ระบบหลังจากเลือกบัญชีจาก UI
    • หากผู้ใช้ปิด UI โดยไม่เลือกบัญชี Google ใด ๆ ให้แสดง UI ที่มีรายการบัญชี Google ทั้งหมดที่ปรากฏในการตั้งค่าบัญชีของอุปกรณ์ Android OS
    • เมื่อผู้ใช้เลือกบัญชี Google ที่ต้องการจาก UI รายการบัญชี Google ทั้งหมด ให้เข้าสู่ระบบด้วยบัญชีนั้น
  3. สถานการณ์ที่ไม่มีบัญชี Google ใด ๆ ที่เข้าสู่ระบบในแอปพลิเคชัน
    • แสดง UI ที่มีรายการบัญชี Google ทั้งหมดที่ปรากฏในการตั้งค่าบัญชีของอุปกรณ์ Android OS
    • เมื่อผู้ใช้เลือกบัญชี Google ที่ต้องการจาก UI รายการบัญชี Google ทั้งหมด ให้เข้าสู่ระบบด้วยบัญชีนั้น


ภาพด้านล่างเป็นตัวอย่างของ UI สำหรับสามสถานการณ์ข้างต้น จากซ้ายไปขวา จะตรงกับสถานการณ์ที่ 1, 2 และ 3

Note

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการรับรองความถูกต้องของ Google โปรดดูที่ Google Credential Manager.

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

UI ที่ปรับแต่งได้สำหรับการเข้าสู่ระบบแบบชัดเจนสามารถนำไปใช้ได้โดยใช้ providerTypeList providerTypeList คือ ตัวจัดการการตอบกลับที่ส่งกลับเมื่อเรียกใช้วิธี AuthV4.setup() เพื่อเริ่มต้น Hive SDK หรือเมื่อเรียกใช้วิธี 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()) {
        // การเรียกใช้สำเร็จ
        // playerInfo : ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
        // ตัวอย่างการดึงข้อมูลอีเมลสำหรับ 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: 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:
            // Normal response
            break;
        case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
            // Account conflict
            // ex) When using Hive UI
            // FHiveAuthV4::Helper::ShowConflict()
            // ex) When implementing Game UI
            // FHiveAuthV4::Helper::ResolveConflict() // Current user selection
            // FHiveAuthV4::Helper::SwitchAccount() // User switch selection
            break;
        default:
            // Other exceptional situations
            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: 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() {
        // Authentication successful
        // playerInfo: Authenticated user information
    }
}

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 ที่ได้รับเป็นการตอบกลับเพื่อตรวจสอบข้อมูลของผู้ใช้ที่เข้าสู่ระบบแบบกำหนดเอง 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
            // Example) 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
            // ตัวอย่าง) exit(0);
            // สำหรับผู้ใช้เครื่องยนต์ Unreal
            // ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        }
    });  
});

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

// Twitter login implemented directly 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, 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, ประเภทที่กำหนดเองจะต้องแยกแยะตาม 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

// Twitter login implemented directly 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: นำฟังก์ชันการออกจากแอปไปใช้
            // e.g) exit(0);
        }
    }];   
}];

ชื่อผู้ใช้

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

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

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

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

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

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

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

ผู้ใช้สามารถไปที่การตั้งค่าอุปกรณ์ระหว่างการเล่นเกมเพื่อเปลี่ยนบัญชี Apple Game Center หรือ Google Play Games ของตน หากคุณต้องการตรวจสอบว่าบัญชี 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
    }
});

API Reference: 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
    }
}];

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

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

ออกจากระบบ

Warning
  • ในระหว่างการออกจากระบบ ข้อมูลการตรวจสอบสิทธิ์ PlayerId และข้อมูลเซสชัน PlayerToken รวมถึงข้อมูลเซสชันของ IDP ทั้งหมดจะถูกลบออก
  • ค่าที่ตั้งโดย API ทั้งหมดที่เริ่มต้นด้วย set จะไม่ถูกตั้งค่าใหม่หรือลบออก
    • วิธีการทั้งหมดที่เริ่มต้นด้วย set ในคลาส Configuration, Auth, Auth v4, Promotion และ Push
    • ตัวอย่างที่เป็นตัวแทน ได้แก่ ex> 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] เพื่อทดลองอีกครั้งหลังจากซิงค์กับบัญชี 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 ของคุณและลองอีกครั้ง