รองรับการอัปเดตในแอป (Unity)

คู่มือนี้อธิบายวิธีรองรับการอัปเดตในแอปในแอปของคุณโดยใช้ Unity โดยเรามีคู่มือแยกต่างหากสำหรับกรณีที่การติดตั้งใช้งานใช้ภาษาโปรแกรม Kotlin หรือภาษาโปรแกรม Java และกรณีที่การติดตั้งใช้งานใช้ โค้ดแบบเนทีฟ (C/C++)

ภาพรวมของ Unity SDK

Play In-App Update API เป็นส่วนหนึ่งของ Play Core SDK ปลั๊กอิน Unity มีคลาส AppUpdateManager เพื่อจัดการการสื่อสารระหว่างแอปกับ Google Play API คุณต้องสร้างอินสแตนซ์ของคลาสนี้ก่อนจึงจะใช้เพื่อจัดการการอัปเดตในแอปได้

AppUpdateManager appUpdateManager = new AppUpdateManager();

ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์

OpenUPM-CLI

หากคุณติดตั้ง OpenUPM CLI ไว้แล้ว คุณสามารถติดตั้งรีจิสทรี OpenUPM ด้วยคำสั่งต่อไปนี้

openupm add com.google.play.appupdate

OpenUPM

  1. เปิดการตั้งค่าตัวจัดการแพ็กเกจโดยเลือกตัวเลือกเมนู Unity **Edit > Project Settings > Package Manager**

  2. เพิ่ม OpenUPM เป็นรีจิสทรีที่มีขอบเขตในหน้าต่างตัวจัดการแพ็กเกจโดยทำดังนี้

    Name: package.openupm.com
    URL: https://package.openupm.com
    Scopes: com.google.external-dependency-manager
      com.google.play.common
      com.google.play.core
      com.google.play.appupdate
    
  3. เปิดเมนูตัวจัดการแพ็กเกจโดยเลือกตัวเลือกเมนู Unity Window > Package Manager

  4. ตั้งค่าเมนูแบบเลื่อนลงของขอบเขตตัวจัดการให้เลือก My Registries

  5. เลือกแพ็กเกจ Google Play Integrity plugin for Unity จากรายการแพ็กเกจ แล้วกด Install

นำเข้าจาก GitHub

  1. ดาวน์โหลดรุ่น .unitypackage ล่าสุดจาก GitHub

  2. นำเข้าไฟล์ .unitypackage โดยเลือกตัวเลือกเมนู Unity Assets > Import package > Custom Package แล้วนำเข้าทุกรายการ

ตรวจสอบความพร้อมในการอัปเดต

ก่อนขออัปเดต ให้ตรวจสอบว่ามีการอัปเดตพร้อมให้บริการสำหรับ แอปของคุณหรือไม่ ใช้ AppUpdateManager เพื่อตรวจสอบการอัปเดตใน โครูทีนโดยทำดังนี้

IEnumerator CheckForUpdate()
{
  PlayAsyncOperation<AppUpdateInfo, AppUpdateErrorCode> appUpdateInfoOperation =
    appUpdateManager.GetAppUpdateInfo();

  // Wait until the asynchronous operation completes.
  yield return appUpdateInfoOperation;

  if (appUpdateInfoOperation.IsSuccessful)
  {
    var appUpdateInfoResult = appUpdateInfoOperation.GetResult();
    // Check AppUpdateInfo's UpdateAvailability, UpdatePriority,
    // IsUpdateTypeAllowed(), ... and decide whether to ask the user
    // to start an in-app update.
  }
  else
  {
    // Log appUpdateInfoOperation.Error.
  }
}

อินสแตนซ์ AppUpdateInfo ที่แสดงผลจะมีสถานะความพร้อมในการอัปเดต หากการอัปเดตในแอปกำลังดำเนินการอยู่ อินสแตนซ์จะรายงานสถานะของการอัปเดตที่กำลังดำเนินการอยู่ด้วย

ตรวจสอบความเก่าของการอัปเดต

นอกเหนือจากการตรวจสอบว่ามีการอัปเดตพร้อมให้บริการหรือไม่ คุณอาจต้องการตรวจสอบด้วยว่าเวลาผ่านไปนานเท่าใดแล้วนับตั้งแต่ระบบแจ้งให้ผู้ใช้ทราบเกี่ยวกับการอัปเดตครั้งล่าสุดผ่าน Play Store ซึ่งจะช่วยให้คุณตัดสินใจได้ว่าจะเริ่มการอัปเดตแบบยืดหยุ่นหรือการอัปเดตทันที ตัวอย่างเช่น คุณอาจรอ 2-3 วันก่อนที่จะแจ้งให้ผู้ใช้ทราบด้วยการอัปเดตแบบยืดหยุ่น และรออีก 2-3 วันหลังจากนั้นก่อนที่จะกำหนดให้มีการอัปเดตทันที

ใช้ ClientVersionStalenessDays เพื่อตรวจสอบจำนวนวันนับตั้งแต่การอัปเดตพร้อมให้บริการผ่าน Play Store

var stalenessDays = appUpdateInfoOperation.ClientVersionStalenessDays;

ตรวจสอบลำดับความสำคัญของการอัปเดต

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"
  }]
}

ในโค้ดของแอป คุณสามารถตรวจสอบระดับความสำคัญของการอัปเดตที่กำหนดได้โดยใช้ UpdatePriority

var priority = appUpdateInfoOperation.UpdatePriority;

เริ่มการอัปเดต

หลังจากตรวจสอบว่ามีการอัปเดตพร้อมให้บริการแล้ว คุณสามารถขออัปเดตได้โดยใช้ AppUpdateManager.StartUpdate() โปรดตรวจสอบว่าคุณมีออบเจ็กต์ AppUpdateInfo ที่เป็นปัจจุบันก่อนขออัปเดต นอกจากนี้ คุณยังต้องสร้าง AppUpdateOptions ออบเจ็กต์เพื่อกำหนดค่าขั้นตอนการอัปเดตด้วย

ตัวอย่างต่อไปนี้สร้างออบเจ็กต์ AppUpdateOptions สำหรับขั้นตอนการอัปเดตทันที

// Creates an AppUpdateOptions defining an immediate in-app
// update flow and its parameters.
var appUpdateOptions = AppUpdateOptions.ImmediateAppUpdateOptions();

ตัวอย่างต่อไปนี้สร้างออบเจ็กต์ AppUpdateOptions สำหรับขั้นตอนการอัปเดตแบบยืดหยุ่น

// Creates an AppUpdateOptions defining a flexible in-app
// update flow and its parameters.
var appUpdateOptions = AppUpdateOptions.FlexibleAppUpdateOptions();

ออบเจ็กต์ AppUpdateOptions ยังมีช่อง AllowAssetPackDeletion field ที่กำหนดว่าการอัปเดตได้รับอนุญาตให้ล้าง แพ็กเกจเนื้อหา ในกรณีที่ พื้นที่เก็บข้อมูลของอุปกรณ์มีจำกัดหรือไม่ ช่องนี้ตั้งค่าเป็น false โดยค่าเริ่มต้น แต่คุณสามารถส่งอาร์กิวเมนต์ที่ไม่บังคับ allowAssetPackDeletion ไปยัง ImmediateAppUpdateOptions() หรือ FlexibleAppUpdateOptions() เพื่อตั้งค่าเป็น true แทนได้

// Creates an AppUpdateOptions for an immediate flow that allows
// asset pack deletion.
var appUpdateOptions =
  AppUpdateOptions.ImmediateAppUpdateOptions(allowAssetPackDeletion: true);

// Creates an AppUpdateOptions for a flexible flow that allows asset
// pack deletion.
var appUpdateOptions =
  AppUpdateOptions.FlexibleAppUpdateOptions(allowAssetPackDeletion: true);

ขั้นตอนถัดไปจะขึ้นอยู่กับว่าคุณขอการอัปเดตแบบ ยืดหยุ่น หรือ การอัปเดต ทันที

จัดการการอัปเดตแบบยืดหยุ่น

หลังจากมีออบเจ็กต์ AppUpdateInfo ที่เป็นปัจจุบันและออบเจ็กต์ AppUpdateOptions ที่กำหนดค่าอย่างถูกต้องแล้ว คุณสามารถเรียก AppUpdateManager.StartUpdate() เพื่อขอขั้นตอนการอัปเดตแบบไม่พร้อมกันได้

IEnumerator StartFlexibleUpdate()
{
  // Creates an AppUpdateRequest that can be used to monitor the
  // requested in-app update flow.
  var startUpdateRequest = appUpdateManager.StartUpdate(
    // The result returned by PlayAsyncOperation.GetResult().
    appUpdateInfoResult,
    // The AppUpdateOptions created defining the requested in-app update
    // and its parameters.
    appUpdateOptions);

  while (!startUpdateRequest.IsDone)
  {
  // For flexible flow,the user can continue to use the app while
  // the update downloads in the background. You can implement a
  // progress bar showing the download status during this time.
  yield return null;
  }

}

สำหรับการอัปเดตแบบยืดหยุ่น คุณต้องทริกเกอร์การติดตั้งการอัปเดตแอปหลังจากดาวน์โหลดเสร็จสมบูรณ์ โดยเรียก AppUpdateManager.CompleteUpdate() ดังที่แสดงในตัวอย่างต่อไปนี้

IEnumerator CompleteFlexibleUpdate()
{
  var result = appUpdateManager.CompleteUpdate();
  yield return result;

  // If the update completes successfully, then the app restarts and this line
  // is never reached. If this line is reached, then handle the failure (e.g. by
  // logging result.Error or by displaying a message to the user).
}

จัดการการอัปเดตทันที

หลังจากมีออบเจ็กต์ AppUpdateInfo ที่เป็นปัจจุบันและออบเจ็กต์ AppUpdateOptions ที่กำหนดค่าอย่างถูกต้องแล้ว คุณสามารถเรียก AppUpdateManager.StartUpdate() เพื่อขอขั้นตอนการอัปเดตแบบไม่พร้อมกันได้

IEnumerator StartImmediateUpdate()
{
  // Creates an AppUpdateRequest that can be used to monitor the
  // requested in-app update flow.
  var startUpdateRequest = appUpdateManager.StartUpdate(
    // The result returned by PlayAsyncOperation.GetResult().
    appUpdateInfoResult,
    // The AppUpdateOptions created defining the requested in-app update
    // and its parameters.
    appUpdateOptions);
  yield return startUpdateRequest;

  // If the update completes successfully, then the app restarts and this line
  // is never reached. If this line is reached, then handle the failure (for
  // example, by logging result.Error or by displaying a message to the user).
}

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

การจัดการข้อผิดพลาด

ส่วนนี้อธิบายวิธีแก้ปัญหาข้อผิดพลาดที่พบบ่อย

  • หาก StartUpdate() แสดง ArgumentNullException หมายความว่า AppUpdateInfo เป็น Null โปรดตรวจสอบว่าออบเจ็กต์ AppUpdateInfo ที่แสดงผลจาก GetAppUpdateInfo() ไม่ใช่ Null ก่อนเริ่มขั้นตอนการอัปเดต
  • หาก PlayAsyncOperation แสดงรหัสข้อผิดพลาด ErrorUpdateUnavailable โปรดตรวจสอบว่ามีแอปเวอร์ชันอัปเดตที่พร้อมให้บริการซึ่งมีรหัสแอปพลิเคชันและคีย์การลงชื่อเดียวกัน
  • หาก PlayAsyncOperation แสดงรหัสข้อผิดพลาด ErrorUpdateNotAllowed หมายความว่าออบเจ็กต์ AppUpdateOptions ระบุประเภทการอัปเดตที่ไม่ได้รับอนุญาตสำหรับการอัปเดตที่พร้อมให้บริการ โปรดตรวจสอบว่าออบเจ็กต์ AppUpdateInfo ระบุว่าประเภทการอัปเดตที่เลือกได้รับอนุญาตก่อนเริ่มขั้นตอนการอัปเดต

ขั้นตอนถัดไป

ทดสอบการอัปเดตในแอปของแอป เพื่อยืนยันว่าการผสานรวมทำงาน อย่างถูกต้อง