เข้าสู่ระบบและออกจากระบบ
เข้าสู่ระบบ ออกจากระบบ¶
Note
- ผู้ช่วยถูกจัดเตรียมพร้อมกับ SDK v4.7.0 หากต้องการใช้เวอร์ชันก่อน SDK 4.7.0 โปรดดูที่หน้านี้
- สำหรับคำอธิบายเพิ่มเติมเกี่ยวกับ AuthV4.Helper โปรดดูที่หน้า Authentication
เข้าสู่ระบบ¶
การเข้าสู่ระบบในการตรวจสอบสิทธิ์ประกอบด้วยขั้นตอนดังต่อไปนี้
- การเข้าสู่ระบบอัตโนมัติและการเข้าสู่ระบบโดยปริยาย
- การเข้าสู่ระบบแบบชัดเจน
- การตรวจสอบบัญชี IdP ที่เข้าสู่ระบบบนอุปกรณ์
- การเข้าสู่ระบบแบบแขก
Authv4Helper ทำงานบางส่วนของกระบวนการเข้าสู่ระบบ และระบุหน้าที่เหมาะสมตามการตอบกลับ.
โปรดดูหมายเหตุต่อไปนี้เพื่อดำเนินการฟังก์ชันการเข้าสู่ระบบ
Note
แอปเปิลไม่สนับสนุน Apple Game Center และการซื้อในแอปสำหรับ iOS Enterprise Builds ดังนั้นจึงไม่สามารถใช้การเข้าสู่ระบบโดยอัตโนมัติด้วยบัญชี Apple Game Center ใน iOS Enterprise Build และไม่สามารถใช้ Apple Game Center ในสถานะการเข้าสู่ระบบที่ชัดเจนได้
Note
-
การเข้าสู่ระบบโดยอัตโนมัติไม่สามารถใช้ได้สำหรับ Google Build หากเป้าหมายของเกมของคุณคือเด็กอายุต่ำกว่า 13 ปี เนื่องจากบริการ Google Play Games ไม่สามารถนำไปใช้ได้ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ Quality Checklist for Google Play Games Services.
-
ตรวจสอบให้แน่ใจว่าคุณประมวลผลการเข้าสู่ระบบโดยปริยายของ Google Play Games เฉพาะเมื่อผู้ใช้เข้าสู่ระบบเกมของคุณเป็นครั้งแรกเท่านั้น สำหรับข้อมูลเพิ่มเติม โปรดดูที่ 1.5 จำไว้ว่าผู้เล่นปฏิเสธการเข้าสู่ระบบ ในคู่มือพัฒนาของ Google.
Note
- ในประเทศจีน การเข้าสู่ระบบโดยอัตโนมัติไม่สามารถใช้ได้บน Android เนื่องจาก Google Play Games ถูกห้ามในประเทศ
- Facebook ไม่รวมอยู่ในรายการ IdP เนื่องจาก Facebook ไม่สามารถใช้ได้ในประเทศจีน
- หากผู้ใช้เข้าถึงเกมด้วย IP ของจีน จะมีเพียงสมาชิกที่ได้รับอนุญาตเท่านั้นที่สามารถเติมเงินในเกมหรือซื้อไอเทม (เริ่มตั้งแต่วันที่ 1 พฤษภาคม 2017) ดังนั้น ใน IP ของจีน การเข้าสู่ระบบแบบผู้เยี่ยมชมจึงถูกตัดออกจากรายการ IdP ที่สามารถเข้าสู่ระบบได้
Note
iOS ไม่แสดงหน้าจอเข้าสู่ระบบเมื่อการลงชื่อเข้าใช้ Apple Game Center ถูกยกเลิก ดังนั้น ข้อความการแจ้งเตือนสามารถแสดงได้โดยการใช้วิธี showGameCenterLoginCancelDialog()
ในคลาส AuthV4Helper
โดยตรงจาก SDK หรือโดยสตูดิโอเกม ในกรณีที่ผลลัพธ์ของการเรียกกลับจาก AuthV4.signIn(AuthV4.ProviderType.APPLE, ...)
และจาก AuthV4.connect(AuthV4.ProviderType.APPLE, ...)
เป็น Cancel, ข้อความการแจ้งเตือนสำหรับการปิดการลงชื่อเข้าใช้ Game Center จะพร้อมใช้งาน ให้ข้อความเพื่อแนะนำผู้ใช้ว่าจะแซงค์ข้อมูลกับบัญชี Game Center อีกครั้งได้อย่างไร
Note
หากมีการพยายามเข้าสู่ระบบด้วย Apple โดยไม่มีการเข้าสู่ระบบด้วย Apple ID บนอุปกรณ์ของผู้ใช้ จะเกิดข้อผิดพลาด AuthV4SignInAppleUnknown ขณะเรียกใช้วิธี connect()
และ signIn()
ในคลาส AuthV4Helper ในกรณีนี้ จะมีป๊อปอัพแจ้งเตือนสำหรับการเข้าสู่ระบบด้วย Apple ID ที่แสดงขึ้นโดยอัตโนมัติ ดังนั้น สตูดิโอเกมจึงไม่มีสิ่งใดที่จะเรียกใช้
การเข้าสู่ระบบอัตโนมัติและการเข้าสู่ระบบโดยนัย¶
การเข้าสู่ระบบอัตโนมัติ¶
การเข้าสู่ระบบโดยอัตโนมัติเป็นวิธีการที่ผู้ใช้ไม่เลือกวิธีการเข้าสู่ระบบ แต่เข้าสู่ระบบบัญชี Apple Game Center บน iOS หรือบัญชี Google Play Games บน Android โดยอัตโนมัติ ให้ดำเนินการเข้าสู่ระบบโดยอัตโนมัติหลังจากที่การเข้าสู่ระบบอัตโนมัติล้มเหลว
โหมดออฟไลน์¶
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 Console ที่ 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
ในกรณีที่มีการใช้งานคลาส AuthV4Helper
- หากผู้ใช้ยกเลิกการเข้าสู่ระบบโดยอัตโนมัติไปยัง PGS ขณะโหลดเกม ระบบจะจดจำสถานะและจะไม่พยายามเข้าสู่ระบบโดยอัตโนมัติอีก แม้ว่าการเข้าสู่ระบบอัตโนมัติจะสามารถใช้ได้ในขณะที่เซสชันของผู้เล่นยังไม่หมดอายุ ระบบจะจดจำสถานะที่ถูกปฏิเสธ
เนื้อหานี้เป็นไปตามคู่มือบริการเกมของ Google Play
ต่อไปนี้คือตัวอย่างโค้ดในการดำเนินการเข้าสู่ระบบอัตโนมัติ
API Reference: hive.AuthV4.Helper.signIn
// พยายาม Hive SDK เข้าสู่ระบบ (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 engine
// ex) exit(0);
// ผู้ใช้ Unreal engine
// ตัวอย่าง) 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 เข้าสู่ระบบ (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¶
ในการดำเนินการเข้าสู่ระบบแบบชัดเจนด้วย UI ที่ให้โดย Hive SDK คุณสามารถแสดง UI รายการ IdP โดยการเรียกใช้วิธีการ showSignIn()
Note
ตรวจสอบให้แน่ใจว่าได้จัดเตรียมวิธีการลงชื่อเข้าใช้อีกครั้งหลังจากที่ผู้ใช้แตะปุ่ม X เพื่อปิดใน UI การเลือก IdP ที่จัดเตรียมโดย SDK เนื่องจากผู้ใช้ยังไม่ได้เข้าสู่ระบบ
Note
หากคุณต้องการปรับแต่งการเข้าสู่ระบบแบบชัดเจน โปรดดู ที่นี่.
API Reference: hive.AuthV4.showSignIn
<code>
// Request Hive SDK AuthV4 Authentication UI
AuthV4.showSignIn((ResultAPI result, AuthV4.PlayerInfo playerInfo)=>{
if (result.isSuccess()) {
// authentication success
// playerInfo : Authenticated user information
// the example of getting email 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 termination of the app
// Example) Application.Quit();
}
});
#include "HiveAuthV4.h"
// ขอ Hive SDK AuthV4 การตรวจสอบสิทธิ์ UI
FHiveAuthV4::ShowSignIn(FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
if (Result.IsSuccess()) {
// การตรวจสอบสิทธิ์สำเร็จ
// ตัวอย่างการดึงข้อมูลอีเมล
for (const auto& ProviderInfoEntry : PlayerInfo.ProviderInfoData) {
FHiveProviderInfo ProviderInfo = ProviderInfoEntry.Value;
FString Email = ProviderInfo.ProviderEmail;
}
} else if (Result.NeedExit()) {
// TODO: Implement the termination of the app
// ผู้ใช้ของเอนจิน Cocos2d-x
// ex) exit(0);
// ผู้ใช้เอนจิน Unreal
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
}));
API Reference: AuthV4::showSignIn
// ขอ Hive SDK AuthV4 Authentication 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 the termination of the app
// ผู้ใช้ของเอนจิน Cocos2d-x
// ex) exit(0);
// ผู้ใช้เอนจิน Unreal
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
});
API Reference: com.hive.AuthV4.showSignIn
// ขอ Hive SDK AuthV4 Authentication 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 the termination of the app
// ex) exitProcess(0)
}
}
})
API Reference: com.hive.AuthV4.showSignIn
// ขอ Hive SDK AuthV4 Authentication 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 the termination of the app
// ตัวอย่าง) System.exit(0);
}
}
});
API Reference: HIVEAuthV4:showSignIn
var email = String()
// Request Hive SDK AuthV4 Authentication 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 the termination of the app
// ex) exit(0)
}
}
API Reference: HIVEAuthV4:showSignIn
__block NSString* email = @"";
// Request Hive SDK AuthV4 Authentication UI
[HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if([result isSuccess]){
// authentication success
// playerInfo: Authenticated user information
// the example of getting email information
if(playerInfo != nil) {
// find providerInfo that the providerEmail exists (the provider of the current sign-in)
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 the termination of the app
// Example) exit(0);
}
}];
การปรับแต่ง UI การเข้าสู่ระบบแบบชัดเจน¶
คุณสามารถสร้าง UI ที่กำหนดเองสำหรับการเข้าสู่ระบบแบบชัดเจนโดยใช้ providerTypeList
ซึ่งจะถูกส่งกลับเป็นตัวจัดการ callback ของเมธอด AuthV4.setup()
ที่เรียกใช้สำหรับการเริ่มต้น SDK ของ Hive หรือเมธอด AuthV4.Helper.getIDPList()
ที่เรียกใช้หลังจากการเริ่มต้น SDK ของ Hive การปรับแต่ง UI การเข้าสู่ระบบแบบชัดเจนจะถูกใช้เมื่อคุณต้องการแสดงหน้าจอการเข้าสู่ระบบตาม UI ของเกม หรือแสดงตัวเลือกการเชื่อมโยงกับ IdP ที่เฉพาะเจาะจงเท่านั้น หลังจากออกแบบ UI แล้ว ให้เรียกใช้เมธอด signIn()
พร้อมกับ ProviderType ที่ต้องการตามการกระทำของผู้ใช้
Note
- คุณต้องสร้างปุ่มเข้าสู่ระบบโดยอ้างอิงจากคู่มือการออกแบบที่จัดเตรียมโดยแต่ละ IdP เมื่อสร้างปุ่มเข้าสู่ระบบ
- Game Center: ไม่มีแนวทางเพิ่มเติม
- Google Play Games: แนวทางการสร้างแบรนด์
- Google: แนวทางการสร้างแบรนด์
- Hive membership: Hive BI Guidelines
- Facebook: ศูนย์ทรัพยากรแบรนด์
- QQ: นโยบายและระเบียบข้อบังคับ
- WeChat: แบรนด์หลัก & แนวทาง
- VK: VK Brandbook
- Apple: แนวทางการออกแบบส่วนติดต่อผู้ใช้
- LINE: แนวทางการออกแบบปุ่มเข้าสู่ระบบ LINE
- Huawei: ข้อกำหนดไอคอน HUAWEI ID
- คุณต้องปฏิบัติตามแนวทางปุ่มเข้าสู่ระบบของ Google เพื่อให้เกมของคุณได้รับการแสดงใน Google Play Store
- สำหรับชื่อปุ่มเข้าสู่ระบบหลายภาษาใน auth คลิก ที่นี่.
- ตัวอย่าง UI ที่แสดงเฉพาะปุ่มที่ซิงค์กับ Facebook บนหน้าเข้าสู่ระบบ
ต่อไปนี้คือตัวอย่างโค้ดสำหรับกรณีที่ผู้ใช้เลือกการลงชื่อเข้าใช้ Google บน UI การเข้าสู่ระบบที่กำหนดเอง
API Reference: hive.AuthV4.signIn
using hive;
AuthV4.signIn(AuthV4.ProviderType.GOOGLE, (ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
if (result.isSuccess()) {
// call successful
// playerInfo: Authenticated user information.
// Example of email information search for ProviderType.GOOGLE
Dictionary<AuthV4.ProviderType, AuthV4.ProviderInfo> providerInfoData = playerInfo.providerInfoData;
AuthV4.ProviderInfo providerInfo = providerInfoData[AuthV4.ProviderType.GOOGLE];
string email = providerInfo.providerEmail;
}
});
#include "HiveAuthV4.h"
FHiveAuthV4::SignIn(EHiveProviderType::GOOGLE,
FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
if (Result.IsSuccess()) {
// การเรียกสำเร็จ
// playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์.
// ตัวอย่างการค้นหาข้อมูลอีเมลสำหรับ ProviderType::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()) {
// call successful
// playerInfo: Authenticated user information.
// ตัวอย่างการค้นหาข้อมูลอีเมลสำหรับ 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) {
// call successful
// playerInfo: Authenticated user information
// Example of email information search for 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() {
// call successful
// playerInfo: Authenticated user information
// ตัวอย่างการค้นหาข้อมูลอีเมลสำหรับ ProviderType::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]){
// call successful
// playerInfo: Authenticated user information.
// ตัวอย่างการค้นหาข้อมูลอีเมลโดย HIVEProviderTypeGoogle
if(playerInfo != nil) {
HIVEProviderInfo *providerInfo = playerInfo.providerInfoData[@"GOOGLE"];
if(providerInfo != nil){
NSString *email = providerInfo.providerEmail;
}
}
}
}];
ตรวจสอบบัญชี IdP ที่เข้าสู่ระบบบนอุปกรณ์¶
การเข้าสู่ระบบอัตโนมัติสามารถใช้เพื่อเข้าสู่ระบบด้วยคีย์โทเค็นของ playerId
ที่ลงทะเบียน และเช่นเดียวกันกับการเข้าสู่ระบบแบบชัดเจนกับ IdP ที่แตกต่างกัน ในกรณีของทั้งสองกรณี บัญชี IdP (DevicePlayer) ที่เข้าสู่ระบบบนอุปกรณ์ของผู้ใช้อาจไม่ตรงกับ IdP ของ PlayerID ที่ผู้ใช้เข้าสู่ระบบ โดยพิจารณาจากการใช้ความสำเร็จหรือกระดานผู้นำ หน้าการแจ้งเตือนจะถูกจัดเตรียมไว้สำหรับผู้ใช้เพื่อให้ตรงกับสองบัญชี
ต่อไปนี้คือตัวอย่างโค้ดเพื่อยืนยันข้อมูล 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
// AuthV4::Helper::showConflict(...);
//หรือ
// ex) เมื่อดำเนินการ GameUI
// AuthV4::Helper::resolverConflict(...);// เมื่อเลือกผู้ใช้ปัจจุบัน
// AuthV4::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) เมื่อทำการ GameUI
// [[HIVEAuthV4 helper] resolverConflict:...];// เมื่อเลือกผู้ใช้ปัจจุบัน
// [[HIVEAuthV4 helper] switchAccount:...];// เมื่อเลือกการสลับผู้ใช้
break;
default:
// สถานการณ์ข้อยกเว้นอื่นๆ
break;
}
}];
การเข้าสู่ระบบผู้เยี่ยมชม¶
Hive SDK รองรับการเข้าสู่ระบบแขกเพื่อให้ผู้ใช้สามารถเล่นเกมในฐานะแขกโดยไม่ต้องเลือก IdP คุณสามารถนำฟังก์ชันนี้ไปใช้เพื่อให้ผู้ใช้เลือกแขกจาก UI การเข้าสู่ระบบแบบชัดเจนที่จัดเตรียมโดย Hive SDK หรือจาก UI ที่ปรับแต่งโดยเกม สภาพแวดล้อม Windows ไม่รองรับการลงชื่อเข้าใช้แขก
โปรดปฏิบัติตามนโยบายต่อไปนี้เมื่อเข้าสู่ระบบในฐานะแขก
นโยบายการเข้าสู่ระบบของแขก¶
-
สร้างเกมที่มีให้บริการทั้งสำหรับผู้ใช้แขกและสมาชิก Hive อย่างเท่าเทียมกัน.
ฟีเจอร์ส่วนใหญ่ของแพลตฟอร์ม Hive มีให้บริการสำหรับผู้ใช้ที่เป็นแขก ดังนั้น ให้พัฒนาเกมของคุณให้เหมือนกันทั้งสำหรับผู้ใช้ที่เป็นแขกและผู้ใช้ที่เชื่อมต่อกับ IdP ตัวอย่างเช่น ผู้ใช้ที่เป็นแขกยังสามารถซื้อไอเทมและชำระเงินในเกมได้
-
ไม่อนุญาตให้ผู้ใช้แขกออกจากระบบ.
หากผู้ใช้เข้าสู่ระบบในฐานะแขกแล้วออกจากระบบ ผู้ใช้จะไม่สามารถเข้าสู่ระบบด้วย PlayerID เดิมได้อีกต่อไป ดังนั้นจึงไม่ควรจัดให้มีปุ่มออกจากระบบเพื่อป้องกันไม่ให้ผู้ใช้ออกจากระบบเมื่อสถานะของพวกเขาคือแขก
-
นโยบายการเข้าสู่ระบบของแขกที่มี IP ของจีน.
หากผู้ใช้เข้าถึงเกมด้วย IP ของจีน จะมีเพียงสมาชิกที่ได้รับอนุญาตเท่านั้นที่สามารถเติมเงินในเกมหรือซื้อไอเทม (เริ่มตั้งแต่วันที่ 1 พฤษภาคม 2017) ดังนั้น IdP ที่มีให้บริการด้วย IP ของจีนจะไม่รวมการเข้าสู่ระบบในฐานะแแขก
Implement signIn()
method with the parameter, ProviderType.GUEST
to execute Guest Login. Followings are sample codes to execute Guest Login.
Note
PlayerID ในสถานะแขกที่ไม่มีการตรวจสอบสิทธิ์ IdP จะไม่มี providerInfoData ของ playerInfo.
API Reference: hive.AuthV4.signIn
API Reference: Auth4::signIn
API Reference: AuthV4.signIn
import com.hive.AuthV4
import com.hive.ResultAPI
AuthV4.signIn(AuthV4.ProviderType.GUEST, object : AuthV4.AuthV4SignInListener {
override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// การตรวจสอบสิทธิ์สำเร็จ
// playerInfo: ข้อมูลผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์
}
}
})
API Reference: com.hive.Auth4.signIn
API Reference: AuthV4Interface.signIn
API Reference: HIVEAuth4:signIn
การเข้าสู่ระบบแบบกำหนดเอง¶
การเข้าสู่ระบบแบบกำหนดเอง เป็นฟีเจอร์ในการดำเนินการเข้าสู่ระบบด้วย IdP ภายนอกที่ Hive SDK ไม่รองรับ ติดตามคู่มือ Auth V4 Custom Authentication เพื่อสร้าง authKey ที่ใช้ในการเรียก API การเข้าสู่ระบบแบบกำหนดเอง คุณสามารถยืนยันข้อมูลของผู้ใช้ที่ลงชื่อเข้าใช้ด้วยการเข้าสู่ระบบแบบกำหนดเองโดยการเข้าถึง customProviderInfoData
กับ PlayerInfo อ็อบเจ็กต์ซึ่งถูกส่งเป็น callback ของ API การเข้าสู่ระบบแบบกำหนดเอง ProviderType(enum) ของ customProviderInfoData
จะถูกตั้งค่าเป็น CUSTOM
ทั้งหมด และสามารถระบุรายละเอียดได้ด้วย ProviderName(String).
- ข้อมูลของ IdP ที่ได้ทำการปรับแต่งการเข้าสู่ระบบในเกมจะไม่รวมอยู่ในผลลัพธ์ของการเรียกใช้
setup()
และshowSignIn()
เมธอดของคลาส AuthV4.- หากคุณได้รับ playerId และ playerToken หลังจากที่ได้ทำการเข้าสู่ระบบแบบกำหนดเองครั้งแรก, Result API ของ
authV4SessionExist(code)
จะถูกส่งผ่านเป็น callback เมื่อคุณเรียกใช้ API การเข้าสู่ระบบแบบกำหนดเองอีกครั้ง ในกรณีนี้ให้ทำการ implement เมธอดsignIn()
พร้อมกับพารามิเตอร์ProviderType.Auto
เพื่อทำการเข้าสู่ระบบอัตโนมัติกับบัญชีที่เข้าสู่ระบบก่อนหน้านี้.- เมธอด
connect()
และdisconnect()
ของคลาส AuthV4 ในปัจจุบันไม่รองรับการเชื่อมต่อและการตัดการเชื่อมต่อเพิ่มเติมของ IdP การเข้าสู่ระบบแบบกำหนดเอง.- การซิงค์เพิ่มเติมหรือการตัดการเชื่อมต่อของ IdP สำหรับการเข้าสู่ระบบแบบกำหนดเองได้รับการสนับสนุนด้วยเมธอด
connectWithAuthKey()
และdisconnectWithName()
.
ต่อไปนี้คือตัวอย่างโค้ดในการ implement การเข้าสู่ระบบแบบกำหนดเอง.
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, customs มีประเภทที่กำหนดไว้ ดังนั้นคุณต้องแยกแยะพวกเขาตาม providerName
providerInfo. providerName; // "CUSTOM_TWITTER"
providerInfo. providerUserId; // user id ที่ใช้สำหรับการเข้าสู่ระบบ Twitter ที่พัฒนาขึ้นเอง
return;
}
else if (result.code == ResultAPI.Code.AuthV4SessionExist) {
// หากคุณต้องการเข้าสู่ระบบโดยอัตโนมัติหลังจากที่ออก playerId และ playerToken แล้ว
// TODO: AuthV4.signIn(ProviderType.AUTO, (ResultAPI _result, PlayerInfo playerInfo) => {});
}
else if (result.code == ResultAPI.Code.AuthV4NotInitialized) {
// TODO: ต้องทำการเริ่มต้น SDK
}
else if (result.code == ResultAPI.Code.AuthV4InvalidParam) {
// TODO: ต้องตรวจสอบว่าค่าที่ส่งผ่าน authKey เป็น NULL หรือว่างเปล่า
}
else if (result. needExit()) {
// TODO: implement app exit functionality
// ตัวอย่าง) Application.Quit();
}
});
});
#include "HiveAuthV4.h"
// การเข้าสู่ระบบ Twitter ถูกนำไปใช้โดยตรงในเกม
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, ProviderType::CUSTOM, customs have a fixed type, so you need to distinguish them by providerName
FString ProviderName = ProviderInfo->ProviderName; // "CUSTOM_TWITTER"
FString ProviderUserId = ProviderInfo->ProviderUserId; // user id used for self-implemented twitter login
}
} else if (Result.NeedExit()) {
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else if (Result.Code == FHiveResultAPI::ECode::AuthV4SessionExist) {
// หากคุณต้องการเข้าสู่ระบบโดยอัตโนมัติหลังจากที่ได้ออก playerId และ playerToken แล้ว
// TODO: AuthV4.signIn(ProviderType::AUTO, [=](ResultAPI const & _result, PlayerInfo const & playerInfo) {});
} else if (Result.Code == FHiveResultAPI::ECode::AuthV4NotInitialized) {
// TODO: ต้องทำการเริ่มต้น SDK
} else if (Result.Code == FHiveResultAPI::ECode::AuthV4InvalidParam) {
// TODO: ต้องตรวจสอบว่า authKey ที่ส่งมานั้นเป็น NULL หรือว่างเปล่า
}
}));
}
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, customs มีประเภทที่แน่นอน ดังนั้นคุณต้องแยกแยะพวกเขาตาม providerName
providerInfo. providerName; // "CUSTOM_TWITTER"
providerInfo. providerUserId; // user id ที่ใช้สำหรับการเข้าสู่ระบบ 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: implement app exit functionality
// ผู้ใช้ของเอนจิน Cocos2d-x
// ex) exit(0);
// ผู้ใช้เอนจิน Unreal
// ตัวอย่าง) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
});
});
API Reference: 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, since custom types are fixed, it is necessary to distinguish them by providerName
providerInfo.providerName // "CUSTOM_TWITTER"
providerInfo.providerUserId // user id used for Twitter login
}
}
else if (result. needExit()) {
// TODO: implement app exit functionality
// ex) exitProcess(0)
}
else if (result.code == ResultAPI.Code.AuthV4SessionExist) {
// If you need to log in automatically after having already issued playerId and playerToken
// TODO: AuthV4.signIn(AuthV4.ProviderType.AUTO, authV4SignInListener)
}
else if (result.code == ResultAPI.Code.AuthV4NotInitialized) {
// TODO: need to initialize SDK
}
else if (result.code == ResultAPI.Code.AuthV4InvalidParam) {
// TODO: Need to check whether the passed authKey value is NULL or empty
}
}
})
}
API Reference: com.hive.Auth4.signIn
// Twitter login implemented directly in the game
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(); // user id ที่ใช้สำหรับการเข้าสู่ระบบ twitter ที่พัฒนาขึ้นเอง
}
} else if (result. needExit()) {
// TODO: implement app exit functionality
// ex) 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: need to initialize SDK
} else if (result.getCode() == ResultAPI.Code.AuthV4InvalidParam) {
// TODO: Need to check whether the passed authKey value is NULL or empty
}
}
});
}
API Reference: HIVEAuth4:signIn
swift // การเข้าสู่ระบบ 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 app shutdown functionality. // ex) 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, customs มีประเภทที่แน่นอน ดังนั้นคุณต้องแยกแยะพวกเขาตาม providerName
providerInfo. providerName; // "CUSTOM_TWITTER"
providerInfo. providerUserId; // user id ที่ใช้สำหรับการเข้าสู่ระบบ 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: นำฟังก์ชันการปิดแอปไปใช้
// ex) exit(0);
}
}];
}];
ชื่อผู้ใช้¶
เนื่องจากปัญหาต่างๆ เช่น US COPPA เมื่อเข้าถึงจากสหรัฐอเมริกาหรือดินแดนของมันและเข้าสู่ระบบด้วย IdP คุณต้องป้อนชื่อผู้ใช้ของคุณเพื่อเปิดใช้งานการตรวจสอบสิทธิ์สำหรับการระบุผู้ใช้เพิ่มเติม สำหรับข้อมูลอ้างอิง ประเทศที่รวมอยู่ในดินแดนของสหรัฐอเมริกาคือ อเมริกันซามัว (AS), กวม (GU), หมู่เกาะนอร์เทิร์นมาเรียนา (MP), เปอร์โตริโก (PR), หมู่เกาะเล็กน้อยของสหรัฐ (UM) และหมู่เกาะเวอร์จินของสหรัฐ (VI) หน้าจอป้อนชื่อผู้ใช้สำหรับการระบุผู้ใช้มีดังนี้
- หน้าจอป้อนชื่อผู้ใช้ใช้สำหรับการระบุผู้ใช้เท่านั้น ดังนั้นจึงแสดงเพียงครั้งเดียวเมื่อเชื่อมโยงกับ IdP เป็นครั้งแรกและจะไม่แสดงอีกนอกเหนือจากนั้น
- เมื่อเข้าสู่ระบบในฐานะแขก หน้าจอป้อนชื่อผู้ใช้จะไม่แสดง
การตรวจสอบคีย์โทเค็นการรับรองความถูกต้อง¶
เซิร์ฟเวอร์เกมสามารถตรวจสอบความถูกต้องของกุญแจโทเค็นการรับรองตัวตนโดยใช้โทเค็นที่ส่งคืน, playerId, และข้อมูล DID หลังจากการเข้าสู่ระบบที่สำเร็จ การรับรองตัวตนอนุญาตให้เข้าสู่ระบบจากหลายอุปกรณ์และการเชื่อมต่อซ้ำ
หากเกมของคุณไม่อนุญาตให้เข้าถึงซ้ำด้วย ID เดียว เซิร์ฟเวอร์เกมจะแสดงประกาศบนอุปกรณ์ที่เข้าสู่ระบบและยุติเกม จากนั้น อุปกรณ์ที่เข้าสู่ระบบเป็นอันดับสองจะรักษาสถานะการเข้าสู่ระบบสำหรับการเล่นเกม หากผู้ใช้ยังคงเชื่อมต่อซ้ำโดยไม่ยุติเกมจากอุปกรณ์หนึ่ง การเล่นเกมอาจไม่ถูกบันทึกอย่างชัดเจน ดังนั้น โปรดตรวจสอบให้แน่ใจว่าคุณจัดการกับคีย์โทเค็นที่ได้รับการตรวจสอบแล้ว หรือดำเนินการฟังก์ชันโดยการจัดการคีย์เซสชันของเกมเองโดยใช้คีย์โทเค็นเพื่อประมวลผลฟังก์ชันนี้
ดำเนินการฟังก์ชันโดยอ้างอิงจาก Hive Server API > การตรวจสอบการรับรองความถูกต้อง v4 Token.
การขอรับโทเค็นเข้าสู่ระบบ TalkPlus¶
ในการเข้าสู่ระบบ TalkPlus คุณต้องใช้โทเค็นการเข้าสู่ระบบที่ได้รับจากการเรียก API AuthV4.getHiveTalkPlusLoginToken หลังจากการเข้าสู่ระบบ (signIn()) ผ่านอินเทอร์เฟซ Auth v4 (ดู คู่มือการเข้าสู่ระบบ TalkPlus)
การตรวจจับการเปลี่ยนแปลงในบัญชี IdP ในพื้นหลัง¶
ผู้ใช้สามารถเปลี่ยนบัญชีเกม Apple Game Center หรือ Google Play ผ่านการตั้งค่าอุปกรณ์ขณะเล่นเกม หากคุณต้องการตรวจสอบว่าบัญชี IdP ตรงกับบัญชีที่เชื่อมต่อกับ PlayerID ปัจจุบันหรือไม่ ให้ใช้ setProviderChangedListener()
หลังจากเริ่มต้น Hive SDK หากคุณใช้ API ผู้ใช้จะได้รับเหตุการณ์ที่แจ้งการเปลี่ยนแปลงในบัญชี IdP ที่เชื่อมโยงกับอุปกรณ์ของผู้ใช้เมื่อเกมกลับมาเล่นอีกครั้ง
iOS ทำงานเมื่อบัญชีใน Apple Game Center ถูกเปลี่ยน และ Android ทำงานเมื่อบัญชีใน Google Play Games ถูกเปลี่ยน และการตอบสนองจะถูกส่งมอบเฉพาะเมื่อ PlayerID ที่เข้าสู่ระบบในปัจจุบันเชื่อมต่อกับ IdP ที่เกี่ยวข้อง หากคุณได้รับเหตุการณ์การเปลี่ยนแปลงในบัญชี IdP ให้กำหนด UI ที่อนุญาตให้ผู้ใช้เลือกว่าจะใช้บัญชี IdP ที่เข้าสู่ระบบในอุปกรณ์หรือไม่ หากผู้ใช้เลือกบัญชี IdP ที่เข้าสู่ระบบในอุปกรณ์ ให้เรียก signOut
เพื่อลงชื่อออกและดำเนินการเข้าสู่ระบบแบบไม่ชัดเจน
Warning
เนื่องจากปัญหาการทำงานของ Google Play Games อุปกรณ์ที่มี Google Play Games ที่ปล่อยหลังจากเดือนกรกฎาคม 2021 ไม่สามารถเปลี่ยนบัญชี IdP ในพื้นหลังได้
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) {
// Change Google Play Game Service account
}
}
})
API reference : : com.hive.authv4.SetproviderChangeDlistener
API Reference: AuthV4Interface .setProviderChangedListener
API Reference: HIVEAuthV4:setProviderChangedListener
กำลังเริ่มข้อมูลเกม¶
ตรวจสอบให้แน่ใจว่าไม่ได้นำฟังก์ชันออกจากระบบเมื่อเริ่มต้นข้อมูลเกม PlayerID จะไม่ถูกลบผ่านการเริ่มต้น ดังนั้นอาจเกิดการชนกันระหว่างบัญชีได้ ให้ผู้ใช้เล่นเกมด้วยบัญชีที่ลงชื่อเข้าใช้ในปัจจุบัน และอย่านำฟังก์ชันออกจากระบบไปใช้ก่อนที่ผู้ใช้จะขออย่างชัดเจนโดยการแตะปุ่มออกจากระบบ
ออกจากระบบ¶
Warning
- เมื่อออกจากระบบ ข้อมูล PlayerId (ข้อมูลการตรวจสอบสิทธิ์) ข้อมูล PlayerToken (ข้อมูลเซสชัน) และข้อมูลเซสชัน IDP ทั้งหมดจะถูกลบ
- เมื่อออกจากระบบ ค่าที่ตั้งค่าด้วย API setter (
set
API series) จะไม่ถูกตั้งค่าใหม่หรือถูกลบ- เมธอด setter ทุกตัวในคลาส Configuration, Auth, Auth v4, Promotion และ Push
- ตัวอย่าง: Configuration.setServer, Configuration.setUseLog, Configuration.setGameLanguage, Configuration.setHiveCertificationKey, Auth.setEmergencyMode, AuthV4.setProviderChangedListener, Promotion.setUserEngagementReady, Promotion.setAddtionalInfo, Push.setRemotePush, Push.setForegroundPush, ฯลฯ
- ตั้งแต่ Hive SDK v4 24.3.0 จะมีการคืนรหัสข้อผิดพลาดเมื่อผู้ใช้แขกออกจากระบบ เซสชันของไคลเอนต์และเซิร์ฟเวอร์จะถูกเก็บรักษาไว้หลังจากนั้น
- ขอบเขตที่มีผลของค่าที่ตั้งค่าด้วยวิธี setter จะถูกเก็บรักษาไว้ภายในวงจรชีวิตของแอป ไม่ใช่ในสถานะการเข้าสู่ระบบหรือออกจากระบบ
หากมีการเข้าสู่ระบบ 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:
// Logout successful
break;
default:
// other exception situations
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 -> {
// Logout successful
}
else -> {
// other exception situations
}
}
}
})
API Reference: AuthV4.Helper.INSTANCE.signOut
API Reference: AuthV4Interface.helper().signOut()
API Reference: [HIVEAuthV4 helper] signOut
ข้อความแจ้งเตือนสำหรับการเข้าสู่ระบบศูนย์เกมถูกปิดใช้งาน¶
ภาษา | วลี |
---|---|
เกาหลี | 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. |
อาหรับ | تم إلغاء تسجيل الدخول إلى مركز الألعاب. سجل الدخول إلى [الإعدادات >; مركز الألعاب] للمزامنة مع حساب مركز الألعاب وحاول مرة أخرى. |