คู่มือนี้จะอธิบายวิธีรองรับการอัปเดตในแอปในแอปของคุณโดยใช้ Unreal Engine เรามีคำแนะนำแยกต่างหากสำหรับกรณีที่การติดตั้งใช้งานใช้ภาษาโปรแกรม Kotlin หรือภาษาโปรแกรม Java และกรณีที่การติดตั้งใช้งานใช้โค้ดเนทีฟ (C/C++) หรือ Unity
ภาพรวมของ Unreal Engine SDK
Play In-App Updates API เป็นส่วนหนึ่งของครอบครัว Play Core SDK API สำหรับ Unreal Engine มีคลาส UInAppUpdatesManager
เพื่อจัดการการสื่อสารระหว่างแอปของคุณกับ Play API หลังจากส่งคำขอแล้ว แอปจะตรวจสอบสถานะคำขอได้โดยใช้ EAppUpdateErrorCode
เวอร์ชัน Unreal Engine ที่รองรับ
ปลั๊กอินรองรับ Unreal Engine 5.0 และเวอร์ชันต่อๆ ไปทั้งหมด
ตั้งค่าสภาพแวดล้อมการพัฒนา
ดาวน์โหลดPlay Unreal Engine Plugin จากที่เก็บ GitHub
คัดลอกโฟลเดอร์
GooglePlay
ภายในโฟลเดอร์Plugins
ในโปรเจ็กต์ Unreal Engineเปิดโปรเจ็กต์ Unreal Engine แล้วคลิกแก้ไข → ปลั๊กอิน
ค้นหา Google Play แล้วเลือกช่องทำเครื่องหมายเปิดใช้
รีสตาร์ทโปรเจ็กต์เกมและเรียกใช้การสร้าง
เปิดไฟล์
Build.cs
ของโปรเจ็กต์ แล้วเพิ่มโมดูลPlayInAppUpdates
ลงในPublicDependencyModuleNames
using UnrealBuildTool; public class MyGame : ModuleRules { public MyGame(ReadOnlyTargetRules Target) : base(Target) { // ... PublicDependencyModuleNames.Add("PlayInAppUpdates"); // ... } }
ตรวจสอบความพร้อมใช้งานของการอัปเดต
ก่อนขอการอัปเดต ให้ตรวจสอบว่ามีอัปเดตสำหรับแอปของคุณหรือไม่ โดยทำดังนี้UInAppUpdatesManager::RequestInfo
void MyClass::OnRequestInfoOperationCompleted(
EAppUpdateErrorCode ErrorCode,
UAppUpdateInfo* UpdateInfo)
{
// Check the resulting error code.
if (ErrorCode == EAppUpdateErrorCode::AppUpdate_NO_ERROR)
{
// Check AppUpdateInfo's UpdateAvailability, UpdatePriority,
// IsUpdateTypeAllowed(), ... and decide whether to ask the user
// to start an in-app update.
}
}
void MyClass::CheckForUpdateAvailability()
{
// Create a delegate to bind the callback function.
FRequestInfoOperationCompletedDelegate Delegate;
// Bind the completion handler (OnRequestInfoOperationCompleted) to the delegate.
Delegate.BindDynamic(this, &MyClass::OnRequestInfoOperationCompleted);
// Initiate the request info operation, passing the delegate to handle the result.
GetGameInstance()
->GetSubsystem<UInAppUpdatesManager>()
->RequestInfo(Delegate);
}
อินสแตนซ์ UAppUpdateInfo
ที่แสดงผลจะมีสถานะความพร้อมให้บริการของอัปเดต
หากการอัปเดตในแอปกำลังดำเนินการอยู่ อินสแตนซ์จะรายงานสถานะของการอัปเดตที่ดำเนินการอยู่ด้วย
ตรวจสอบความล้าสมัยของการอัปเดต
นอกจากการตรวจสอบว่ามีการอัปเดตหรือไม่แล้ว คุณอาจต้องตรวจสอบด้วยว่าเวลาผ่านไปนานเท่าใดนับตั้งแต่ที่ผู้ใช้ได้รับการแจ้งเตือนการอัปเดตครั้งล่าสุดผ่าน Play Store ซึ่งจะช่วยให้คุณตัดสินใจได้ว่าจะเริ่มต้นการอัปเดตแบบยืดหยุ่นหรือการอัปเดตทันที ตัวอย่างเช่น คุณอาจรอ 2-3 วันก่อนแจ้งให้ผู้ใช้ทราบถึงการอัปเดตแบบยืดหยุ่น และรออีก 2-3 วันหลังจากนั้นก่อนที่จะกำหนดให้อัปเดตทันที
ใช้ UAppUpdateInfo:GetClientVersionStalenessDays
เพื่อตรวจสอบจำนวนวันนับตั้งแต่การอัปเดตพร้อมให้บริการผ่าน Play Store
int32 ClientVersionStalenessDays = UpdateInfo->GetClientVersionStalenessDays();
ตรวจสอบลําดับความสําคัญของการอัปเดต
Google Play Developer API ช่วยให้คุณกำหนดลำดับความสำคัญของการอัปเดตแต่ละรายการได้ ซึ่งจะช่วยให้แอปตัดสินใจได้ว่าควรแนะนำให้ผู้ใช้อัปเดตมากน้อยเพียงใด ตัวอย่างเช่น ลองใช้กลยุทธ์ต่อไปนี้ในการกำหนดลำดับความสำคัญของการอัปเดต
- การปรับปรุง UI เล็กน้อย: การอัปเดตสำคัญน้อย ไม่ขอการอัปเดตแบบยืดหยุ่นหรือการอัปเดตทันที
- การปรับปรุงประสิทธิภาพ: การอัปเดตสำคัญปานกลาง ขอการอัปเดตแบบยืดหยุ่น
- การอัปเดตความปลอดภัยที่สำคัญ: การอัปเดตสำคัญสูง ให้ขอการอัปเดตทันที
Google Play ใช้ค่าจำนวนเต็มระหว่าง 0 ถึง 5 เพื่อกำหนดลำดับความสำคัญ โดย 0 จะเป็นค่าเริ่มต้นและ 5 จะเป็นลำดับความสำคัญสูงสุด หากต้องการตั้งค่าลำดับความสำคัญของการอัปเดต ให้ใช้ช่อง inAppUpdatePriority
ในส่วน Edits.tracks.releases
ใน Google Play Developer API ระบบจะถือว่าเวอร์ชันที่เพิ่มเข้ามาใหม่ทั้งหมดในรุ่นมีลําดับความสําคัญเท่ากับรุ่นนั้น คุณจะตั้งค่าลำดับความสำคัญได้ก็ต่อเมื่อเปิดตัวรุ่นใหม่เท่านั้น และไม่สามารถเปลี่ยนแปลงในภายหลัง
ตั้งค่าลำดับความสำคัญโดยใช้ Google Play Developer API ตามที่อธิบายไว้ในเอกสารประกอบของ Play Developer API คุณควรระบุลำดับความสำคัญของการอัปเดตในแอปในทรัพยากร Edit.tracks
ที่ส่งในเมธอด Edit.tracks: update
ตัวอย่างต่อไปนี้แสดงการเผยแพร่แอปที่มีรหัสเวอร์ชัน 88 และ inAppUpdatePriority
5
{ "releases": [{ "versionCodes": ["88"], "inAppUpdatePriority": 5, "status": "completed" }] }
ในโค้ดของแอป คุณสามารถตรวจสอบระดับความสำคัญของการอัปเดตหนึ่งๆ ได้โดยใช้UAppUpdateInfo::UpdatePriority
ดังนี้
int32 Priority = UpdateInfo->GetPriority();
เริ่มอัปเดต
หลังจากยืนยันว่ามีอัปเดตให้ใช้งานแล้ว คุณจะขออัปเดตได้โดยใช้ UInAppUpdatesManager::StartUpdate
ก่อนขอการอัปเดต โปรดตรวจสอบว่าคุณมีออบเจ็กต์ UAppUpdateInfo
ที่อัปเดตแล้ว นอกจากนี้ คุณยังต้องสร้างออบเจ็กต์ UAppUpdateOptions
เพื่อกําหนดค่าขั้นตอนการอัปเดตด้วย
ตัวอย่างต่อไปนี้สร้างออบเจ็กต์ UAppUpdateOptions
สำหรับขั้นตอนการอัปเดตทันที
// Creates an UAppUpdateOptions defining an immediate in-app
// update flow and its parameters.
UAppUpdateOptions* Options = NewObject<UAppUpdateOptions>();
Options->CreateOptions(EAppUpdateType::AppUpdate_TYPE_IMMEDIATE);
ตัวอย่างต่อไปนี้สร้างออบเจ็กต์ UAppUpdateOptions
สำหรับขั้นตอนการอัปเดตที่ยืดหยุ่น
// Creates an UAppUpdateOptions defining a flexible in-app
// update flow and its parameters.
UAppUpdateOptions* Options = NewObject<UAppUpdateOptions>();
Options->CreateOptions(EAppUpdateType::AppUpdate_TYPE_FLEXIBLE);
ออบเจ็กต์ UAppUpdateOptions
ยังมีฟังก์ชัน IsAssetPackDeletionAllowed
ที่แสดงผลว่าระบบอนุญาตให้การอัปเดตล้างแพ็กเกจชิ้นงานหรือไม่ในกรณีที่พื้นที่เก็บข้อมูลของอุปกรณ์มีจำกัด ระบบตั้งค่าช่องนี้เป็น false
โดยค่าเริ่มต้น แต่คุณตั้งค่าช่องโดยใช้ UAppUpdateOptions::SetAssetPackDeletionAllowed
เพื่อตั้งค่าเป็น true
แทนได้ ดังนี้
// Sets the AssetPackDeletionAllowed field to true.
Options->SetAssetPackDeletionAllowed(true);
ขั้นตอนถัดไปจะขึ้นอยู่กับว่าคุณกำลังขอการอัปเดตแบบยืดหยุ่นหรือการอัปเดตทันที
จัดการการอัปเดตแบบยืดหยุ่น
หลังจากมีออบเจ็กต์ UAppUpdateInfo
ที่อัปเดตล่าสุดและออบเจ็กต์ UAppUpdateOptions
ที่กําหนดค่าอย่างถูกต้องแล้ว คุณสามารถเรียกใช้ UInAppUpdatesManager::StartUpdate
เพื่อขอขั้นตอนการอัปเดต
void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
// ...
}
// .cpp
void MyClass::StartUpdate()
{
// Create a delegate to bind the callback function.
FUpdateOperationCompletedDelegate Delegate;
// Bind the completion handler (OnStartUpdateOperationCompleted) to the delegate.
Delegate.BindDynamic(this, &MyClass::OnStartUpdateOperationCompleted);
// Initiate the start update operation, passing the delegate to handle the result.
GetGameInstance()
->GetSubsystem<UInAppUpdatesManager>()
->StartUpdate(UpdateInfo, UpdateOptions, Delegate);
}
หากต้องการใช้ขั้นตอนการอัปเดตที่ยืดหยุ่น คุณต้องทริกเกอร์การติดตั้งการอัปเดตแอปหลังจากการดาวน์โหลดเสร็จสมบูรณ์ โดยเรียกใช้
InAppUpdatesManager::CompleteUpdate
ตามที่แสดงในตัวอย่างต่อไปนี้
void MyClass::OnCompleteUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
// ...
}
void MyClass::CompleteFlexibleUpdate()
{
// Create a delegate to bind the callback function.
FUpdateOperationCompletedDelegate Delegate;
// Bind the completion handler (OnCompleteUpdateOperationCompleted) to the delegate.
Delegate.BindDynamic(this, &MyClass::OnCompleteUpdateOperationCompleted);
// Initiate the complete update operation, passing the delegate to handle the result.
GetGameInstance()
->GetSubsystem<UInAppUpdatesManager>()
->CompleteUpdate(UpdateInfo, UpdateOptions, Delegate);
}
จัดการการอัปเดตทันที
หลังจากมีออบเจ็กต์ UAppUpdateInfo
ที่อัปเดตล่าสุดและออบเจ็กต์ UAppUpdateOptions
ที่กําหนดค่าอย่างถูกต้องแล้ว คุณสามารถเรียกใช้ InAppUpdatesManager::StartUpdate
เพื่อขอขั้นตอนการอัปเดต
void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
// ...
}
void MyClass::StartUpdate()
{
// Create a delegate to bind the callback function.
FUpdateOperationCompletedDelegate Delegate;
// Bind the completion handler (OnStartUpdateOperationCompleted) to the delegate.
Delegate.BindDynamic(this, &MyClass::OnStartUpdateOperationCompleted);
// Initiate the start update operation, passing the delegate to handle the result.
GetGameInstance()
->GetSubsystem<UInAppUpdatesManager>()
->StartUpdate(UpdateInfo, UpdateOptions, Delegate);
}
สำหรับขั้นตอนการอัปเดตทันที Google Play จะแสดงกล่องโต้ตอบการยืนยันผู้ใช้ เมื่อผู้ใช้ยอมรับคำขอ Google Play จะดาวน์โหลดและติดตั้งการอัปเดตโดยอัตโนมัติ จากนั้นจะรีสตาร์ทแอปเป็นเวอร์ชันที่อัปเดตแล้วหากการติดตั้งสำเร็จ
การจัดการข้อผิดพลาด
ส่วนนี้จะอธิบายวิธีแก้ปัญหาข้อผิดพลาดที่พบบ่อย
- หาก
UInAppUpdatesManager::StartUpdate
แสดงผลข้อผิดพลาดAppUpdate_INVALID_REQUEST
แสดงว่าUAppUpdateInfo
ไม่ถูกต้อง ตรวจสอบว่าออบเจ็กต์UAppUpdateInfo
ที่แสดงผลจากUInAppUpdatesManager::RequestInfo
ไม่ใช่ค่า Null ก่อนเริ่มขั้นตอนการอัปเดต - หาก
UInAppUpdatesManager::StartUpdate
แสดงข้อผิดพลาดAppUpdate_NOT_ALLOWED
แสดงว่าออบเจ็กต์UAppUpdateOptions
ระบุประเภทการอัปเดตที่ไม่อนุญาตให้ใช้กับการอัปเดตที่มีอยู่ ตรวจสอบว่าออบเจ็กต์UAppUpdateInfo
ระบุว่าอนุญาตให้อัปเดตประเภทที่เลือกหรือไม่ก่อนที่จะเริ่มขั้นตอนการอัปเดต
ขั้นตอนถัดไป
ทดสอบการอัปเดตในแอปของแอปเพื่อยืนยันว่าการผสานรวมทํางานอย่างถูกต้อง