เข้าสู่ระบบและออกจากระบบ
การเข้าสู่ระบบในกระบวนการรับรองจะประกอบด้วยลำดับต่อไปนี้
Note
- ในเวอร์ชันที่ต่ำกว่า SDK 4.7.0 จะไม่รองรับ Helper วิธีการเข้าสู่ระบบเดิมสามารถดูได้ที่ [ต่อไปนี้]
- สำหรับคำอธิบายเกี่ยวกับ AuthV4.Helper โปรดดูที่หน้า การรับรองความถูกต้อง
ลงชื่อเข้าใช้¶
การเข้าสู่ระบบในกระบวนการรับรองจะประกอบด้วยลำดับต่อไปนี้
- การเข้าสู่ระบบอัตโนมัติและการเข้าสู่ระบบโดยปริยาย
- การเข้าสู่ระบบโดยชัดแจ้ง
- ตรวจสอบบัญชี IdP ที่เข้าสู่ระบบในอุปกรณ์
- การเข้าสู่ระบบแบบแขก
Authv4Helper เป็นคลาสที่ดำเนินการชุดกระบวนการที่เกี่ยวข้องกับการเข้าสู่ระบบ และจัดเตรียมการย้ายไปยังหน้าที่เหมาะสมตามค่าตอบกลับ โปรดอ้างอิงถึงสิ่งต่อไปนี้เมื่อกำหนดค่าการเข้าสู่ระบบ
Note
Apple ไม่รองรับ Apple Game Center และการซื้อในแอปใน iOS Enterprise Build ดังนั้นไม่สามารถใช้การเข้าสู่ระบบโดยปริยายที่ใช้บัญชี Apple Game Center ใน iOS Enterprise Build และไม่สามารถใช้ Apple Game Center ในการเข้าสู่ระบบโดยชัดแจ้งได้
Note
- หากเกมมีเป้าหมายหลักสำหรับเด็กอายุต่ำกว่า 13 ปี จะไม่สามารถใช้บริการเกม Google Play ได้ ดังนั้นจึงไม่สามารถใช้การเข้าสู่ระบบโดยปริยายใน Google Build ได้ โปรดดูรายละเอียดเพิ่มเติมที่ Quality Checklist for Google Play Games Services.
- ควรพยายามเข้าสู่ระบบโดยปริยายของ Google Play Games เฉพาะเมื่อเข้าสู่ระบบครั้งแรกเท่านั้น โปรดดูรายละเอียดเพิ่มเติมในคู่มือการพัฒนาของ Google 1.5 Remember if players declined signing-in
Note
- เนื่องจากในประเทศจีนไม่สามารถใช้ Google Play เกมได้ จึงไม่สามารถใช้การเข้าสู่ระบบโดยปริยายบน Android ได้
- เนื่องจากในประเทศจีนไม่สามารถใช้ Facebook ได้ รายชื่อ IdP จะไม่มี Facebook
- เนื่องจากใน IP ของจีนมีเพียงผู้ใช้ที่ผ่านการรับรองชื่อจริงเท่านั้นที่สามารถเติมเงินหรือใช้บริการได้ (เริ่มตั้งแต่วันที่ 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 โดยป๊อปอัพแนะแนวการเข้าสู่ระบบด้วย Apple ID จะถูกแสดงโดยอัตโนมัติ ดังนั้นสตูดิโอเกมไม่จำเป็นต้องแสดง ป๊อปอัพ แยกต่างหาก
การเข้าสู่ระบบอัตโนมัติและการเข้าสู่ระบบโดยปริยาย¶
การเข้าสู่ระบบอัตโนมัติ¶
การเข้าสู่ระบบโดยอัตโนมัติเป็นวิธีที่ผู้ใช้ไม่เลือกวิธีการเข้าสู่ระบบ แต่จะเข้าสู่ระบบบัญชี Apple Game Center บน iOS หรือบัญชี Google Play Games บน Android โดยอัตโนมัติ ให้ดำเนินการเข้าสู่ระบบโดยอัตโนมัติหลังจากที่การเข้าสู่ระบบอัตโนมัติล้มเหลว
ในการใช้การเข้าสู่ระบบอัตโนมัติในสภาพแวดล้อม iOS คุณต้องเพิ่ม Game Center Entitlement ใน Unity หากคุณได้ทำเครื่องหมายที่การพึ่งพา 'Apple GameCenter' มันจะเพิ่มสิทธิ์โดยอัตโนมัติผ่าน Unity PostProcess สำหรับ iOS Native Xcode จะเพิ่ม Game Center Entitlement โดยอัตโนมัติ
โหมดออฟไลน์¶
Hive SDK v4 23.1.0 และสูงกว่านั้นมีฟีเจอร์การเข้าสู่ระบบอัตโนมัติ (AuthV4.signIn
โดยใช้ ProviderType.AUTO
หรือ AuthV4.Helper.signIn
) แม้ว่าจะไม่มีการเชื่อมต่อกับเครือข่ายก็ตาม เพื่อใช้โหมดออฟไลน์ โปรดทำตามคำแนะนำด้านล่าง:
-
จำเป็นต้องให้แอปทำงานในโหมดออนไลน์อย่างน้อยหนึ่งครั้ง ซึ่งส่งผลให้การเข้าสู่ระบบที่ประสบความสำเร็จ ไม่ว่าจะเป็นแบบชัดเจน แบบปกติ แบบแขก หรือแบบกำหนดเอง และจากนั้น
playerId
และplayerToken
จะถูกออกให้
จากมุมมองของนักพัฒนาแอป จะต้องมีการดำเนินการที่ประสบความสำเร็จอย่างน้อยหนึ่งครั้งของAuthV4.Helper.signIn
,AuthV4.showSignIn
, หรือAuthV4.signInWithAuthKey
ในสถานะออนไลน์ โดยมีการรับplayerId
และplayerToken
ผ่านการเรียกกลับ จากมุมมองของผู้ใช้ พวกเขาจะต้องเข้าสู่ระบบแอปได้สำเร็จอย่างน้อยหนึ่งครั้งในขณะที่อุปกรณ์ของพวกเขาเชื่อมต่อกับเครือข่าย อย่างไรก็ตาม หากบัญชีของผู้ใช้ถูกระงับหรือจำกัดในระหว่างการพยายามเข้าสู่ระบบครั้งล่าสุดในโหมดออนไลน์ พวกเขาจะไม่สามารถเข้าสู่ระบบในโหมดออฟไลน์ได้ -
เปิดโหมดออฟไลน์ใน Hive คอนโซลภายใต้ App Center > Manage Project > Game Details > Hive Product Settings.
การเข้าสู่ระบบอัตโนมัติบน Windows¶
สภาพแวดล้อม Windows รองรับการเข้าสู่ระบบอัตโนมัติ และสามารถเปิด/ปิดใช้งานได้ใน Hive Console App Center โปรดทราบว่าการเข้าสู่ระบบอัตโนมัติบน Windows ทำงานแตกต่างจากการเข้าสู่ระบบอัตโนมัติสำหรับสภาพแวดล้อมมือถือ ความแตกต่างมีดังนี้:
- ในสภาพแวดล้อมมือถือ ผู้ใช้จะถูกล็อกอินโดยอัตโนมัติ แต่ใน Windows จะถูกล็อกอินต่อเมื่อผู้ใช้เปิดใช้งานช่องทำเครื่องหมาย “จำฉันไว้” (แสดงอยู่ด้านล่างรายการ IdP ใน UI การล็อกอิน) ในกรณีอื่น ๆ สถานะการล็อกอินจะไม่ดำเนินต่อไป
- ในสภาพแวดล้อมมือถือ เมื่อคุณเรียกใช้ AuthV4Helper.Connect และเปลี่ยนเป็นบัญชีอื่น บัญชีที่ล็อกอินใหม่จะถูกล็อกอินโดยอัตโนมัติ แต่ใน Windows จะไม่เป็นเช่นนั้น
การเข้าสู่ระบบโดยอัตโนมัติ¶
AuthV4.Helper.signIn
พยายามเข้าสู่ระบบอัตโนมัติด้วยการใช้กุญแจโทเค็นการตรวจสอบสิทธิ์ของ PlayerID หากกุญแจโทเค็นที่สร้างจากการเข้าสู่ระบบก่อนหน้านี้ไม่มีอยู่ เกมจะเข้าสู่ระบบ Apple Game Center สำหรับ iOS และ Google Play Games สำหรับ Android โดยอัตโนมัติ หากไม่สามารถเข้าสู่ระบบได้ จะมีการแสดงหน้าล็อกอินที่เหมาะสมตามการตอบกลับ
Note
คุณต้องเพิ่มสิทธิ์ Game Center เพื่อใช้การเข้าสู่ระบบอัตโนมัติ หากคุณได้ตรวจสอบการพึ่งพา 'Apple GameCenter' สิทธิ์จะถูกเพิ่มโดยอัตโนมัติผ่าน Unity PostProcess.
Note
ในกรณีที่มีการใช้งานคลาส AuthV4Helper
- หากผู้ใช้ยกเลิกการเข้าสู่ระบบโดยอัตโนมัติไปยัง PGS ขณะโหลดเกม ระบบจะจดจำสถานะและจะไม่พยายามเข้าสู่ระบบโดยอัตโนมัติอีกครั้ง แม้ว่าการเข้าสู่ระบบอัตโนมัติจะมีให้ในขณะที่เซสชันของผู้เล่นยังคงมีผล ระบบจะจดจำสถานะที่ถูกปฏิเสธ
เนื้อหานี้เป็นไปตามแนวทางของบริการเกม Google Play
ต่อไปนี้คือตัวอย่างโค้ดสำหรับการเข้าสู่ระบบอัตโนมัติ
API Reference: hive.AuthV4.Helper.signIn
// พยายาม Hive SDK login (signIn)
AuthV4.Helper.signIn (delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// log-in succeed
} else if (result.needExit()) {
// TODO: implement app exit functionality
// Example) Application.Quit();
} else {
switch(result.code) {
case ResultAPI.Code.AuthV4ConflictPlayer:
// account conflict
break;
case ResultAPI.Code.AuthV4HelperImplifiedLoginFail:
// implicit login failed
// ex) AuthV4.showSignIn(...);
break;
default:
// other exceptions
break;
}
}
});
#include "HiveAuthV4.h"
// พยายาม Hive SDK เข้าสู่ระบบ (signIn)
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
// ผู้ใช้ของเอนจิน Cocos2d-x
// ex) exit(0);
// ผู้ใช้เอนจิน Unreal
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch (Result.Code) {
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// ข้อขัดแย้งบัญชี
break;
case FHiveResultAPI::ECode::AuthV4HelperImplifiedLoginFail:
// การเข้าสู่ระบบโดยนัยล้มเหลว
// ex) AuthV4.showSignIn(...);)
break;
default:
// ข้อยกเว้นอื่น ๆ
break;
}
}
}));
API Reference: Auth4::signIn
// Attempt Hive SDK login (signIn)
AuthV4::Helper::signIn([=](ResultAPI const & result, std::shared\_ptr playerInfo) {
if (result.isSuccess()) {
// log-in succeed
} else if (result.needExit()) {
// TODO: implement app exit functionality
// Users of the Cocos2d-x engine
// ex) exit(0);
// Unreal engine users
// Example) 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: com.hive.Auth4.Helper.signIn
// พยายาม Hive SDK เข้าสู่ระบบ (signIn)
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
// ex) exitProcess(0)
} else {
when (result.code) {
ResultAPI.Code.AuthV4ConflictPlayer -> {
// ข้อขัดแย้งของบัญชี
}
ResultAPI.Code.AuthV4HelperImplifiedLoginFail -> {
// การเข้าสู่ระบบโดยนัยล้มเหลว
// ex) AuthV4.showSignIn(...);
}
else -> {
// ข้อยกเว้นอื่น ๆ
}
}
}
}
})
เอกสารอ้างอิง API: com.hive.Auth4.signIn
// Attempt Hive SDK login (signIn)
AuthV4.Helper.signIn(new AuthV4.Helper.AuthV4HelperListener() {
@Override
public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// log-in succeed
} else if (result.needExit()) {
// TODO: implement app exit functionality
// ex) System.exit(0);
} else {
switch(result.code) {
case AuthV4ConflictPlayer:
// account conflict
break;
case AuthV4HelperImplifiedLoginFail:
// implicit login failed
// ex) AuthV4.showSignIn(...);
break;
default:
// other exceptions
break;
}
}
}
});
เอกสารอ้างอิง API: AuthV4Interface.signIn
// พยายาม Hive SDK login (signIn)
AuthV4Interface.helper().signIn() { (result, playerInfo) in
if result.isSuccess() {
// การเข้าสู่ระบบสำเร็จ
}
else if result.needExit() {
// TODO: implement app exit functionality
// ex) exit(0)
}
else {
switch result.getCode() {
case .authV4ConflictPlayer:
// ข้อขัดแย้งของบัญชี
case .authV4HelperImplifiedLoginFail:
// การเข้าสู่ระบบโดยนัยล้มเหลว
// ex) AuthV4Interface.showSignIn() { (result, playerInfo)
// // ทำบางอย่าง...
// }
default:
// ข้อยกเว้นอื่น ๆ
break
}
}
}
เอกสารอ้างอิง API: HIVEAuth4:signIn
// พยายาม Hive SDK เข้าสู่ระบบ (signIn)
[[HIVEAuthV4 helper] signIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if (result. isSuccess) {
// log-in succeed
}
else if (result. needExit) {
// TODO: implement app exit functionality
// ex) exit(0);
}
else {
switch(result.code) {
case kAuthV4ConflictPlayer:
// account conflict
break;
case kAuthV4HelperImplifiedLoginFail:
// implicit login failed
// ex) [HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
// // do something...
// }];
break;
default:
// other exceptions
break;
}
}
}];
พฤติกรรมการเข้าสู่ระบบโดยอัตโนมัติ: มือถือ¶
บนแพลตฟอร์มมือถือ (Hive SDK Unity Android, ฯลฯ, Android/iOS) การเข้าสู่ระบบโดยอัตโนมัติ (AuthV4.Helper.signIn
) จะทำให้เกิดความขัดแย้งของบัญชีและแสดงกล่องโต้ตอบเพื่อถามผู้ใช้ว่าต้องการเข้าสู่ระบบด้วยบัญชีที่เข้าสู่ระบบล่าสุดหลังจากการเข้าสู่ระบบครั้งแรกหรือไม่
พฤติกรรมการเข้าสู่ระบบโดยปริยาย: PC¶
บนแพลตฟอร์ม PC (Hive SDK Unity Windows, ฯลฯ Windows) การเข้าสู่ระบบโดยอัตโนมัติ (AuthV4.Helper.signIn
) จะเข้าสู่ระบบด้วยบัญชีที่เข้าสู่ระบบล่าสุดหลังจากการเข้าสู่ระบบครั้งแรก โดยไม่ทำให้เกิดความขัดแย้งของบัญชีใด ๆ
การเข้าสู่ระบบที่ชัดเจน¶
การเข้าสู่ระบบแบบชัดเจนหมายถึงกระบวนการที่ผู้ใช้เลือก IdP เพื่อดำเนินการตรวจสอบสิทธิ์ หากผู้เล่นไม่สามารถดำเนินการเข้าสู่ระบบอัตโนมัติและการเข้าสู่ระบบโดยปริยายได้ ให้ดำเนินการเกมเพื่อให้ผู้เล่นไปที่หน้าจอชื่อเกมและดำเนินการเข้าสู่ระบบแบบชัดเจนเมื่อแตะที่ชื่อเกม
การเข้าสู่ระบบแบบชัดเจนประกอบด้วย UI ที่จัดเตรียมโดย Hive SDK หรือ UI ที่ปรับแต่งในเกมด้วยรายการ IdP ที่ส่งกลับหลังจากการเริ่มต้น Hive SDK ที่ใช้ในการตรวจสอบสิทธิ์ หากคุณปรับแต่ง UI โปรดดูที่ การปรับแต่ง UI การเข้าสู่ระบบแบบชัดเจน。
Hive แพลตฟอร์มควบคุมและจัดเตรียมรายการ IdP ตามนโยบายของแต่ละประเทศ ตัวอย่างเช่น Google Play Games, Facebook และ Guest Login ไม่สามารถใช้ได้ในประเทศจีน.
ตัวอย่างหน้าจอการเข้าสู่ระบบแบบชัดเจน¶
UI การเลือก IdP ที่จัดทำโดย Hive SDK
เมื่อทำการ implement ฟังก์ชันด้วย UI ที่จัดเตรียมโดย Hive SDK¶
การเข้าสู่ระบบอัตโนมัติในสภาพแวดล้อม Windows¶
สภาพแวดล้อม Windows ก็รองรับการเข้าสู่ระบบอัตโนมัติ และสามารถเปิด/ปิดการใช้งานได้ที่ Hive คอนโซลแอปเซ็นเตอร์ อย่างไรก็ตาม การเข้าสู่ระบบอัตโนมัติใน Windows จะทำงานแตกต่างจากมือถือ การเข้าสู่ระบบอัตโนมัติใน Windows มีความแตกต่างดังนี้
- ในมือถือ หลังจากเข้าสู่ระบบจะรักษาสถานะการเข้าสู่ระบบโดยอัตโนมัติ แต่ใน Windows จะรักษาสถานะการเข้าสู่ระบบเฉพาะเมื่อผู้ใช้เปิดใช้งานช่องทำเครื่องหมายรักษาการเข้าสู่ระบบ (แสดงที่ด้านล่างของรายการ IdP ใน UI การเข้าสู่ระบบ) เท่านั้น ในสถานการณ์อื่นจะไม่รักษาการเข้าสู่ระบบ
- เมื่อเรียกใช้ AuthV4Helper.Connect ในมือถือ หากเปลี่ยนบัญชีเป็นบัญชีใหม่ บัญชีใหม่จะรักษาสถานะการเข้าสู่ระบบโดยอัตโนมัติ แต่ใน Windows หากเปลี่ยนบัญชีเป็นบัญชีใหม่ บัญชีใหม่จะไม่รักษาสถานะการเข้าสู่ระบบโดยอัตโนมัติ
การเข้าสู่ระบบโดยปริยาย¶
AuthV4.Helper.signIn
พยายามเข้าสู่ระบบอัตโนมัติด้วยคีย์โทเค็นการรับรองความถูกต้องของ PlayerID หากไม่มีคีย์โทเค็นการรับรองความถูกต้องที่เคยเข้าสู่ระบบมาก่อน ในกรณีของ iOS จะเข้าสู่ระบบอัตโนมัติที่ Apple Game Center และในกรณีของ Android จะเข้าสู่ระบบที่ Google Play เกมโดยอัตโนมัติ หากการเข้าสู่ระบบล้มเหลว จะมีการจัดเตรียมหน้าจอเข้าสู่ระบบที่เหมาะสมตามค่าผลลัพธ์
Note
หากต้องการใช้การเข้าสู่ระบบอัตโนมัติ จะต้องเพิ่ม Game Center Entitlement เสมอ หากเลือก 'Apple GameCenter' Dependency จะมีการเพิ่ม Entitlement ที่เกี่ยวข้องโดยอัตโนมัติผ่าน Unity PostProcess
Note
เมื่อใช้คลาส AuthV4Helper
- หากผู้ใช้ที่เล่นเกมปฏิเสธการเข้าสู่ระบบโดยอัตโนมัติในระหว่างการพยายามเข้าสู่ระบบแบบ PGS ระบบจะจดจำและจะไม่พยายามเข้าสู่ระบบโดยอัตโนมัติอีกต่อไป แม้ว่าจะสามารถเข้าสู่ระบบโดยอัตโนมัติได้ในขณะที่เซสชันของผู้เล่นยังคงอยู่ แต่ระบบจะยังคงจดจำสถานะการปฏิเสธการเข้าสู่ระบบโดยอัตโนมัติไว้ ข้อมูลนี้จัดทำขึ้นตามคู่มือ Google Play Games Services
ต่อไปนี้คือตัวอย่างโค้ดที่ทำการเข้าสู่ระบบโดยอัตโนมัติ
API Reference: hive.AuthV4.Helper.signIn
// Hive SDK 로그인(signIn) 시도
AuthV4.Helper.signIn (delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// การเข้าสู่ระบบสำเร็จ
} else if (result.needExit()) {
// TODO: โปรด implement ฟังก์ชันการปิดแอป
// เช่น) Application.Quit();
} else {
switch (result.code) {
case ResultAPI.Code.AuthV4ConflictPlayer:
// ขัดแย้งบัญชี
break;
case ResultAPI.Code.AuthV4HelperImplifiedLoginFail:
// ล้มเหลวในการเข้าสู่ระบบโดยนัย
// ex) AuthV4.showSignIn(...);
break;
default:
// สถานการณ์ข้อยกเว้นอื่น ๆ
break;
}
}
});
#include "HiveAuthV4.h"
// พยายามเข้าสู่ระบบ Hive SDK (signIn)
FHiveAuthV4::Helper::SignIn(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
if (Result.IsSuccess()) {
// เข้าสู่ระบบสำเร็จ
} else if (Result.NeedExit()) {
// TODO: โปรด implement ฟังก์ชันการปิดแอป
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch (Result.Code) {
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// ขัดแย้งบัญชี
break;
case FHiveResultAPI::ECode::AuthV4HelperImplifiedLoginFail:
// ล้มเหลวในการเข้าสู่ระบบโดยปริยาย
// ตัวอย่าง) FHiveAuthV4::ShowSigIn()
break;
default:
// สถานการณ์ข้อยกเว้นอื่น ๆ
break;
}
}
}));
API Reference: Auth4::signIn
// Hive SDK 로그인(signIn) 시도
AuthV4::Helper::signIn([=](ResultAPI const & result, std::shared_ptr playerInfo) {
if (result.isSuccess()) {
// การเข้าสู่ระบบสำเร็จ
} else if (result.needExit()) {
// TODO: โปรด implement ฟังก์ชันการออกจากแอป
// ผู้ใช้ Cocos2d-x
// ตัวอย่าง) exit(0);
// ผู้ใช้ Unreal Engine
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch (result.code) {
case ResultAPI::AuthV4ConflictPlayer:
// ข้อขัดแย้งบัญชี
break;
case ResultAPI::AuthV4HelperImplifiedLoginFail:
// ล้มเหลวในการเข้าสู่ระบบแบบปริยาย
// ex) AuthV4.showSignIn(...);
break;
default:
break;
}
}
});
API Reference: hive.AuthV4.showSignIn
// พยายามเข้าสู่ระบบ Hive SDK (signIn)
AuthV4.Helper.signIn(object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// เข้าสู่ระบบสำเร็จ
} else if (result.needExit()) {
// TODO: โปรด implement ฟังก์ชันการออกจากแอป
// เช่น) exitProcess(0)
} else {
when (result.code) {
ResultAPI.Code.AuthV4ConflictPlayer -> {
// ขัดแย้งบัญชี
}
ResultAPI.Code.AuthV4HelperImplifiedLoginFail -> {
// ล้มเหลวในการเข้าสู่ระบบแบบปริยาย
// ex) AuthV4.showSignIn(...);
}
else -> {
// สถานการณ์ข้อยกเว้นอื่นๆ
}
}
}
}
})
API Reference: com.hive.AuthV4.showSignIn
// Hive SDK AuthV4 인증 UI 요청
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 ฟังก์ชันการปิดแอพ
// ตัวอย่าง) System.exit(0);
}
}
});
API Reference: HIVEAuthV4:signIn
var email = String()
// Hive SDK AuthV4 인증 UI 요청
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 ฟังก์ชันการปิดแอป
// ตัวอย่าง) exit(0)
}
}
API Reference: HIVEAuthV4:signIn
// Hive SDK 로그인(signIn) 시도
[[HIVEAuthV4 helper] signIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if (result.isSuccess) {
// การเข้าสู่ระบบสำเร็จ
}
else if (result.needExit) {
// TODO: โปรด implement ฟังก์ชันการออกจากแอป
// ตัวอย่าง) 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
หากผู้ใช้กดปุ่ม 'X' เพื่อปิด UI การเลือก IdP ที่มีให้ใน SDK จะต้องมีวิธีการในการเข้าสู่ระบบอีกครั้ง ผู้ใช้ยังไม่ได้เข้าสู่ระบบ
Note
หากต้องการปรับแต่งการเข้าสู่ระบบแบบชัดเจน โปรดดูที่ ต่อไปนี้
API Reference: hive.AuthV4.showSignIn
// Hive SDK AuthV4 인증 UI 요청
AuthV4.showSignIn((ResultAPI result, AuthV4.PlayerInfo playerInfo)=>{
if (result.isSuccess()) {
// 인증 성공
// playerInfo : 인증된 사용자 정보
// ตัวอย่างการดึงข้อมูลอีเมล
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
// Example) 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 ฟังก์ชันการปิดแอป
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
}));
API Reference: AuthV4::showSignIn
// Hive SDK AuthV4 인증 UI 요청
AuthV4::showSignIn([=](ResultAPI const & result, PlayerInfo const & playerInfo) {
if (result.isSuccess()) {
// 인증 성공
// playerInfo: 인증된 사용자 정보
// ตัวอย่างการดึงข้อมูลอีเมล
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 ฟังก์ชันการปิดแอป
// ผู้ใช้ Cocos2d-x
// ตัวอย่าง) exit(0);
// ผู้ใช้ Unreal Engine
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
});
เอกสารอ้างอิง API: com.hive.AuthV4.showSignIn
// Hive SDK AuthV4 인증 UI 요청
AuthV4.showSignIn(object : AuthV4.AuthV4SignInListener {
override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// 인증 성공
// playerInfo: 인증된 사용자 정보
// ตัวอย่างการดึงข้อมูลอีเมล
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 ฟังก์ชันการปิดแอป
// ตัวอย่าง) exitProcess(0)
}
}
})
API Reference: com.hive.AuthV4.showSignIn
// Hive SDK AuthV4 인증 UI 요청
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 ฟังก์ชันการปิดแอป
// เช่น) System.exit(0);
}
}
});
API Reference: HIVEAuthV4:showSignIn
var email = String()
// Hive SDK AuthV4 การขอ UI การรับรองความถูกต้อง
AuthV4Interface.showSignIn { (result, playerInfo) in
if result.isSuccess() {
// การรับรองความสำเร็จ
// playerInfo: ข้อมูลผู้ใช้ที่ได้รับการรับรอง
// ตัวอย่างการดึงข้อมูลอีเมล
if let playerInfo = playerInfo {
// ค้นหา providerInfo ที่มี providerEmail (provider ที่กำลังเข้าสู่ระบบอยู่)
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 ฟังก์ชันการปิดแอป
// เช่น) 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 (provider ที่เข้าสู่ระบบอยู่ในขณะนี้)
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 ฟังก์ชันการปิดแอป
// ตัวอย่าง) exit(0);
}
}];
การปรับแต่งการเข้าสู่ระบบที่ชัดเจน¶
UI การปรับแต่งการเข้าสู่ระบบแบบชัดเจนสามารถทำได้โดยใช้ providerTypeList
providerTypeList
เป็นตัวจัดการการตอบกลับที่ส่งคืนเมื่อเรียกใช้เมธอด AuthV4.setup()
เพื่อวัตถุประสงค์ในการเริ่มต้น Hive SDK หรือเมื่อเรียกใช้เมธอด AuthV4.Helper.getIDPList()
หลังจากการเริ่มต้น เมื่อคุณต้องการแสดงหน้าจอเข้าสู่ระบบให้ตรงกับ UI ของเกมหรือแสดงเฉพาะการเชื่อมต่อกับ IdP เฉพาะ คุณสามารถใช้ฟังก์ชันนี้ หลังจากที่คุณได้สร้าง UI การปรับแต่งแล้ว ให้เรียกใช้เมธอด signIn()
ด้วย ProviderType ที่ต้องการตามการกระทำของผู้ใช้เพื่อดำเนินการเข้าสู่ระบบ
Note
- เมื่อสร้างปุ่มเข้าสู่ระบบ ควรอ้างอิงจากแนวทางการออกแบบที่แต่ละ IdP ให้มา
- Game Center: ไม่มีข้อกำหนดเฉพาะ
- Google Play Games: แนวทางการสร้างแบรนด์
- Google: แนวทางการสร้างแบรนด์
- Hive Membership: แนวทาง Hive BI
- Facebook: ศูนย์ทรัพยากรแบรนด์
- QQ: นโยบายและข้อกำหนด
- WeChat: แบรนด์หลัก & แนวทาง
- VK: VK Brandbook
- Apple: แนวทางการออกแบบส่วนติดต่อผู้ใช้
- LINE: แนวทางการออกแบบปุ่มเข้าสู่ระบบ LINE
- Huawei: ข้อกำหนดไอคอน HUAWEI ID
- Steam: แนวทางการสร้างแบรนด์ Steam
- X: ชุดเครื่องมือแบรนด์ X
- ใน Google Featured การปฏิบัติตามแนวทางปุ่ม Google Sign-in เป็นสิ่งสำคัญ
- ชื่อปุ่มเข้าสู่ระบบหลายภาษาที่ใช้ใน Hive Authentication สามารถดูได้ที่ ที่นี่
- ตัวอย่างภาพหน้าจอ 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 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.INSTANCE.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) เพื่อเตรียมความพร้อมสำหรับการใช้ความสำเร็จหรือกระดานผู้นำในอนาคต เราจะให้ข้อความแนะนำเพื่อรวมบัญชีทั้งสองบัญชีให้เป็นหนึ่งเดียว
ต่อไปนี้คือตัวอย่างโค้ดในการตรวจสอบข้อมูล 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.INSTANCE.syncAccount
import com.hive.AuthV4;
import com.hive.ResultAPI;
AuthV4.ProviderType providerType = AuthV4.ProviderType.GOOGLE;
AuthV4.Helper.INSTANCE.syncAccount(providerType, (result, playerInfo) -> {
switch (result.getCode()) {
case Success:
// ปกติ
break;
case AuthV4ConflictPlayer:
// ข้อขัดแย้งบัญชี
// ex) เมื่อใช้ Hive UI
// AuthV4.Helper.INSTANCE.showConflict(...);
// หรือ
// ex) เมื่อใช้ GameUI
// AuthV4.Helper.INSTANCE.resolverConflict(...);// เมื่อเลือกผู้ใช้ปัจจุบัน
// AuthV4.Helper.INSTANCE.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) เมื่อทำการ implement GameUI
// [[HIVEAuthV4 helper] resolverConflict:...];// เมื่อเลือกผู้ใช้ปัจจุบัน
// [[HIVEAuthV4 helper] switchAccount:...];// เมื่อเลือกเปลี่ยนผู้ใช้
break;
default:
// สถานการณ์ข้อยกเว้นอื่นๆ
break;
}
}];
การเข้าสู่ระบบแขก¶
ฟีเจอร์การเข้าสู่ระบบแขกช่วยให้ผู้ใช้สามารถเล่นเกมในสถานะแขกโดยไม่ต้องเลือก IdP ผู้ใช้สามารถเลือกแขกจาก UI การเข้าสู่ระบบที่ชัดเจนซึ่งให้โดย Hive SDK หรือสามารถปรับแต่งในเกมเพื่อดำเนินการเข้าสู่ระบบแขกได้ด้วยตนเอง สภาพแวดล้อม Windows ไม่รองรับการเข้าสู่ระบบแขก
เมื่อเข้าสู่ระบบในฐานะแขก จะต้องปฏิบัติตามนโยบายต่อไปนี้
นโยบายการเข้าสู่ระบบของแขก¶
- โปรด implement ให้ผู้ใช้ที่ยืนยันตัวตนด้วย IdP และผู้ใช้แขกสามารถใช้เกมได้เหมือนกันทั้งหมด. ผู้ใช้ที่เข้าสู่ระบบเป็นแขกสามารถใช้ฟังก์ชันส่วนใหญ่ของแพลตฟอร์ม Hive ได้ ดังนั้นโปรด implement ให้ผู้ใช้ที่เข้าสู่ระบบเป็นแขกสามารถใช้เกมได้เหมือนกับผู้ใช้ที่เชื่อมต่อกับ IdP ตัวอย่างเช่น ผู้ใช้แขกควรสามารถซื้อไอเทมและชำระเงินในเกมได้.
- อย่าให้ฟังก์ชันออกจากระบบแก่ผู้ใช้แขก. หากผู้ใช้ออกจากระบบหลังจากเข้าสู่ระบบเป็นแขก จะไม่สามารถเข้าสู่ระบบด้วย PlayerID เดิมได้อีก ดังนั้นเมื่อผู้ใช้เข้าสู่ระบบเป็นแขก โปรดอย่าให้ปุ่มออกจากระบบเพื่อไม่ให้ผู้ใช้สามารถออกจากระบบได้.
- นโยบายห้ามเข้าสู่ระบบแขกจากประเทศจีน เมื่อใช้ IP ของจีน ผู้ใช้ที่ผ่านการยืนยันตัวตนเท่านั้นที่สามารถใช้บริการเติมเงินและใช้จ่ายได้ (เริ่มตั้งแต่ 17. 5. 1) ดังนั้นการเข้าสู่ระบบเป็นแขกในรายการ IdP ที่สามารถเข้าสู่ระบบด้วย IP ของจีนจะไม่รวมอยู่ด้วย.
เพื่อทำการเข้าสู่ระบบแขก ให้เรียกใช้เมธอด signIn()
โดยใช้พารามิเตอร์ ProviderType.GUEST
。 ต่อไปนี้คือตัวอย่างโค้ดสำหรับการเข้าสู่ระบบแขก
Note
สถานะผู้เล่นที่ไม่มีการรับรอง IdP ใด ๆ จะไม่มี providerInfoData ใน playerInfo
API Reference: hive.AuthV4.signIn
API Reference: Auth4::signIn
API Reference: AuthV4.signIn
API Reference: com.hive.Auth4.signIn
API Reference: AuthV4Interface.signIn
API Reference: HIVEAuth4:signIn
การเข้าสู่ระบบแบบกำหนดเอง¶
การเข้าสู่ระบบแบบกำหนดเอง เป็นฟังก์ชัน การเข้าสู่ระบบแบบกำหนดเอง ที่สามารถทำการเข้าสู่ระบบด้วย IdP ที่เชื่อมต่อจากเกมเอง นอกเหนือจาก IdP ที่ Hive ให้บริการ ลองสร้างคีย์การรับรองความถูกต้อง (authKey) ที่จะใช้เมื่อเรียก API การเข้าสู่ระบบแบบกำหนดเองตาม การรับรองความถูกต้อง v4 การรับรองความถูกต้องแบบกำหนดเอง ดูนะคะ
หลังจากเรียกใช้ API การเข้าสู่ระบบแบบกำหนดเอง คุณสามารถเข้าถึงข้อมูลของผู้ใช้ที่เข้าสู่ระบบแบบกำหนดเองได้โดยใช้อินสแตนซ์ของคลาส PlayerInfo ที่ได้รับจากการเรียกกลับ customProviderInfoData
ข้อมูล ProviderType(enum) ของ customProviderInfoData
จะถูกตั้งค่าเป็น CUSTOM
เหมือนกันทั้งหมด และสามารถแยกแยะได้โดยใช้ ProviderName(String)
ข้อมูลของ IdP ที่ได้มีการดำเนินการเข้าสู่ระบบแบบกำหนดเองในเกมจะไม่รวมอยู่ในผลลัพธ์ของการเรียกใช้เมธอด setup()
และ showSignIn()
ของคลาส AuthV4
หากได้รับ playerId> และ playerToke หลังจากการดำเนินการเข้าสู่ระบบแบบกำหนดเองครั้งแรก การเรียกใช้ API การเข้าสู่ระบบแบบกำหนดเองอีกครั้งจะส่งผลลัพธ์ API ของ authV4SessionExist(code)
กลับมาใน callback ในกรณีนี้จะต้องเรียกใช้ signIn()
โดยใช้ ProviderType.Auto
เป็นพารามิเตอร์เพื่อดำเนินการเข้าสู่ระบบอัตโนมัติด้วยบัญชีที่เข้าสู่ระบบอยู่แล้ว โปรดดูตัวอย่างโค้ดด้านล่าง
เมธอด connect()
และ disconnect()
ของคลาส AuthV4
ไม่สนับสนุนการเชื่อมต่อและยกเลิกการเชื่อมต่อเพิ่มเติมของ IdP การเข้าสู่ระบบแบบกำหนดเอง สนับสนุนการเชื่อมต่อและยกเลิกการเชื่อมต่อเพิ่มเติมของ IdP การเข้าสู่ระบบแบบกำหนดเองด้วยเมธอด connectWithAuthKey()
และ disconnectWithName()
ตัวอย่างโค้ดสำหรับการสร้างการเข้าสู่ระบบแบบกำหนดเอง
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, คัสตอมจะมี Type ที่คงที่จึงต้องแยกด้วย 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: กรุณาสร้างฟังก์ชันการปิดแอป
// ตัวอย่าง) 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, คัสตอมจะมีประเภทที่คงที่
FString ProviderName = ProviderInfo->ProviderName; // ต้องแยกตาม ProviderName
FString ProviderUserId = ProviderInfo->ProviderUserId; // user id ที่ใช้ในการเข้าสู่ระบบ Twitter ที่พัฒนาขึ้นเอง
}
} else if (Result.NeedExit()) {
// TODO: โปรด implement ฟังก์ชันการปิดแอป
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else if (Result.Code == FHiveResultAPI::ECode::AuthV4SessionExist) {
// ในกรณีที่ playerId และ playerToken ได้รับการออกแล้วและต้องการเข้าสู่ระบบอัตโนมัติ
// TODO: FHiveAuthV4.SignIn(EHiveProviderType::GUEST, Delegate);
} else if (Result.Code == FHiveResultAPI::ECode::AuthV4NotInitialized) {
// TODO: ต้องการการเริ่มต้น SDK
} else if (Result.Code == FHiveResultAPI::ECode::AuthV4InvalidParam) {
// TODO: ต้องตรวจสอบว่าค่าของ authKey ที่ส่งไปนั้นว่างเปล่าหรือไม่
}
}));
}
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, คัสตอมจะมี Type ที่คงที่จึงต้องแยกตาม 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 Engine
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
});
});
API Reference: com.hive.Auth4.signIn
// เกมที่มีการทำงานร่วมกับ Twitter Login โดยตรง
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, คัสตอมจะมี Type ที่คงที่จึงต้องแยกด้วย providerName
providerInfo.providerName // "CUSTOM_TWITTER"
providerInfo.providerUserId // user id ที่ใช้ในการเข้าสู่ระบบ Twitter ที่พัฒนาขึ้นเอง
}
}
else if (result.needExit()) {
// TODO: กรุณา implement ฟังก์ชันการปิดแอป
// เช่น) exitProcess(0)
}
else if (result.code == ResultAPI.Code.AuthV4SessionExist) {
// กรณีที่ playerId และ playerToken ได้รับการออกแล้วและต้องการเข้าสู่ระบบอัตโนมัติ
// TODO: AuthV4.signIn(AuthV4.ProviderType.AUTO, authV4SignInListener)
}
else if (result.code == ResultAPI.Code.AuthV4NotInitialized) {
// TODO: จำเป็นต้องทำการ initialize SDK
}
else if (result.code == ResultAPI.Code.AuthV4InvalidParam) {
// TODO: กรุณาตรวจสอบว่าค่าของ authKey ที่ส่งมานั้นเป็น NULL หรือมีค่าเป็นค่าว่าง
}
}
})
}
API Reference: com.hive.Auth4.signIn
// การเข้าสู่ระบบ Twitter ที่สร้างขึ้นโดยตรงในเกม
Game.Login("CUSTOM_TWITTER") { authKey: String ->
AuthV4.INSTANCE.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 ฟังก์ชันการปิดแอป
// ตัวอย่าง) 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: โปรด implement ฟังก์ชันการออกจากแอป
// ตัวอย่าง) exit(0)
}
}
}
API Reference: HIVEAuth4:signIn
// การเข้าสู่ระบบ Twitter ที่สร้างขึ้นโดยตรงในเกม
[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: กรุณา implement ฟังก์ชันการออกจากแอป
// เช่น) exit(0);
}
}];
}];
ชื่อผู้ใช้¶
เนื่องจากปัญหาต่างๆ เช่น COPPA ในสหรัฐอเมริกา ผู้ใช้จะต้องกรอกชื่อผู้ใช้เพื่อให้สามารถดำเนินการตรวจสอบเพิ่มเติมสำหรับการระบุผู้ใช้เมื่อเข้าสู่ระบบผ่าน IdP ในสหรัฐอเมริกาและดินแดนของสหรัฐอเมริกา โดยประเทศที่รวมอยู่ในดินแดนของสหรัฐอเมริกาคือ อเมริกันซามัว (AS), กวม (GU), หมู่เกาะนอร์เทิร์นมาเรียนา (MP), เปอร์โตริโก (PR), หมู่เกาะเล็กๆ ของสหรัฐอเมริกา (UM), และหมู่เกาะเวอร์จินของสหรัฐอเมริกา (VI) หน้าจอการกรอกชื่อผู้ใช้สำหรับการระบุผู้ใช้มีดังนี้
- หน้าจอกรอกชื่อผู้ใช้จะถูกใช้เพื่อการระบุผู้ใช้เท่านั้น ดังนั้นจะปรากฏเพียงครั้งเดียวเมื่อเชื่อมต่อกับ IdP เป็นครั้งแรก และจะไม่ปรากฏในภายหลัง
- ในกรณีที่เข้าสู่ระบบเป็นแขก หน้าจอกรอกชื่อผู้ใช้จะไม่ปรากฏ
การตรวจสอบความถูกต้องของคีย์โทเค็น¶
เซิร์ฟเวอร์เกมสามารถตรวจสอบความถูกต้องของคีย์โทเค็นโดยใช้ Token, playerId, และข้อมูล DID ที่ส่งคืนหลังจากการเข้าสู่ระบบสำเร็จ ในการรับรองความถูกต้องของ Hive จะอนุญาตให้เข้าสู่ระบบหลายอุปกรณ์และการเข้าถึงซ้ำได้
หากไม่อนุญาตให้เข้าถึงด้วยบัญชีเดียวกันซ้ำกัน เซิร์ฟเวอร์เกมจะแสดงข้อความแจ้งเตือนบนอุปกรณ์ที่เชื่อมต่อก่อน จากนั้นจะปิดเกมและจัดการให้เกมยังคงอยู่บนอุปกรณ์ที่เชื่อมต่อทีหลัง ในกรณีนี้ หากเข้าถึงซ้ำโดยไม่ปิดเกม อาจทำให้บันทึกการเล่นเกมไม่ถูกต้องได้ ฟังก์ชันนี้ต้องการการจัดการคีย์โทเค็นที่ผ่านการตรวจสอบแล้ว หรือจัดการเซสชันคีย์ของเกมที่ใช้โทเค็นนั้นเพื่อดำเนินการ
โปรดดูที่ Server API สำหรับการตรวจสอบความถูกต้องของโทเค็นการรับรอง เพื่อดำเนินการฟังก์ชันนี้
การรับโทเค็นการเข้าสู่ระบบ TalkPlus¶
ใช้โทเค็นการเข้าสู่ระบบที่ได้รับจากการเรียก API AuthV4.getHiveTalkPlusLoginToken หลังจากที่เรียกใช้ signIn()
ผ่านอินเทอร์เฟซการรับรอง v4 ในการเข้าสู่ระบบ Hive TalkPlus
Note
โปรดดูที่ คู่มือการเข้าสู่ระบบ Hive TalkPlus ที่เกี่ยวข้อง
การตรวจจับการเปลี่ยนแปลงบัญชี IdP ในพื้นหลัง¶
ผู้ใช้สามารถเปลี่ยนบัญชี Apple Game Center หรือ Google Play Games โดยไปที่การตั้งค่าอุปกรณ์ขณะเล่นเกม หากต้องการตรวจสอบว่าบัญชี IdP ในขณะเล่นเกมแตกต่างจากบัญชี IdP ปัจจุบันของ PlayerID หรือไม่ ให้เรียกใช้ setProviderChangedListener()
หลังจากการเริ่มต้น SDK การเรียกใช้ API นี้จะทำให้คุณได้รับเหตุการณ์ว่าบัญชี IdP ที่ตั้งค่าในอุปกรณ์ได้เปลี่ยนแปลงเมื่อเกมกลับมาทำงานอีกครั้ง
iOS จะทำงานเมื่อบัญชี Apple Game Center เปลี่ยนแปลง และ Android จะทำงานเมื่อบัญชี Google Play เกมเปลี่ยนแปลง โดยจะส่งการตอบกลับเฉพาะเมื่อ PlayerID ที่เข้าสู่ระบบอยู่ในขณะนี้เชื่อมโยงกับ IdP นั้น ๆ หากได้รับเหตุการณ์การเปลี่ยนแปลงบัญชี IdP จะมีการจัด UI เพื่อให้ผู้ใช้เลือกว่าจะใช้บัญชี IdP ที่เข้าสู่ระบบในอุปกรณ์หรือไม่ หากผู้ใช้เลือกบัญชี IdP ที่เข้าสู่ระบบในอุปกรณ์ จะมีการเรียก signOut
เพื่อออกจากระบบก่อน จากนั้นจะดำเนินการเข้าสู่ระบบโดยอัตโนมัติ
Warning
อุปกรณ์ที่ติดตั้งเกม Google Play ที่วางจำหน่ายตั้งแต่เดือนกรกฎาคม 2021 จะไม่สามารถเปลี่ยนบัญชี IdP ในพื้นหลังได้เนื่องจากปัญหาการทำงานของเกม Google Play
Note
ฟีเจอร์นี้อาจทำให้การเล่นเกมหยุดชะงักและมีการขอให้เปลี่ยนบัญชี และสามารถใช้ได้เฉพาะในช่วงเวลาที่ต้องการการซิงค์บัญชี เช่น การเข้าล็อบบี้หรือเข้าร้านค้าเท่านั้น
ต่อไปนี้คือตัวอย่างโค้ดที่ตั้งค่าให้ผู้ใช้ได้รับเหตุการณ์เมื่อเริ่มเกมใหม่และบัญชี IdP ที่ตั้งค่าในอุปกรณ์มีการเปลี่ยนแปลง
API Reference: hive.AuthV4.setProviderChangedListener
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 Game Service
}
});
API Reference: 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 Game Service
}
}
})
API Reference: com.hive.AuthV4.setProviderChangedListener
API Reference: AuthV4Interface.setProviderChangedListener
API Reference: HIVEAuthV4:setProviderChangedListener
การรีเซ็ตข้อมูลเกม¶
โปรดอย่าลงชื่อออกเมื่อรีเซ็ตข้อมูลเกม เนื่องจาก PlayerID จะไม่ถูกลบ อาจเกิดความขัดแย้งระหว่างบัญชีได้ คุณควรทำให้ผู้ใช้สามารถเล่นต่อได้ด้วยบัญชีที่ล็อกอินอยู่ในปัจจุบัน ดังนั้นจึงไม่ควรเรียกใช้การลงชื่อออกจนกว่าผู้ใช้จะร้องขออย่างชัดเจน
ออกจากระบบ¶
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 ผู้ใช้แบบเกสต์จะได้รับรหัสข้อผิดพลาดเมื่อออกจากระบบ จากนั้นเซสชันของไคลเอนต์และเซิร์ฟเวอร์จะถูกเก็บรักษา
- SDK จะรักษาขอบเขตของค่าที่ตั้งค่าโดยเมธอดที่เริ่มต้นด้วย set ไว้ภายในวงจรชีวิตของแอปพลิเคชัน ไม่ว่าจะอยู่ในสถานะล็อกอินหรือล็อกเอาท์
หากคุณได้ทำการเข้าสู่ระบบ Hive แล้ว จะมีการออก PlayerID และกุญแจโทเค็นการรับรองสถานะ ฟังก์ชันการออกจากระบบคือการรีเซ็ต PlayerID และกุญแจโทเค็นการรับรองสถานะ เมื่อคุณเรียกใช้เมธอด signOut()
เพื่อทำการออกจากระบบ จะย้ายไปยังชื่อเกม และเมื่อคลิกที่ชื่อ จะทำการเข้าสู่ระบบอย่างชัดเจน
Note
- เมื่อออกจากระบบในสถานะผู้ใช้ทั่วไป จะไม่สามารถค้นหา PlayerID เดิมได้อีก ดังนั้นโปรดอย่าให้มีการออกจากระบบในสถานะผู้ใช้ทั่วไป
- การออกจากระบบจะไม่เปลี่ยนแปลงสถานะการเชื่อมต่อ IdP ของ PlayerID
- เมื่อการออกจากระบบเสร็จสิ้น จะถูกนำไปยังชื่อเกม และเมื่อคลิกที่ชื่อ จะทำการเข้าสู่ระบบอย่างชัดเจน
- หลังจากออกจากระบบและเริ่มแอปใหม่ จะทำการเข้าสู่ระบบโดยปริยายก่อน
ต่อไปนี้คือตัวอย่างโค้ดที่ใช้ในการออกจากระบบ
API Reference: hive.AuthV4.signOut
#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:
// 로그아웃 성공
break;
default:
// 기타 예외 상황
break;
}
}));
API Reference: AuthV4::signOut
API Reference: 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.INSTANCE.signOut
เอกสาร API: AuthV4Interface.helper().signOut()
เอกสารอ้างอิง API: [HIVEAuthV4 helper] signOut
คำแนะนำการยกเลิก Game Center¶
ภาษา | ข้อความ |
---|---|
เกาหลี | Apple Game Center 로그인이 취소되었습니다. Game Center 계정과 연동하려면 [설정 >; Game Center]에서 로그인한 후 다시 시도해주세요. |
อังกฤษ | Your login to the Game Center has been canceled. Log in at [Settings >; Game Center] to sync to the Game Center Account and try again. |
ญี่ปุ่น | Apple Game Center ログインがキャンセルされました。 Game Center アカウントと連動するには [設定 >; Game Center] にログインした後、再度お試しください。 |
จีน (แบบย่อ) | Apple Game Center已退出登录。 若想与Game Center账号同步,请在设备[设置 >; Game Center]中重新登录后再试。 |
จีน (แบบดั้งเดิม) | 登入Apple Game Center已取消。 若想連動Game Center帳號,請至[設定 >; Game Center]登入後,再試一次。 |
ฝรั่งเศส | Ta connexion au Game Center a été annulée. Connecte-toi dans [Réglages >; Game Center] pour synchroniser ton compte Game Center et essaie de nouveau. |
เยอรมัน | Das Einloggen ins Apple Game Center wurde abgebrochen. Die Synchronisation mit dem Game Center-Konto läuft über [Einstellungen >; Game Center]. Logge dich ein und versuche es erneut. |
รัสเซีย | Ваш авторизация в Game Center была отменена. Авторизуйтесь в Game Center через [Настройки >; Game Center] и повторите попытку. |
สเปน | Tu Inicio de Sesión en Game Center ha sido cancelado. Inicia Sesión en [Configuración >; Game Center] para sincronizar a la Cuenta de Game Center, e inténtalo de nuevo. |
โปรตุเกส | O seu login no Game Center foi cancelado. Faça o login em [Configurações >; Game Center] para sincronizar com a Conta do Game Center e tente novamente. |
อินโดนีเซีย | Login ke Apple Game Center telah dibatalkan. Hubungkan akun Game Center dengan login di [Pengaturan >; Game Center] dan coba lagi. |
มาเลเซีย | Log masuk ke Game Center anda telah dibatalkan. Log masuk di [Tetapan >; Game Center] untuk disegerakkan ke Akaun Game Center dan cuba lagi. |
เวียดนาม | Đã hủy bỏ đăng nhập vào Apple Game Center. Đăng nhập tại [Cài đặt >; Game Center] để đồng bộ với tài khoản Game Center và thử lại. |
ไทย | การล็อกอินเข้า Game Center ของคุณถูกยกเลิก ล็อกอินที่ [การตั้งค่า >; Game Center] เพื่อเชื่อมต่อบัญชี Game Center และโปรดลองอีกครั้ง |
อิตาลี | L'accesso all'Apple Game Center è stato annullato. Fai log-in su [Impostazioni >; Game Center] per sincronizzare il tuo account con il Game Center e riprova. |
ตุรกี | Apple Oyun Merkezine girişiniz iptal edilmiştir. Oyun Merkezi Hesabına ulaşmak için [Ayarlar >; Oyun Merkezi]'nden giriş yapın ve tekrar deneyin. |
อาหรับ | تم إلغاء تسجيل الدخول إلى مركز الألعاب. سجل الدخول إلى [الإعدادات >; مركز الألعاب] للمزامنة مع حساب مركز الألعاب وحاول مرة أخرى. |