Paket güncelleştirmelerini Mağaza'dan indirme ve yükleme

Windows 10, sürüm 1607'den başlayarak, Windows.Services.Store ad alanındaki StoreContext sınıfının yöntemlerini kullanarak Microsoft Store'dan geçerli uygulamanın paket güncelleştirmelerini program aracılığıyla denetleyebilir ve güncelleştirilmiş paketleri indirip yükleyebilirsiniz. Ayrıca İş Ortağı Merkezi'nde zorunlu olarak işaretlediğiniz paketleri sorgulayabilir ve zorunlu güncelleştirme yüklenene kadar uygulamanızdaki işlevselliği devre dışı bırakabilirsiniz.

Windows 10, sürüm 1803'te kullanıma sunulan StoreContext yöntemleri, paket güncelleştirmelerini sessizce indirip yüklemenize (kullanıcıya bildirim kullanıcı arabirimi görüntülemeden), isteğe bağlı paketkaldırmanıza ve uygulamanızın indirme ve yükleme kuyruğundaki paketler hakkında bilgi almanıza olanak tanır.

Bu özellikler uygulamanızın en son sürümü, isteğe bağlı paketler ve Mağaza'daki ilgili hizmetlerle kullanıcı tabanınızı otomatik olarak güncel tutmanıza yardımcı olur.

Kullanıcının izniyle paket güncelleştirmelerini indirme ve yükleme

Bu kod örneğinde, Mağaza'dan tüm kullanılabilir paket güncelleştirmelerini keşfetmek için GetAppAndOptionalStorePackageUpdatesAsync yönteminin nasıl kullanılacağı ve ardından güncelleştirmeleri indirmek ve yüklemek için RequestDownloadAndInstallStorePackageUpdatesAsync yönteminin nasıl kullanılacağı gösterilmektedir. güncelleştirmeleri indirmek ve yüklemek için bu yöntemi kullanırken işletim sistemi, güncelleştirmeleri indirmeden önce kullanıcının iznini isteyen bir iletişim kutusu görüntüler.

Uyarı

Bu yöntemler uygulamanız için gerekli ve isteğe bağlı paketler destekler. İsteğe bağlı paketler indirilebilir içerik (DLC) eklentileri için, büyük uygulamanızı boyut kısıtlamaları için bölmek veya çekirdek uygulamanızdan ayrı olarak ek içerik göndermek için kullanışlıdır. İsteğe bağlı paketleri (DLC eklentileri dahil) kullanan bir uygulamayı Mağaza'ya gönderme izni almak için bkz. Windows geliştirici desteği.

Bu kod örneğinde aşağıdakiler varsayılır:

  • Kod, Sayfasıbağlamında çalışır.
  • Sayfası, indirme işleminin durumunu sağlamak için adlı downloadProgressBar içerir.
  • Kod dosyası, `using` ifadesini Windows.Services.Store, Windows.Threading.Tasksve Windows.UI.Popups ad alanları için içerir.
  • Uygulama, yalnızca uygulamayı başlatan kullanıcı bağlamında çalışan tek kullanıcılı bir uygulamadır. çok kullanıcılı bir uygulama için, GetDefault yöntemi yerine StoreContext nesnesi almak için GetForUser yöntemini kullanın.
private StoreContext context = null;

public async Task DownloadAndInstallAllUpdatesAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    // Get the updates that are available.
    IReadOnlyList<StorePackageUpdate> updates =
        await context.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count > 0)
    {
        // Alert the user that updates are available and ask for their consent
        // to start the updates.
        MessageDialog dialog = new MessageDialog(
            "Download and install updates now? This may cause the application to exit.", "Download and Install?");
        dialog.Commands.Add(new UICommand("Yes"));
        dialog.Commands.Add(new UICommand("No"));
        IUICommand command = await dialog.ShowAsync();

        if (command.Label.Equals("Yes", StringComparison.CurrentCultureIgnoreCase))
        {
            // Download and install the updates.
            IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation =
                context.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);

            // The Progress async method is called one time for each step in the download
            // and installation process for each package in this request.
            downloadOperation.Progress = async (asyncInfo, progress) =>
            {
                await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                () =>
                {
                    downloadProgressBar.Value = progress.PackageDownloadProgress;
                });
            };

            StorePackageUpdateResult result = await downloadOperation.AsTask();
        }
    }
}

Uyarı

Kullanılabilir paket güncelleştirmelerini yalnızca indirmek (yüklemek değil) için RequestDownloadStorePackageUpdatesAsync yöntemini kullanın.

İndirme ve yükleme ilerleme bilgilerini görüntüleme

RequestDownloadStorePackageUpdatesAsync veya RequestDownloadAndInstallStorePackageUpdatesAsync yöntemini çağırdığınızda, bu istekteki her bir paket için indirme (veya indirme ve yükleme) sürecindeki her adımda bir kez çağrılan bir İlerleme işleyicisi atayabilirsiniz. İşleyici, ilerleme bildirimini oluşturan güncelleştirme paketi hakkında bilgi sağlayan bir StorePackageUpdateStatus nesnesi alır. Önceki örnek, indirme ve yükleme işleminin ilerleme durumunu görüntülemek için StorePackageUpdateStatus nesnesinin PackageDownloadProgress alanını kullanır.

Paket güncelleştirmelerini tek bir işlemde indirmek ve yüklemek için RequestDownloadAndInstallStorePackageUpdatesAsync çağırdığınızda PackageDownloadProgress alanının bir paketin indirme işlemi sırasında 0,0'dan 0,8'e yükseldiğini ve yükleme sırasında 0,8'den 1,0'a yükseldiğini unutmayın. Bu nedenle, özel ilerleme kullanıcı arabiriminizde gösterilen yüzdeyi doğrudan PackageDownloadProgress alanının değeriyle eşlerseniz, paketin indirilmesi tamamlandığında ve işletim sistemi yükleme iletişim kutusunu görüntülediğinde kullanıcı arabiriminiz 80% gösterir. Özel ilerleme kullanıcı arabiriminizin paket indirildiğinde ve yüklenmeye hazır olduğunda 100% görüntülemesini istiyorsanız, PackageDownloadProgress alanı 0,8'e ulaştığında kodunuzu ilerleme kullanıcı arabiriminize 100% atayacak şekilde değiştirebilirsiniz.

Paket güncelleştirmelerini sessizce indirme ve yükleme

Windows 10, sürüm 1803'te başlayarak TrySilentDownloadStorePackageUpdatesAsync ve TrySilentDownloadAndInstallStorePackageUpdatesAsync yöntemlerini kullanarak kullanıcıya bildirim kullanıcı arabirimi görüntülemeden paket güncelleştirmelerini sessizce indirip yükleyebilirsiniz. Bu işlem yalnızca kullanıcı Mağaza'da uygulamaları otomatik olarak güncelleştir ayarını etkinleştirmişse ve kullanıcı tarifeli bir ağda değilse başarılı olur. Bu yöntemleri çağırmadan önce, bu koşulların şu anda karşılanıp karşılanmadığını belirlemek için canSilentlyDownloadStorePackageUpdates özelliğini denetleyebilirsiniz.

Bu kod örneği, kullanılabilir tüm paket güncelleştirmelerini bulmak ve ardından TrySilentDownloadStorePackageUpdatesAsync ve TrySilentDownloadAndInstallStorePackageUpdatesAsync yöntemlerini çağırarak güncelleştirmeleri sessizce indirip yüklemek için GetAppAndOptionalStorePackageUpdatesAsync yönteminin nasıl kullanılacağını gösterir.

Bu kod örneğinde aşağıdakiler varsayılır:

  • Kod dosyası, Windows.Services.Store ve System.Threading.Tasks ad alanları için deyimine sahip olan bir içerir.
  • Uygulama, yalnızca uygulamayı başlatan kullanıcı bağlamında çalışan tek kullanıcılı bir uygulamadır. çok kullanıcılı bir uygulama için, GetDefault yöntemi yerine StoreContext nesnesi almak için GetForUser yöntemini kullanın.

Uyarı

IsNowAGoodTimeToRestartApp, RetryDownloadAndInstallLaterve RetryInstallLater yöntemleri, bu örnekteki kod tarafından çağrılan yer tutucu yöntemler, kendi uygulamanızın tasarımına göre gerektiğinde uygulanması amaçlanan yer tutucu yöntemlerdir.

private StoreContext context = null;

public async Task DownloadAndInstallAllUpdatesInBackgroundAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    // Get the updates that are available.
    IReadOnlyList<StorePackageUpdate> storePackageUpdates =
        await context.GetAppAndOptionalStorePackageUpdatesAsync();

    if (storePackageUpdates.Count > 0)
    {

        if (!context.CanSilentlyDownloadStorePackageUpdates)
        {
            return;
        }

        // Start the silent downloads and wait for the downloads to complete.
        StorePackageUpdateResult downloadResult =
            await context.TrySilentDownloadStorePackageUpdatesAsync(storePackageUpdates);

        switch (downloadResult.OverallState)
        {
            case StorePackageUpdateState.Completed:
                // The download has completed successfully. At this point, confirm whether your app
                // can restart now and then install the updates (for example, you might only install
                // packages silently if your app has been idle for a certain period of time). The
                // IsNowAGoodTimeToRestartApp method is not implemented in this example, you should
                // implement it as needed for your own app.
                if (IsNowAGoodTimeToRestartApp())
                {
                    await InstallUpdate(storePackageUpdates);
                }
                else
                {
                    // Retry/reschedule the installation later. The RetryInstallLater method is not  
                    // implemented in this example, you should implement it as needed for your own app.
                    RetryInstallLater();
                    return;
                }
                break;
            // If the user cancelled the download or you can't perform the download for some other
            // reason (for example, Wi-Fi might have been turned off and the device is now on
            // a metered network) try again later. The RetryDownloadAndInstallLater method is not  
            // implemented in this example, you should implement it as needed for your own app.
            case StorePackageUpdateState.Canceled:
            case StorePackageUpdateState.ErrorLowBattery:
            case StorePackageUpdateState.ErrorWiFiRecommended:
            case StorePackageUpdateState.ErrorWiFiRequired:
            case StorePackageUpdateState.OtherError:
                RetryDownloadAndInstallLater();
                return;
            default:
                break;
        }
    }
}

private async Task InstallUpdate(IReadOnlyList<StorePackageUpdate> storePackageUpdates)
{
    // Start the silent installation of the packages. Because the packages have already
    // been downloaded in the previous method, the following line of code just installs
    // the downloaded packages.
    StorePackageUpdateResult downloadResult =
        await context.TrySilentDownloadAndInstallStorePackageUpdatesAsync(storePackageUpdates);

    switch (downloadResult.OverallState)
    {
        // If the user cancelled the installation or you can't perform the installation  
        // for some other reason, try again later. The RetryInstallLater method is not  
        // implemented in this example, you should implement it as needed for your own app.
        case StorePackageUpdateState.Canceled:
        case StorePackageUpdateState.ErrorLowBattery:
        case StorePackageUpdateState.OtherError:
            RetryInstallLater();
            return;
        default:
            break;
    }
}

Zorunlu paket güncelleştirmeleri

Windows 10'un 1607 veya sonraki sürümlerini hedefleyen bir uygulama için Partner Merkezi'nde bir paket gönderimi oluşturduğunuzda, paketi zorunlu olarak ve hangi tarih ve saatte zorunlu hale geleceğini belirtecek şekilde işaretleyebilirsiniz. Bu özellik ayarlandığında ve uygulamanız paket güncelleştirmesinin kullanılabilir olduğunu keşfettiğinde, uygulamanız güncelleştirme paketinin zorunlu olup olmadığını belirleyebilir ve güncelleştirme yüklenene kadar davranışını değiştirebilir (örneğin, uygulamanız özellikleri devre dışı bırakabilir).

Uyarı

Paket güncelleştirmesinin zorunlu durumu Microsoft tarafından zorunlu tutulmaz ve işletim sistemi kullanıcılara zorunlu bir uygulama güncelleştirmesinin yüklenmesi gerektiğini belirten bir kullanıcı arabirimi sağlamaz. Geliştiriciler, zorunlu uygulama güncelleştirmelerini kendi kodlarında zorunlu hale getirmek için zorunlu ayarı kullanmaya yöneliktir.

Paket gönderimini zorunlu olarak işaretlemek için:

  1. İş Ortağı Merkezi oturum açın ve uygulamanızın genel bakış sayfasına gidin.
  2. Zorunlu hale getirmek istediğiniz paket güncelleştirmesini içeren gönderimin adına tıklayın.
  3. Gönderim için Paketleri sayfasına gidin. Bu sayfanın alt kısmındaki Bu güncelleştirmeyi zorunlu yap seçin ve ardından paket güncelleştirmesinin zorunlu hale geldiği gün ve saati seçin. Bu seçenek, gönderimdeki tüm UWP paketleri için geçerlidir.

Daha fazla bilgi için uygulama paketlerini karşıya yüklemesayfasına bakın.

Uyarı

Eğer bir paket uçuşuoluşturursanız, Paketler sayfasında benzer bir kullanıcı arabirimi kullanarak paketleri zorunlu olarak işaretleyebilirsiniz. Bu durumda zorunlu paket güncelleştirmesi yalnızca uçuş grubunun parçası olan müşteriler için geçerlidir.

Zorunlu paketler için kod örneği

Aşağıdaki kod örneği, herhangi bir güncelleştirme paketinin zorunlu olup olmadığının nasıl belirleneceğini gösterir. Genellikle, zorunlu bir paket güncellemesi başarıyla indirilmez veya yüklenmezse, kullanıcı için uygulama deneyimini düzgün bir şekilde azaltmanız gerekir.

private StoreContext context = null;

// Downloads and installs package updates in separate steps.
public async Task DownloadAndInstallAllUpdatesAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }  

    // Get the updates that are available.
    IReadOnlyList<StorePackageUpdate> updates =
        await context.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count != 0)
    {
        // Download the packages.
        bool downloaded = await DownloadPackageUpdatesAsync(updates);

        if (downloaded)
        {
            // Install the packages.
            await InstallPackageUpdatesAsync(updates);
        }
    }
}

// Helper method for downloading package updates.
private async Task<bool> DownloadPackageUpdatesAsync(IEnumerable<StorePackageUpdate> updates)
{
    bool downloadedSuccessfully = false;

    IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation =
        this.context.RequestDownloadStorePackageUpdatesAsync(updates);

    // The Progress async method is called one time for each step in the download process for each
    // package in this request.
    downloadOperation.Progress = async (asyncInfo, progress) =>
    {
        await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
        () =>
        {
            downloadProgressBar.Value = progress.PackageDownloadProgress;
        });
    };

    StorePackageUpdateResult result = await downloadOperation.AsTask();

    switch (result.OverallState)
    {
        case StorePackageUpdateState.Completed:
            downloadedSuccessfully = true;
            break;
        default:
            // Get the failed updates.
            var failedUpdates = result.StorePackageUpdateStatuses.Where(
                status => status.PackageUpdateState != StorePackageUpdateState.Completed);

            // See if any failed updates were mandatory
            if (updates.Any(u => u.Mandatory && failedUpdates.Any(
                failed => failed.PackageFamilyName == u.Package.Id.FamilyName)))
            {
                // At least one of the updates is mandatory. Perform whatever actions you
                // want to take for your app: for example, notify the user and disable
                // features in your app.
                HandleMandatoryPackageError();
            }
            break;
    }

    return downloadedSuccessfully;
}

// Helper method for installing package updates.
private async Task InstallPackageUpdatesAsync(IEnumerable<StorePackageUpdate> updates)
{
    IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> installOperation =
        this.context.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);

    // The package updates were already downloaded separately, so this method skips the download
    // operation and only installs the updates; no download progress notifications are provided.
    StorePackageUpdateResult result = await installOperation.AsTask();

    switch (result.OverallState)
    {
        case StorePackageUpdateState.Completed:
            break;
        default:
            // Get the failed updates.
            var failedUpdates = result.StorePackageUpdateStatuses.Where(
                status => status.PackageUpdateState != StorePackageUpdateState.Completed);

            // See if any failed updates were mandatory
            if (updates.Any(u => u.Mandatory && failedUpdates.Any(failed => failed.PackageFamilyName == u.Package.Id.FamilyName)))
            {
                // At least one of the updates is mandatory, so tell the user.
                HandleMandatoryPackageError();
            }
            break;
    }
}

// Helper method for handling the scenario where a mandatory package update fails to
// download or install. Add code to this method to perform whatever actions you want
// to take, such as notifying the user and disabling features in your app.
private void HandleMandatoryPackageError()
{
}

İsteğe bağlı paketleri kaldırma

Windows 10, sürüm 1803'te başlayarak, geçerli uygulama için isteğe bağlı bir paket (DLC paketi dahil) kaldırmak için RequestUninstallStorePackageAsync veya RequestUninstallStorePackageByStoreIdAsync yöntemlerini kullanabilirsiniz. Örneğin, isteğe bağlı paketler aracılığıyla yüklenen içeriğe sahip bir uygulamanız varsa, kullanıcıların diskte yer açmak için isteğe bağlı paketleri kaldırmasına olanak tanıyan bir kullanıcı arabirimi sağlamak isteyebilirsiniz.

Aşağıdaki kod örneği, RequestUninstallStorePackageAsyncnasıl çağrılduğunu gösterir. Bu örnekte aşağıdakiler varsayılır:

  • Kod dosyası, Windows.Services.Store ve System.Threading.Tasks ad alanları için deyimine sahip olan bir içerir.
  • Uygulama, yalnızca uygulamayı başlatan kullanıcı bağlamında çalışan tek kullanıcılı bir uygulamadır. çok kullanıcılı bir uygulama için, GetDefault yöntemi yerine StoreContext nesnesi almak için GetForUser yöntemini kullanın.
public async Task UninstallPackage(Windows.ApplicationModel.Package package)
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    var storeContext = StoreContext.GetDefault();
    IAsyncOperation<StoreUninstallStorePackageResult> uninstallOperation =
        storeContext.RequestUninstallStorePackageAsync(package);

    // At this point, you can update your app UI to show that the package
    // is installing.

    uninstallOperation.Completed += (asyncInfo, status) =>
    {
        StoreUninstallStorePackageResult result = uninstallOperation.GetResults();
        switch (result.Status)
        {
            case StoreUninstallStorePackageStatus.Succeeded:
                {
                    // Update your app UI to show the package as uninstalled.
                    break;
                }
            default:
                {
                    // Update your app UI to show that the package uninstall failed.
                    break;
                }
        }
    };
}

İndirme kuyruğu bilgilerini alma

Windows 10, sürüm 1803'ten başlayarak, Mağaza'dan geçerli indirme ve yükleme kuyruğundaki paketler hakkında bilgi almak için GetAssociatedStoreQueueItemsAsync ve GetStoreQueueItemsAsync yöntemlerini kullanabilirsiniz. Uygulamanız veya oyununuz indirilmesi ve yüklenmesi saatler veya günler sürebilen büyük isteğe bağlı paketleri (DC'ler dahil) destekliyorsa ve indirme ve yükleme işlemi tamamlanmadan önce bir müşterinin uygulamanızı veya oyununuzu kapatması durumunu düzgün bir şekilde işlemek istiyorsanız bu yöntemler kullanışlıdır. Müşteri uygulamanızı veya oyununuzu yeniden başlattığında kodunuz, her paketin durumunu müşteriye görüntüleyebilmeniz için indirme ve yükleme kuyruğunda bulunan paketlerin durumu hakkında bilgi almak için bu yöntemleri kullanabilir.

Aşağıdaki kod örneğinde, geçerli uygulama için devam eden paket güncelleştirmelerinin listesini almak ve her paket için durum bilgilerini almak üzere GetAssociatedStoreQueueItemsAsync nasıl çağrılması gösterilmektedir. Bu örnekte aşağıdakiler varsayılır:

  • Kod dosyası, Windows.Services.Store ve System.Threading.Tasks ad alanları için deyimine sahip olan bir içerir.
  • Uygulama, yalnızca uygulamayı başlatan kullanıcı bağlamında çalışan tek kullanıcılı bir uygulamadır. çok kullanıcılı bir uygulama için, GetDefault yöntemi yerine StoreContext nesnesi almak için GetForUser yöntemini kullanın.

Uyarı

MarkUpdateInProgressInUI, RemoveItemFromUI, MarkInstallCompleteInUI, MarkInstallErrorInUI, MarkInstallPausedInUI yöntemleri, bu örnekteki kod tarafından çağrılan ve kendi uygulamanızın tasarımına göre gerektiğinde uygulanması amaçlanan geçici yöntemlerdir.

private StoreContext context = null;

private async Task GetQueuedInstallItemsAndBuildInitialStoreUI()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
    }

    // Get the Store packages in the install queue.
    IReadOnlyList<StoreQueueItem> storeUpdateItems = await context.GetAssociatedStoreQueueItemsAsync();

    foreach (StoreQueueItem storeItem in storeUpdateItems)
    {
        // In this example we only care about package updates.
        if (storeItem.InstallKind != StoreQueueItemKind.Update)
            continue;

        StoreQueueItemStatus currentStatus = storeItem.GetCurrentStatus();
        StoreQueueItemState installState = currentStatus.PackageInstallState;
        StoreQueueItemExtendedState extendedInstallState =
            currentStatus.PackageInstallExtendedState;

        // Handle the StatusChanged event to display current status to the customer.
        storeItem.StatusChanged += StoreItem_StatusChanged;

        switch (installState)
        {
            // Download and install are still in progress, so update the status for this  
            // item and provide the extended state info. The following methods are not
            // implemented in this example; you should implement them as needed for your
            // app's UI.
            case StoreQueueItemState.Active:
                MarkUpdateInProgressInUI(storeItem, extendedInstallState);
                break;
            case StoreQueueItemState.Canceled:
                RemoveItemFromUI(storeItem);
                break;
            case StoreQueueItemState.Completed:
                MarkInstallCompleteInUI(storeItem);
                break;
            case StoreQueueItemState.Error:
                MarkInstallErrorInUI(storeItem);
                break;
            case StoreQueueItemState.Paused:
                MarkInstallPausedInUI(storeItem, installState, extendedInstallState);
                break;
        }
    }
}

private void StoreItem_StatusChanged(StoreQueueItem sender, object args)
{
    StoreQueueItemStatus currentStatus = sender.GetCurrentStatus();
    StoreQueueItemState installState = currentStatus.PackageInstallState;
    StoreQueueItemExtendedState extendedInstallState = currentStatus.PackageInstallExtendedState;

    switch (installState)
    {
        // Download and install are still in progress, so update the status for this  
        // item and provide the extended state info. The following methods are not
        // implemented in this example; you should implement them as needed for your
        // app's UI.
        case StoreQueueItemState.Active:
            MarkUpdateInProgressInUI(sender, extendedInstallState);
            break;
        case StoreQueueItemState.Canceled:
            RemoveItemFromUI(sender);
            break;
        case StoreQueueItemState.Completed:
            MarkInstallCompleteInUI(sender);
            break;
        case StoreQueueItemState.Error:
            MarkInstallErrorInUI(sender);
            break;
        case StoreQueueItemState.Paused:
            MarkInstallPausedInUI(sender, installState, extendedInstallState);
            break;
    }
}