במדריך הזה מוסבר איך לתמוך בעדכונים מתוך האפליקציה באפליקציה שלכם באמצעות 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 ולוחצים על Edit (עריכה) → Plugins (פלאגינים).
מחפשים את Google Play ומסמנים את התיבה מופעל.
מפעילים מחדש את פרויקט המשחק ומפעילים build.
פותחים את הקובץ
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. כך תוכלו להחליט אם להתחיל עדכון גמיש או עדכון מיידי. לדוגמה, אפשר להמתין כמה ימים לפני ששולחים למשתמש עדכון גמיש, וכמה ימים לאחר מכן לפני שדורשים עדכון מיידי.
אפשר להשתמש ב-UAppUpdateInfo:GetClientVersionStalenessDays
כדי לבדוק את מספר הימים מאז שהעדכון זמין בחנות Play:
int32 ClientVersionStalenessDays = UpdateInfo->GetClientVersionStalenessDays();
בדיקת העדיפות של העדכון
Google Play Developer API מאפשר להגדיר את רמת העדיפות של כל עדכון. כך האפליקציה תוכל להחליט עד כמה להמליץ למשתמש על עדכון. לדוגמה, כדאי להשתמש באסטרטגיה הבאה כדי להגדיר את העדיפות של עדכונים:
- שיפורים קלים בממשק המשתמש: עדכון בעדיפות נמוכה. לא צריך לבקש עדכון גמיש או עדכון מיידי.
- שיפורים בביצועים: עדכון בעדיפות בינונית. צריך לבקש עדכון גמיש.
- עדכון אבטחה קריטי: עדכון בעדיפות גבוהה. צריך לבקש עדכון מיידי.
כדי לקבוע את העדיפות, מערכת 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
, אבל אפשר להגדיר אותו כ-true
באמצעות UAppUpdateOptions::SetAssetPackDeletionAllowed
:
// 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
מציין שסוג העדכון שנבחר מותר.
השלבים הבאים
בודקים את העדכונים באפליקציה כדי לוודא שהשילוב פועל כמו שצריך.