Condividi tramite


App adattive per la versione: usare nuove API mantenendo la compatibilità con le versioni precedenti

Ogni versione dell'SDK di Windows 10 aggiunge nuove funzionalità interessanti da sfruttare. Tuttavia, non tutti i tuoi clienti aggiorneranno i propri dispositivi alla versione più recente di Windows 10 contemporaneamente e vuoi assicurarti che l'app funzioni sulla più ampia gamma possibile di dispositivi. Qui viene illustrato come progettare l'app in modo che venga eseguita in versioni precedenti di Windows 10, ma sfrutta anche le nuove funzionalità ogni volta che l'app viene eseguita in un dispositivo con l'aggiornamento più recente installato.

Esistono 3 passaggi da eseguire per assicurarsi che l'app supporti la gamma più ampia di dispositivi Windows 10.

  • Prima di tutto, configurare il progetto di Visual Studio come destinazione delle API più recenti. Ciò influisce su ciò che accade quando si compila l'app.
  • In secondo luogo, eseguire controlli di runtime per assicurarsi di chiamare solo le API presenti nel dispositivo in cui è in esecuzione l'app.
  • In terzo luogo, testare l'app nella versione minima e nella versione di destinazione di Windows 10.

Configurare il progetto Visual Studio

Il primo passaggio per supportare più versioni di Windows 10 consiste nel specificare il Target e Minimum versioni di OS/SDK supportate nel progetto Visual Studio.

  • Target: la versione dell'SDK che Visual Studio compila per il codice dell'app ed esegue tutti gli strumenti. Tutte le API e le risorse in questa versione dell'SDK sono disponibili nel codice dell'app in fase di compilazione.
  • Minimum: la versione dell'SDK che supporta la versione meno recente del sistema operativo su cui l'app può essere eseguita (e verrà distribuita dallo Store) e la versione che Visual Studio compila il codice di markup dell'app.

Durante il runtime l'app verrà eseguita sulla versione del sistema operativo in cui viene distribuita, quindi l'app genererà eccezioni se si usano risorse o si chiamano API non disponibili in tale versione. Ti mostriamo come utilizzare i controlli durante l'esecuzione per chiamare le API corrette più avanti.

Le impostazioni Target e Minimum specificano le estremità di un intervallo di versioni di OS/SDK. Tuttavia, se esegui il test dell'app sulla versione minima, puoi assicurarti che venga eseguita in qualsiasi versione tra minimo e destinazione.

Suggerimento

Visual Studio non segnala la compatibilità delle API. È responsabilità dell'utente testare e assicurarsi che l'app venga eseguita come previsto in tutte le versioni del sistema operativo comprese tra il minimo e l'obiettivo.

Quando crei un nuovo progetto in Visual Studio 2015, Update 2 o versione successiva, ti viene richiesto di impostare le versioni target e minime supportate dall'app. Per impostazione predefinita, la versione di destinazione è la versione più recente dell'SDK installata e la versione minima dell'SDK è la versione minima installata. È possibile scegliere la Destinazione e la Versione Minima solo dalle versioni SDK installate sul computer.

Imposta l'SDK di destinazione in Visual Studio

In genere è consigliabile lasciare le impostazioni predefinite. Tuttavia, se è installata una versione di anteprima dell'SDK e si scrive codice di produzione, è necessario modificare la versione di destinazione da Preview SDK alla versione ufficiale più recente dell'SDK.

Per modificare la versione minima e di destinazione per un progetto già creato in Visual Studio, passare a Progetto -> Proprietà -> scheda Applicazione -> Destinazione.

Change l'SDK di destinazione in Visual Studio

Per riferimento, la tabella seguente illustra i numeri di build per ogni SDK.

Nome amichevole Versione Compilazione del sistema operativo/SDK
RTM 1507 10240
Aggiornamento di novembre 1511 10586
Aggiornamento Anniversario 1607 14393
Creators Update 1703 15063
Fall Creators Update 1709 16299
Aggiornamento di aprile 2018 1803 17134
Aggiornamento di ottobre 2018 1809 17763
Aggiornamento di maggio 2019 1903 18362

È possibile scaricare qualsiasi versione rilasciata dell'SDK dall'archivio Windows SDK e emulatore. È possibile scaricare la versione più recente Windows Insider Preview SDK dalla sezione developer del sito Windows Insider.

Per altre informazioni sugli aggiornamenti Windows 10, vedi informazioni sulla versione Windows 10. Per informazioni importanti sul ciclo di vita del supporto Windows 10, vedere la scheda informativa del ciclo di vita di Windows.

Eseguire controlli API

La chiave per le app adattive per la versione è la combinazione di contratti API e della classe ApiInformation . Questa classe consente di rilevare se è presente un contratto API, un tipo o un membro specificati in modo da poter effettuare in modo sicuro chiamate API in un'ampia gamma di dispositivi e versioni del sistema operativo.

I contratti delle API

Il set di API all'interno di una famiglia di dispositivi è suddiviso in suddivisioni note come contratti API. Puoi usare il metodo ApiInformation.IsApiContractPresent per verificare la presenza di un contratto API. Ciò è utile se si vuole verificare la presenza di molte API presenti nella stessa versione di un contratto API.

    bool isScannerDeviceContract_1_Present =
        Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent
            ("Windows.Devices.Scanners.ScannerDeviceContract", 1);

Che cos'è un contratto API? Essenzialmente, un contratto API rappresenta una funzionalità, ovvero un set di API correlate che insieme offrono alcune funzionalità specifiche. Un contratto API ipotetico potrebbe rappresentare un set di API contenenti due classi, cinque interfacce, una struttura, due enumerazioni e così via.

I tipi correlati logicamente vengono raggruppati in un contratto API e a partire da Windows 10, ogni API Windows Runtime è membro di un contratto API. Con i contratti API, si sta verificando la disponibilità di una funzionalità o di un'API specifica nel dispositivo, controllando in modo efficace le funzionalità di un dispositivo invece di cercare un dispositivo o un sistema operativo specifico. Una piattaforma che implementa qualsiasi API in un contratto API deve implementare ogni API in quel contratto. Ciò significa che è possibile verificare se il sistema operativo in esecuzione supporta un contratto API specifico e, in caso affermativo, chiamare una qualsiasi delle API nel contratto API senza controllarne ognuna singolarmente.

Il contratto API più grande e comunemente usato è il Windows. Foundation.UniversalApiContract. Contiene la maggior parte delle API nel Universal Windows Platform. La documentazione sugli SDK e i contratti API della famiglia di dispositivi descrive la varietà di contratti API disponibili. Si noterà che la maggior parte di esse rappresenta un set di API correlate a livello funzionale.

Annotazioni

Se è installata un'anteprima Windows Software Development Kit (SDK) non ancora documentata, è anche possibile trovare informazioni sul supporto del contratto API nel file "Platform.xml" che si trova nella cartella di installazione dell'SDK all'indirizzo '(Programmi (x86)\Windows Kits\10\Platforms<platform><SDK versione>\Platform.xml'.

Codice adattivo di versione e XAML condizionale

In tutte le versioni di Windows 10, puoi usare la classe ApiInformation in una condizione nel codice per verificare la presenza dell'API che vuoi chiamare. Nel codice adattivo è possibile usare vari metodi della classe, ad esempio IsTypePresent, IsEventPresent, IsMethodPresent e IsPropertyPresent, per testare le API in base alla granularità necessaria.

Per altre info ed esempi, vedi Codice adattivo per la versione.

Se la versione minima delle app è build 15063 (Creators Update) o successiva, puoi usare XAML condizionale per impostare le proprietà e creare istanze di oggetti nel markup senza dover usare code-behind. XAML condizionale consente di usare il metodo ApiInformation.IsApiContractPresent nel markup.

Per altre info ed esempi, vedi XAML condizionale.

API caricate in ritardo

La funzione QueryOptionalDelayLoadedAPI consente alle app dello Store (che non sono consentite dai criteri di chiamare LoadLibrary) per rilevare se la funzione caricata in ritardo è stata effettivamente trovata.

#include <windows.h>
#include <commdlg.h>
#include <libloaderapi2.h>
#include <stdio.h>

EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HMODULE_THISCOMPONENT reinterpret_cast<HMODULE>(&__ImageBase)

int __cdecl main(int argc, char** argv)
{
    if (QueryOptionalDelayLoadedAPI(HMODULE_THISCOMPONENT,
          "comdlg32.dll", "GetOpenFileNameW", 0))
    {
        printf("GetOpenFileNameW can be called!\n");
    }
    return 0;
}

Testare l'app adattabile alle versioni

Quando usi il codice adattivo per la versione o XAML condizionale per scrivere un'app adattiva per la versione, devi testarla in un dispositivo che esegue la versione minima e in un dispositivo che esegue la versione di destinazione di Windows 10.

Non è possibile testare tutti i percorsi di codice condizionale in un singolo dispositivo. Per assicurarsi che tutti i percorsi di codice vengano testati, è necessario distribuire e testare l'app in un dispositivo remoto (o in una macchina virtuale) che esegue la versione minima supportata del sistema operativo. Per altre info sul debug remoto, vedi Distribuzione e debug di app UWP.