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

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

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

ดาวน์โหลดปลั๊กอิน Unity สำหรับการอัปเดตแอป Play รุ่นล่าสุดจากแพ็กเกจ Google สำหรับ Unity

ภาพรวมของ Unity SDK

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

AppUpdateManager appUpdateManager = new AppUpdateManager();

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

ก่อนที่จะขออัปเดต ให้ตรวจสอบว่ามีการอัปเดตสำหรับ แอป ใช้ AppUpdateManager เพื่อตรวจหาอัปเดตใน coroutine

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(), etc. and decide whether to ask the user
    // to start an in-app update.
  }
  else
  {
    // Log appUpdateInfoOperation.Error.
  }
}

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

ตรวจหาอัปเดตที่ไม่มีอัปเดต

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

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

var stalenessDays = appUpdateInfoOperation.ClientVersionStalenessDays;

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

API สำหรับนักพัฒนาซอฟต์แวร์ Google Play ช่วยให้คุณสามารถกำหนดลำดับความสำคัญของการอัปเดตแต่ละครั้งได้ วิธีนี้ช่วยให้แอปของคุณตัดสินใจได้ว่าจะแนะนำการอัปเดตให้กับผู้ใช้มากแค่ไหน ตัวอย่างเช่น ลองพิจารณากลยุทธ์ต่อไปนี้ในการตั้งค่าลำดับความสำคัญของการอัปเดต

  • การปรับปรุง UI เล็กน้อย: การอัปเดตลำดับความสำคัญต่ำ ไม่ใช่คำขอที่ยืดหยุ่น หรือการอัปเดตทันที
  • การปรับปรุงประสิทธิภาพ: การอัปเดตลำดับความสำคัญปานกลาง ขอใบอนุญาตที่ยืดหยุ่น อัปเดต
  • การอัปเดตความปลอดภัยที่สำคัญ: การอัปเดตลำดับความสำคัญสูง ขอทันที อัปเดต

ในการกำหนดลำดับความสำคัญ Google Play จะใช้ค่าจำนวนเต็มระหว่าง 0 ถึง 5 โดยมี 0 คือค่าเริ่มต้น และ 5 คือลำดับความสำคัญสูงสุด วิธีกำหนดลำดับความสำคัญสำหรับ อัปเดต ให้ใช้ฟิลด์ inAppUpdatePriority ใต้ Edits.tracks.releases ในส่วน API สำหรับนักพัฒนาซอฟต์แวร์ Google Play เวอร์ชันที่เพิ่มเข้ามาใหม่ทั้งหมดในรุ่นนี้ ถือได้ว่ามีความสำคัญ เท่ากับการเปิดตัว จะกำหนดลำดับความสำคัญได้ก็ต่อเมื่อ เปิดตัวรุ่นใหม่และไม่สามารถเปลี่ยนแปลงในภายหลังได้

กำหนดลำดับความสำคัญโดยใช้ API สำหรับนักพัฒนาซอฟต์แวร์ Google Play ตามที่อธิบายไว้ใน Play 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 ด้วย ซึ่งกำหนดว่าการอัปเดตจะล้างเนื้อหาหรือไม่ แพ็กในกรณีที่อุปกรณ์มีพื้นที่จัดเก็บจำกัด ช่วงเวลานี้ จะถูกตั้งค่าเป็น 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 เป็นค่าว่าง ตรวจสอบว่าออบเจ็กต์ AppUpdateInfo ที่แสดงผลจาก GetAppUpdateInfo() มีข้อมูลที่เป็นค่าว่างก่อนเริ่มขั้นตอนการอัปเดต
  • หาก PlayAsyncOperation แสดงรหัสข้อผิดพลาด ErrorUpdateUnavailable โปรด ตรวจสอบว่ามีแอปเวอร์ชันที่อัปเดตแล้ว ซึ่งมีแอปพลิเคชันเดียวกัน ID และคีย์ Signing
  • หาก PlayAsyncOperation แสดงผลรหัสข้อผิดพลาด ErrorUpdateNotAllowed หมายความว่าออบเจ็กต์ AppUpdateOptions ระบุประเภทการอัปเดตที่ไม่ใช่ ได้รับอนุญาตสำหรับการอัปเดตที่มีอยู่ ตรวจสอบว่าออบเจ็กต์ AppUpdateInfo หรือไม่ ระบุว่าอนุญาตประเภทการอัปเดตที่เลือกก่อนที่จะเริ่มการอัปเดต

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

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