คู่มือนี้อธิบายวิธีรองรับการอัปเดตในแอปในแอปของคุณโดยใช้ 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.appupdateOpenUPM
เพิ่ม 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เปิดเมนูตัวจัดการแพ็กเกจโดยเลือกตัวเลือกเมนู Unity Window > Package Manager
ตั้งค่าเมนูแบบเลื่อนลงของขอบเขตตัวจัดการให้เลือก My Registries
เลือกแพ็กเกจ Google Play Integrity plugin for Unity จากรายการแพ็กเกจ แล้วกด Install
นำเข้าจาก GitHub
ดาวน์โหลดรุ่น
.unitypackageล่าสุดจาก GitHubนำเข้าไฟล์
.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ระบุว่าประเภทการอัปเดตที่เลือกได้รับอนุญาตก่อนเริ่มขั้นตอนการอัปเดต
ขั้นตอนถัดไป
ทดสอบการอัปเดตในแอปของแอป เพื่อยืนยันว่าการผสานรวมทำงาน อย่างถูกต้อง