คู่มือนี้จะอธิบายวิธีรองรับการอัปเดตในแอปในแอปของคุณโดยใช้ 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
MyClass.h
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.
  }
}
MyClass.cpp
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 เพื่อขอขั้นตอนการอัปเดต
MyClass.h
void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
  // ...
}
MyClass.cpp
// .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 ตามที่แสดงในตัวอย่างต่อไปนี้
MyClass.h
void MyClass::OnCompleteUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
  // ...
}
MyClass.cpp
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 เพื่อขอขั้นตอนการอัปเดต
MyClass.h
void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
  // ...
}
MyClass.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);
}
สำหรับขั้นตอนการอัปเดตทันที Google Play จะแสดงกล่องโต้ตอบการยืนยันผู้ใช้ เมื่อผู้ใช้ยอมรับคำขอ Google Play จะดาวน์โหลดและติดตั้งการอัปเดตโดยอัตโนมัติ จากนั้นจะรีสตาร์ทแอปเป็นเวอร์ชันที่อัปเดตแล้วหากการติดตั้งสำเร็จ
การจัดการข้อผิดพลาด
ส่วนนี้จะอธิบายวิธีแก้ปัญหาข้อผิดพลาดที่พบบ่อย
- หาก UInAppUpdatesManager::StartUpdateแสดงผลข้อผิดพลาดAppUpdate_INVALID_REQUESTแสดงว่าUAppUpdateInfoไม่ถูกต้อง ตรวจสอบว่าออบเจ็กต์UAppUpdateInfoที่แสดงผลจากUInAppUpdatesManager::RequestInfoไม่ใช่ค่า Null ก่อนเริ่มขั้นตอนการอัปเดต
- หาก UInAppUpdatesManager::StartUpdateแสดงข้อผิดพลาดAppUpdate_NOT_ALLOWEDแสดงว่าออบเจ็กต์UAppUpdateOptionsระบุประเภทการอัปเดตที่ไม่อนุญาตให้ใช้กับการอัปเดตที่มีอยู่ ตรวจสอบว่าออบเจ็กต์UAppUpdateInfoระบุว่าอนุญาตให้อัปเดตประเภทที่เลือกหรือไม่ก่อนที่จะเริ่มขั้นตอนการอัปเดต
ขั้นตอนถัดไป
ทดสอบการอัปเดตในแอปของแอปเพื่อยืนยันว่าการผสานรวมทํางานอย่างถูกต้อง
