Uygulama içi güncellemeleri destekleme (Unity)

Bu kılavuzda, Unity kullanarak uygulamanızda uygulama içi güncellemeleri nasıl destekleyeceğiniz açıklanmaktadır. Uygulamanızda Kotlin programlama dilini veya Java programlama dilini kullandığı ve yerel kod (C/C++) kullanan durumlar için ayrı kılavuzlar mevcuttur.

Geliştirme ortamınızı ayarlama

Unity için Google paketlerinden Play Uygulama İçi Güncelleme Unity Eklentisi'nin son sürümünü indirin.

Unity SDK'ya genel bakış

Play uygulama içi güncelleme API'si, Play Core SDK'sı ailesinin bir parçasıdır. Unity Eklentisi, uygulamanız ve Play API arasındaki iletişimi yönetmek için bir AppUpdateManager sınıfı sunar. Uygulama içi güncellemeleri yönetmek için kullanabilmeniz için önce bu dersi önceden vermeniz gerekir:

AppUpdateManager appUpdateManager = new AppUpdateManager();

Güncelleme olup olmadığını kontrol edin

Güncelleme isteğinde bulunmadan önce uygulamanız için bir güncelleme olup olmadığını kontrol edin. Bir eş yordamdaki güncelleme olup olmadığını kontrol etmek için AppUpdateManager özelliğini kullanın:

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.
  }
}

Döndürülen AppUpdateInfo örneği, güncelleme kullanılabilirlik durumunu içerir. Halihazırda devam eden bir uygulama içi güncelleme varsa örnek, devam eden güncellemenin durumunu da bildirir.

Güncelleme eskiliğini kontrol et

Bir güncelleme olup olmadığını kontrol etmenin yanı sıra kullanıcıya Play Store'dan bir güncellemeyle ilgili olarak en son bilgi verilmesinden bu yana ne kadar süre geçtiğine de göz atabilirsiniz. Bu sayede esnek güncelleme mi yoksa anında güncelleme mi başlatmanız gerektiğine karar verebilirsiniz. Örneğin, kullanıcıyı esnek bir güncellemeyle bilgilendirmeden önce birkaç gün, bundan sonra da hemen güncelleme yapılmasını zorunlu kılmadan önce birkaç gün bekleyebilirsiniz.

Güncellemenin Play Store'da kullanıma sunulmasından bu yana geçen gün sayısını kontrol etmek için ClientVersionStalenessDays adresini kullanın:

var stalenessDays = appUpdateInfoOperation.ClientVersionStalenessDays;

Güncelleme önceliğini kontrol edin

Google Play Geliştirici API'si her güncellemenin önceliğini ayarlamanıza olanak tanır. Bu sayede uygulamanız, kullanıcıya güncelleme önermesinin ne kadar güçlü olacağına karar verebilir. Örneğin, güncelleme önceliğini ayarlamak için aşağıdaki stratejiyi göz önünde bulundurabilirsiniz:

  • Kullanıcı arayüzüyle ilgili küçük iyileştirmeler: Düşük öncelikli güncelleme. Ne esnek güncelleme ne de anında güncelleme isteğinde bulunun.
  • Performans iyileştirmeleri: Orta öncelikli güncelleme; esnek güncelleme isteğinde bulunun.
  • Kritik güvenlik güncellemesi: Yüksek öncelikli güncelleme. Hemen güncelleme isteğinde bulunun.

Google Play, önceliği belirlemek için 0 ile 5 arasında bir tam sayı değeri kullanır. 0 varsayılan, 5 ise en yüksek önceliklidir. Bir güncellemenin önceliğini ayarlamak için Google Play Developer API'de Edits.tracks.releases altındaki inAppUpdatePriority alanını kullanın. Sürüme yeni eklenen tüm sürümlerin, sürümle aynı önceliğe sahip olduğu kabul edilir. Öncelik, yalnızca yeni bir sürüm kullanıma sunulurken ayarlanabilir ve daha sonra değiştirilemez.

Önceliği, Google Play Developer API'yi kullanarak Play Developer API belgelerinde açıklandığı şekilde ayarlayın. Uygulama içi güncelleme önceliği Edit.tracks: update yönteminde iletilen Edit.tracks kaynakta belirtilmelidir. Aşağıdaki örnekte, 88 ve inAppUpdatePriority 5 sürüm kodlarıyla uygulama yayınlama gösterilmektedir:

{
  "releases": [{
      "versionCodes": ["88"],
      "inAppUpdatePriority": 5,
      "status": "completed"
  }]
}

Uygulamanızın kodunda, belirli bir güncellemenin öncelik seviyesini kontrol etmek için UpdatePriority aracını kullanabilirsiniz:

var priority = appUpdateInfoOperation.UpdatePriority;

Güncelleme başlatma

Bir güncellemenin kullanıma sunulduğundan emin olduktan sonra AppUpdateManager.StartUpdate() aracılığıyla güncelleme isteğinde bulunabilirsiniz. Güncelleme isteğinde bulunmadan önce güncel bir AppUpdateInfo nesneniz olduğundan emin olun. Güncelleme akışını yapılandırmak için bir AppUpdateOptions nesnesi de oluşturmanız gerekir.

Aşağıdaki örnek, anında güncelleme akışı için bir AppUpdateOptions nesnesi oluşturur:

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

Aşağıdaki örnek, esnek güncelleme akışı için bir AppUpdateOptions nesnesi oluşturur:

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

AppUpdateOptions nesnesi, güncellemenin cihaz depolama alanının sınırlı olması durumunda öğe paketlerini temizlemesine izin verilip verilmediğini tanımlayan bir AllowAssetPackDeletion alanı da içerir. Bu alan varsayılan olarak false değerine ayarlanmıştır ancak isteğe bağlı allowAssetPackDeletion bağımsız değişkenini ImmediateAppUpdateOptions() veya FlexibleAppUpdateOptions() öğesine ileterek bunun yerine true olarak ayarlayabilirsiniz:

// 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);

Sonraki adımlar, esnek güncelleme mi yoksa hemen güncelleme mi istediğinize bağlıdır.

Esnek güncellemeyi işleme

Güncel bir AppUpdateInfo ve düzgün yapılandırılmış AppUpdateOptions nesneniz olduğunda eşzamansız olarak güncelleme akışı isteğinde bulunmak için AppUpdateManager.StartUpdate() öğesini çağırabilirsiniz.

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;
  }

}

Esnek bir güncelleme akışı için, indirme işlemi başarıyla tamamlandıktan sonra uygulama güncellemesinin yüklenmesini tetiklemeniz gerekir. Bunu yapmak için aşağıdaki örnekte gösterildiği gibi AppUpdateManager.CompleteUpdate() çağrısı yapın:

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).
}

Anında güncelleme yapma

Güncel bir AppUpdateInfo ve düzgün yapılandırılmış AppUpdateOptions nesneniz olduğunda eşzamansız olarak güncelleme akışı isteğinde bulunmak için AppUpdateManager.StartUpdate() öğesini çağırabilirsiniz.

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, anında güncelleme akışı için kullanıcı onayı iletişim kutusunu görüntüler. Kullanıcı isteği kabul ettiğinde Google Play, güncellemeyi otomatik olarak indirip yükler. Daha sonra yükleme başarılı olursa uygulamayı güncellenmiş sürümde yeniden başlatır.

Hata işleme

Bu bölümde sık karşılaşılan hataların çözümleri açıklanmaktadır.

  • StartUpdate() bir ArgumentNullException verirse AppUpdateInfo null demektir. Güncelleme akışını başlatmadan önce, GetAppUpdateInfo() öğesinden döndürülen AppUpdateInfo nesnesinin boş olmadığından emin olun.
  • PlayAsyncOperation, ErrorUpdateUnavailable hata kodunu döndürürse aynı uygulama kimliği ve imzalama anahtarına sahip güncellenmiş bir uygulama sürümü bulunduğundan emin olun.
  • PlayAsyncOperation, ErrorUpdateNotAllowed hata kodunu döndürürse AppUpdateOptions nesnesi, mevcut güncelleme için izin verilmeyen bir güncelleme türünü gösterdiği anlamına gelir. Güncelleme akışını başlatmadan önce, AppUpdateInfo nesnesinin seçilen güncelleme türüne izin verildiğini gösterip göstermediğini kontrol edin.

Sonraki adımlar

Entegrasyonunuzun düzgün çalıştığını doğrulamak için uygulamanızın uygulama içi güncellemelerini test edin.