Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Includi una modalità demo per la vendita nella tua app di Windows in modo che i clienti che provano PC e dispositivi nell'area di vendita possano iniziare subito.
Quando i clienti si trovano in un negozio al dettaglio, si aspettano di poter provare demo di PC e dispositivi. Spesso passano una notevole parte del loro tempo a giocare con le app tramite l'esperienza demo retail (RDX).
È possibile configurare l'app per offrire esperienze diverse in modalità normale o in quella al dettaglio. Ad esempio, se l'app inizia con un processo di configurazione, potresti saltarla in modalità retail e precompilare l'app con dati di esempio e impostazioni predefinite in modo che possano entrare subito.
Dal punto di vista dei clienti, esiste una sola app. Per aiutare i clienti a distinguere tra le due modalità, è consigliabile che mentre l'app sia in modalità retail, viene visualizzata la parola "Retail" in primo piano nella barra del titolo o in una posizione appropriata.
Oltre ai requisiti di Microsoft Store per le app, anche le app compatibili con RDX devono essere compatibili con i processi di installazione, pulizia e aggiornamento RDX per garantire che i clienti abbiano un'esperienza positiva nel negozio al dettaglio.
Principi di progettazione
Mostra ilmigliore. Utilizza l'esperienza demo al dettaglio per mostrare perché la tua app è eccezionale. Questa è probabilmente la prima volta che il cliente visualizzerà la tua app, quindi mostra loro il pezzo migliore!
Mostralo velocemente. I clienti possono essere impazienti: più velocemente un utente può sperimentare il valore reale della tua app, meglio.
Mantenere la storia semplice. L'esperienza demo per la vendita al dettaglio è una presentazione lampo del valore della tua app.
Concentrarsi sull'esperienza. Assegnare all'utente il tempo necessario per digerire il contenuto. Sebbene portarli alla parte migliore sia importante, la progettazione di pause adatte può aiutarli a godere appieno dell'esperienza.
Requisiti tecnici
Poiché le app con riconoscimento RDX sono progettate per mostrare il meglio della tua app ai clienti al dettaglio, devono soddisfare i requisiti tecnici e rispettare le normative sulla privacy che Microsoft Store ha per tutte le app demo di vendita al dettaglio.
Può essere usato come elenco di controllo per preparare il processo di convalida e fornire chiarezza nel processo di test. Si noti che questi requisiti devono essere mantenuti, non solo per il processo di convalida, ma per l'intera durata dell'app per l'esperienza demo al dettaglio; finché l'app rimane in esecuzione nei dispositivi demo al dettaglio.
Requisiti critici
Le applicazioni compatibili con RDX che non soddisfano questi requisiti critici verranno rimosse da tutti i dispositivi demo al dettaglio quanto prima.
Non richiedere informazioni personali (PII). Sono incluse le informazioni di accesso, le informazioni sull'account Microsoft o i dettagli di contatto.
Un'esperienza priva di errori. L'app deve essere eseguita senza errori. Inoltre, non devono essere visualizzati popup o notifiche di errore ai clienti che usano i dispositivi demo al dettaglio. Gli errori riflettono negativamente sull'app stessa, sul tuo marchio, sul marchio del dispositivo, sul marchio del produttore del dispositivo e sul marchio di Microsoft.
le app a pagamento devono avere una modalità di prova. L'app deve essere gratuita o deve includere una modalità di valutazione . I clienti non vogliono pagare per un'esperienza in un negozio al dettaglio.
Requisiti ad alta priorità
Le app con riconoscimento RDX che non soddisfano questi requisiti con priorità elevata devono essere esaminate immediatamente per una correzione. Se non viene trovata alcuna correzione immediata, questa app potrebbe essere rimossa da tutti i dispositivi demo al dettaglio.
esperienza offline memorabile. L'app deve dimostrare un'esperienza offline ottimale, perché circa 50% dei dispositivi sono offline nei punti vendita al dettaglio. In questo modo, i clienti che interagiscono con l'app offline possono comunque avere un'esperienza significativa e positiva.
Esperienza aggiornata dei contenuti. La tua app non dovrebbe mai richiedere aggiornamenti quando è online. Se sono necessari aggiornamenti, devono essere eseguiti in modo invisibile all'utente.
Nessuna comunicazione anonima. Poiché un cliente che usa un dispositivo demo di vendita al dettaglio è un utente anonimo, non deve essere in grado di visualizzare messaggi o condividere contenuti dal dispositivo.
Offrire esperienze coerenti usando il processo di pulizia. Ogni cliente deve avere la stessa esperienza quando passa a un dispositivo demo di vendita al dettaglio. L'app deve usare processo di pulizia per tornare allo stesso stato predefinito dopo ogni uso. Non vogliamo che il cliente successivo veda cosa ha lasciato l'ultimo cliente. Sono inclusi tabelloni di punteggio, obiettivi e sblocchi.
Contenuto appropriato per età. A tutti i contenuti dell'app deve essere assegnata una categoria di classificazione teen o inferiore. Per altre informazioni, vedere Come far valutare la tua app da IARC e classificazioni ESRB.
Requisiti con priorità media
Il team di Windows Retail Store può contattare direttamente gli sviluppatori per configurare una discussione su come risolvere questi problemi.
Capacità di funzionare con successo su una gamma di dispositivi. Le app devono essere eseguite correttamente in tutti i dispositivi, inclusi i dispositivi con specifiche di fascia bassa. Se l'app viene installata nei dispositivi che non soddisfano le specifiche minime, l'app deve informare chiaramente l'utente su questo problema. I requisiti minimi del dispositivo devono essere resi noti in modo che l'app possa essere sempre eseguita con prestazioni elevate.
Soddisfare i requisiti di dimensioni delle app del negozio al dettaglio. L'app deve essere inferiore a 800 MB. Contattare direttamente il team di Windows Retail Store per discutere ulteriormente se l'app compatibile con RDX non soddisfa i requisiti di dimensioni.
API RetailInfo: preparazione del codice per la modalità demo
IsDemoModeEnabled
La proprietà IsDemoModeEnabled nella classe di utilità RetailInfo, che fa parte dello spazio dei nomi Windows.System.Profile nell'SDK di Windows 10 e Windows 11, viene usata come indicatore booleano per specificare su quale percorso di esecuzione si trova l'app: la modalità normale o la modalità retail.
using Windows.Storage;
StorageFolder folder = ApplicationData.Current.LocalFolder;
if (Windows.System.Profile.RetailInfo.IsDemoModeEnabled)
{
// Use the demo specific directory
folder = await folder.GetFolderAsync("demo");
}
StorageFile file = await folder.GetFileAsync("hello.txt");
// Now read from file
using namespace Windows::Storage;
StorageFolder^ localFolder = ApplicationData::Current->LocalFolder;
if (Windows::System::Profile::RetailInfo::IsDemoModeEnabled)
{
// Use the demo specific directory
create_task(localFolder->GetFolderAsync("demo").then([this](StorageFolder^ demoFolder)
{
return demoFolder->GetFileAsync("hello.txt");
}).then([this](task<StorageFile^> fileTask)
{
StorageFile^ file = fileTask.get();
});
// Do something with file
}
else
{
create_task(localFolder->GetFileAsync("hello.txt").then([this](StorageFile^ file)
{
// Do something with file
});
}
if (Windows.System.Profile.retailInfo.isDemoModeEnabled) {
console.log("Retail mode is enabled.");
} else {
Console.log("Retail mode is not enabled.");
}
Proprietà di RetailInfo
Quando la funzione IsDemoModeEnabled restituisce true, è possibile eseguire una query su un insieme di proprietà del dispositivo utilizzando RetailInfo.Properties per creare un'esperienza demo più personalizzata. Queste proprietà includono ManufacturerName, Screensize, Memory e così via.
using Windows.UI.Xaml.Controls;
using Windows.System.Profile
TextBlock priceText = new TextBlock();
priceText.Text = RetailInfo.Properties[KnownRetailInfo.Price];
// Assume infoPanel is a StackPanel declared in XAML
this.infoPanel.Children.Add(priceText);
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::System::Profile;
TextBlock ^manufacturerText = ref new TextBlock();
manufacturerText.set_Text(RetailInfo::Properties[KnownRetailInfoProperties::Price]);
// Assume infoPanel is a StackPanel declared in XAML
this->infoPanel->Children->Add(manufacturerText);
var pro = Windows.System.Profile;
console.log(pro.retailInfo.properties[pro.KnownRetailInfoProperties.price);
"Linguaggio di Definizione dell'Interfaccia (IDL)"
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// WindowsRuntimeAPISet
import "oaidl.idl";
import "inspectable.idl";
import "Windows.Foundation.idl";
#include <sdkddkver.h>
namespace Windows.System.Profile
{
runtimeclass RetailInfo;
runtimeclass KnownRetailInfoProperties;
[version(NTDDI_WINTHRESHOLD), uuid(0712C6B8-8B92-4F2A-8499-031F1798D6EF), exclusiveto(RetailInfo)]
[version(NTDDI_WINTHRESHOLD, Platform.WindowsPhone)]
interface IRetailInfoStatics : IInspectable
{
[propget] HRESULT IsDemoModeEnabled([out, retval] boolean *value);
[propget] HRESULT Properties([out, retval, hasvariant] Windows.Foundation.Collections.IMapView<HSTRING, IInspectable *> **value);
}
[version(NTDDI_WINTHRESHOLD), uuid(50BA207B-33C4-4A5C-AD8A-CD39F0A9C2E9), exclusiveto(KnownRetailInfoProperties)]
[version(NTDDI_WINTHRESHOLD, Platform.WindowsPhone)]
interface IKnownRetailInfoPropertiesStatics : IInspectable
{
[propget] HRESULT RetailAccessCode([out, retval] HSTRING *value);
[propget] HRESULT ManufacturerName([out, retval] HSTRING *value);
[propget] HRESULT ModelName([out, retval] HSTRING *value);
[propget] HRESULT DisplayModelName([out, retval] HSTRING *value);
[propget] HRESULT Price([out, retval] HSTRING *value);
[propget] HRESULT IsFeatured([out, retval] HSTRING *value);
[propget] HRESULT FormFactor([out, retval] HSTRING *value);
[propget] HRESULT ScreenSize([out, retval] HSTRING *value);
[propget] HRESULT Weight([out, retval] HSTRING *value);
[propget] HRESULT DisplayDescription([out, retval] HSTRING *value);
[propget] HRESULT BatteryLifeDescription([out, retval] HSTRING *value);
[propget] HRESULT ProcessorDescription([out, retval] HSTRING *value);
[propget] HRESULT Memory([out, retval] HSTRING *value);
[propget] HRESULT StorageDescription([out, retval] HSTRING *value);
[propget] HRESULT GraphicsDescription([out, retval] HSTRING *value);
[propget] HRESULT FrontCameraDescription([out, retval] HSTRING *value);
[propget] HRESULT RearCameraDescription([out, retval] HSTRING *value);
[propget] HRESULT HasNfc([out, retval] HSTRING *value);
[propget] HRESULT HasSdSlot([out, retval] HSTRING *value);
[propget] HRESULT HasOpticalDrive([out, retval] HSTRING *value);
[propget] HRESULT IsOfficeInstalled([out, retval] HSTRING *value);
[propget] HRESULT WindowsVersion([out, retval] HSTRING *value);
}
[version(NTDDI_WINTHRESHOLD), static(IRetailInfoStatics, NTDDI_WINTHRESHOLD)]
[version(NTDDI_WINTHRESHOLD, Platform.WindowsPhone), static(IRetailInfoStatics, NTDDI_WINTHRESHOLD, Platform.WindowsPhone)]
[threading(both)]
[marshaling_behavior(agile)]
runtimeclass RetailInfo
{
}
[version(NTDDI_WINTHRESHOLD), static(IKnownRetailInfoPropertiesStatics, NTDDI_WINTHRESHOLD)]
[version(NTDDI_WINTHRESHOLD, Platform.WindowsPhone), static(IKnownRetailInfoPropertiesStatics, NTDDI_WINTHRESHOLD, Platform.WindowsPhone)]
[threading(both)]
[marshaling_behavior(agile)]
runtimeclass KnownRetailInfoProperties
{
}
}
Processo di pulizia
La pulizia inizia due minuti dopo che un acquirente smette di interagire con il dispositivo. La demo di vendita al dettaglio viene riprodotta e Windows inizia a reimpostare tutti i dati di esempio nei contatti, nelle foto e in altre app. A seconda del dispositivo, questo potrebbe richiedere tra 1 e 5 minuti per ripristinare completamente tutto il normale. Ciò garantisce che ogni cliente nel negozio di vendita al dettaglio possa raggiungere un dispositivo e avere la stessa esperienza durante l'interazione con il dispositivo.
Passaggio 1: Pulizia
- Tutte le app win32 e dello Store vengono chiuse
- Tutti i file in cartelle note come Immagini, Video, Musica, Documenti, SavedPictures, CameraRoll, Desktop e Download vengono eliminati.
- Gli stati di roaming non strutturati e strutturati vengono eliminati
- Gli stati locali strutturati vengono eliminati
Passaggio 2: Configurazione
- Per i dispositivi offline: le cartelle rimangono vuote
- Per i dispositivi online: è possibile inviare gli asset demo per i punti vendita al dispositivo da Microsoft Store
Archiviare i dati tra sessioni utente
Per archiviare i dati tra le sessioni utente, è possibile archiviare le informazioni in ApplicationData.Current.TemporaryFolder perché il processo di pulizia predefinito non elimina automaticamente i dati in questa cartella. Si noti che le informazioni archiviate usando LocalState vengono eliminate durante il processo di pulizia.
Personalizzare il processo di pulizia
Per personalizzare il processo di pulizia, implementare il servizio app Microsoft-RetailDemo-Cleanup
nell'app.
Gli scenari in cui è necessaria una logica di pulizia personalizzata includono l'esecuzione di un'ampia configurazione, il download e la memorizzazione nella cache dei dati, oppure il desiderio di non eliminare i dati di LocalState.
Passaggio 1: Dichiarare il servizio Microsoft-RetailDemo-Cleanup nel manifesto dell'app.
<Applications>
<Extensions>
<uap:Extension Category="windows.appService" EntryPoint="MyCompany.MyApp.RDXCustomCleanupTask">
<uap:AppService Name="Microsoft-RetailDemo-Cleanup" />
</uap:Extension>
</Extensions>
</Application>
</Applications>
Passaggio 2: Implementare la logica di pulizia personalizzata nel caso della funzione AppdataCleanup utilizzando il modello di esempio seguente.
using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Threading;
using System.Threading.Tasks;
using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.Foundation.Collections;
using Windows.Storage;
namespace MyCompany.MyApp
{
public sealed class RDXCustomCleanupTask : IBackgroundTask
{
BackgroundTaskCancellationReason _cancelReason = BackgroundTaskCancellationReason.Abort;
BackgroundTaskDeferral _deferral = null;
IBackgroundTaskInstance _taskInstance = null;
AppServiceConnection _appServiceConnection = null;
const string MessageCommand = "Command";
public void Run(IBackgroundTaskInstance taskInstance)
{
// Get the deferral object from the task instance, and take a reference to the taskInstance;
_deferral = taskInstance.GetDeferral();
_taskInstance = taskInstance;
_taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);
AppServiceTriggerDetails appService = _taskInstance.TriggerDetails as AppServiceTriggerDetails;
if ((appService != null) && (appService.Name == "Microsoft-RetailDemo-Cleanup"))
{
_appServiceConnection = appService.AppServiceConnection;
_appServiceConnection.RequestReceived += _appServiceConnection_RequestReceived;
_appServiceConnection.ServiceClosed += _appServiceConnection_ServiceClosed;
}
else
{
_deferral.Complete();
}
}
void _appServiceConnection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args)
{
}
async void _appServiceConnection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
//Get a deferral because we will be calling async code
AppServiceDeferral requestDeferral = args.GetDeferral();
string command = null;
var returnData = new ValueSet();
try
{
ValueSet message = args.Request.Message;
if (message.ContainsKey(MessageCommand))
{
command = message[MessageCommand] as string;
}
if (command != null)
{
switch (command)
{
case "AppdataCleanup":
{
// Do custom clean up logic here
break;
}
}
}
}
catch (Exception e)
{
}
finally
{
requestDeferral.Complete();
// Also release the task deferral since we only process one request per instance.
_deferral.Complete();
}
}
private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
_cancelReason = reason;
}
}
}