שימוש ב-'Google Play ללא התקנה' ב-Unity

אזהרה: התכונה 'Google Play ללא התקנה' לא תהיה זמינה יותר. החל מדצמבר 2025, לא תהיה אפשרות לפרסם אפליקציות ללא התקנה דרך Google Play, וכל ממשקי Instant API של Google Play Services יפסיקו לפעול. המשתמשים לא יקבלו יותר אפליקציות מיידיות מ-Play באמצעות מנגנון כלשהו.

אנחנו מבצעים את השינוי הזה על סמך משוב שקיבלנו ממפתחים וההשקעות המתמשכות שלנו בשיפור הסביבה העסקית מאז השקת Google Play ללא התקנה.

כדי להמשיך לבצע אופטימיזציה לצמיחת מספר המשתמשים, אנחנו ממליצים למפתחים להפנות את המשתמשים לגרסה הרגילה של האפליקציה או המשחק באמצעות קישורי עומק, כדי להפנות אותם למסלולים או לתכונות ספציפיים כשזה רלוונטי.

הפלאגין Google Play Instant ל-Unity מגדיר את פרויקט Unity כך שתיצור גרסה של המשחק כאפליקציה ללא התקנה. במדריך הזה מוסבר איך להתקין את הפלאגין הזה ואיך להשתמש בו.

הורדה וייבוא של הפלאגין

הפלאגין הוא חלק מהפלאגינים של Google Play ל-Unity. כדי לייבא את הפלאגין:

  1. מורידים את הגרסה האחרונה מהגרסאות של הפלאגינים של Google Play ל-Unity.
  2. מייבאים את הקובץ .unitypackage על ידי בחירה באפשרות בתפריט Unity IDE‏ Assets > Import package > Custom Package (נכסים > ייבוא חבילה > חבילה מותאמת אישית) וייבוא של כל הפריטים.

תכונות של Unity Editor

מייבאים את הפלאגין כדי להוסיף תפריט משנה Google > Play ללא התקנה ב-Unity. בתפריט המשנה הזה יש את האפשרויות הבאות.

הגדרות build

נפתח חלון שמאפשר מעבר בין מצבי הפיתוח Installed ו-Instant. המעבר למיידי יגרום לשינויים הבאים:

  • יוצרת סמל הגדרה של סקריפטים בשם PLAY_INSTANT שאפשר להשתמש בו לסקריפטים עם #if PLAY_INSTANT ו-#endif.
  • מנהל עדכונים ב-AndroidManifest.xml לשינויים נדרשים מסוימים, כמו android:targetSandboxVersion.

הגדרות הנגן

בתיבת הדו-שיח Player Settings שמוצגת באיור 1, מוצגות הצעות שיעזרו לכם לבצע אופטימיזציה של התמיכה ב-Google Play Instant, לפתח ממשקי API גרפיים תואמים יותר ולהקטין את הגודל של קובץ ה-APK.

ההצעות הספציפיות כוללות שימוש רק ב-OpenGL ES 2.0 והשבתה של Multithreaded Rendering (רינדור מרובה-שרשורים).
איור 1. תיבת הדו-שיח הגדרות הנגן

הגדרות הנגן האלה מחולקות להגדרות נדרשות ולהגדרות מומלצות. אם להגדרה מסוימת יש לחצן עדכון, לוחצים עליו כדי לשנות את ההגדרה לערך המועדף.

כדי להקטין עוד יותר את גודל ה-APK, פותחים את Unity Package Manager ומסירים חבילות שלא נמצאות בשימוש.

פריסה מהירה

התכונה 'פריסה מהירה' יכולה להקטין את הגודל של אפליקציה ללא התקנה שמבוססת על Unity, על ידי אריזה של חלק מהנכסים ב-AssetBundle. כשמשתמשים בפריסה מהירה, מנוע המשחק Unity ומסך טעינה נארזים ב-APK של אפליקציה ללא התקנה, ואחרי שהאפליקציה ללא התקנה מופעלת, היא מאחזרת את AssetBundle משרת.

תמיכה בתהליכי עבודה של התקנה

המטרה של הרבה אפליקציות מיידיות היא לתת למשתמשים הזדמנות לנסות את האפליקציה לפני שהם מתקינים את הגרסה המלאה. התוסף Google Play Instant ל-Unity מספק ממשקי API להצגת תיבת דו-שיח להתקנה מ-Play Store ולהעברת מצב מאפליקציה ללא התקנה לאפליקציה מותקנת.

הצגת בקשה להתקנה

אפליקציה מיידית עם לחצן התקנה יכולה להציג תיבת דו-שיח להתקנה מחנות Play על ידי קריאה לפונקציה הבאה מתוך handler של לחיצה על לחצן התקנה:

Google.Play.Instant.InstallLauncher.ShowInstallPrompt();

ל-method‏ ShowInstallPrompt() יש עומס יתר שמאפשר לבצע אחת או יותר מהפעולות הבאות:

  • קובעת אם המשתמש ביטל את תהליך ההתקנה. מחליפים את הפונקציה onActivityResult() בפעילות הראשית של האפליקציה ללא התקנה ובודקים אם RESULT_CANCELED מופיע ב-requestCode שצוין.
  • העברת מחרוזת של מקורות תנועה להתקנה באמצעות הפרמטר referrer.
  • העברת נתונים על סשן המשחק הנוכחי באמצעות PutPostInstallIntentStringExtra().

הדוגמה הבאה ממחישה את השימוש בהם:

using Google.Play.Instant;
...
const int requestCode = 123;
var sessionInfo = /* Object serialized as a string representing player's current location, etc. */;
using (var activity = UnityPlayerHelper.GetCurrentActivity())
using (var postInstallIntent = InstallLauncher.CreatePostInstallIntent(activity))
{
    InstallLauncher.PutPostInstallIntentStringExtra(postInstallIntent, "sessionInfo", sessionInfo);
    InstallLauncher.ShowInstallPrompt(activity, requestCode, postInstallIntent, "test-referrer");
}

אם המשתמש משלים את התקנת האפליקציה, חנות Play מפעילה מחדש את האפליקציה באמצעות postInstallIntent שסופק. האפליקציה המותקנת יכולה לאחזר ערך שהוגדר ב-postInstallIntent באמצעות הפעולות הבאות:

var sessionInfo = InstallLauncher.GetPostInstallIntentStringExtra("sessionInfo");

הערות:

  • יכול להיות שהתוספות שנכללות ב-postInstallIntent לא יגיעו לאפליקציה המותקנת אם המשתמש יתקין את האפליקציה אבל יבטל את ההפעלה אחרי ההתקנה. העברת תוספים של כוונות מתאימה יותר לשמירה על מצב של סשן פעיל מאשר לשמירה על מצב מתמשך. כדי לשמור על מצב מתמשך, צריך להשתמש ב-Cookie API.
  • כל אחד יכול ליצור כוונה עם שדות נוספים כדי להפעיל את האפליקציה המותקנת, ולכן אם המטען הייעודי (payload) מעניק משהו בעל ערך, צריך לתכנן אותו כך שאפשר יהיה להשתמש בו רק פעם אחת, לחתום עליו באופן קריפטוגרפי ולאמת את החתימה בשרת.

ה-Cookie API מספק שיטות להעברת קובץ Cookie (למשל, מזהה שחקן או נתונים על השלמת רמה) מאפליקציה מיידית לאפליקציה המותקנת התואמת שלה. בניגוד לpostInstallIntent extras, מצב קובץ ה-Cookie זמין גם אם המשתמש לא מפעיל מיד את האפליקציה המותקנת. לדוגמה, אפליקציה מיידית יכולה לקרוא לקוד הבא מתוך handler של קליק על לחצן התקנה:

using Google.Play.Instant;
...
var playerInfo = /* Object serialized as a string representing game levels completed, etc. */;
var cookieBytes = System.Text.Encoding.UTF8.GetBytes(playerInfo);
try
{
    var maxCookieSize = CookieApi.GetInstantAppCookieMaxSize();
    if (cookieBytes.Length > maxCookieSize)
    {
        UnityEngine.Debug.LogErrorFormat("Cookie length {0} exceeds limit {1}.", cookieBytes.Length, maxCookieSize);
    }
    else if (CookieApi.SetInstantAppCookie(cookieBytes))
    {
        UnityEngine.Debug.Log("Successfully set cookie. Now display the app install dialog...");
        InstallLauncher.ShowInstallPrompt();
    }
    else
    {
        UnityEngine.Debug.LogError("Failed to set cookie.");
    }
}
catch (CookieApi.InstantAppCookieException ex)
{
    UnityEngine.Debug.LogErrorFormat("Failed to set cookie: {0}", ex);
}

אם המשתמש משלים את התקנת האפליקציה, האפליקציה המותקנת יכולה לאחזר את נתוני קובצי ה-Cookie באמצעות הקוד הבא:

var cookieBytes = CookieApi.GetInstantAppCookie();
var playerInfoString = System.Text.Encoding.UTF8.GetString(cookieBytes);
if (!string.IsNullOrEmpty(playerInfoString))
{
    // Initialize game state based on the cookie, e.g. skip tutorial level completed in instant app.
}