Condividi tramite



Numero speciale del 2015 su Windows 10

Volume 30 Numero 11

Il presente articolo è stato tradotto automaticamente.

Integrazione di app - Collegamento e integrazione di app in Windows 10

Da Arunjeet Singh | Windows 2015

La maggior parte degli sviluppatori di applicazioni di creare o gestire regolarmente più applicazioni. Come le applicazioni di maturazione, gli utenti richiedono spesso i flussi di lavoro che coinvolgono più applicazioni che interagiscono. Ad esempio, forse è un'applicazione che gestisce l'inventario dei prodotti e un'altra applicazione che esegue l'estrazione. Sarebbe ideale per le due applicazioni di collaborare per completare un flusso di lavoro.

Un modo per risolvere questo problema è sufficiente incorporare tutte le funzionalità in un'applicazione. In effetti, questo è un approccio spesso interpretato in applicazioni desktop. Tuttavia, questa è una strada espone a notevoli pericoli. A breve, si finisce con un'applicazione piene dove la maggior parte degli utenti utilizzano solo un sottoinsieme delle funzionalità specifico. Lo sviluppatore dell'app deve gestire la complessità dell'interfaccia utente e gli aggiornamenti per l'intera applicazione. Anche peggiori, come la complessità dell'interfaccia utente aumenta, gli utenti, specialmente quelle di mobile, iniziare a avvicinarsi a più incentrato opzioni. Infatti, è stata la tendenza verso la scomposizione di applicazioni in singole esperienze in modo che gli utenti possono installare e utilizzare le informazioni desiderate in viaggio senza doversi preoccupare di bit estranei di che senza bisogno.

Un secondo modo per risolvere il problema consiste nello sfruttare la cloud come mezzo di comunicazione tra applicazioni. Ottiene alcune dimensioni superiore a quelle che funziona in modo ottimale fino a quando la quantità di dati o si verifichino gli utenti con connettività limitata. Verrà avviata di mostrare reclami, ad esempio, "qui, l'aggiornamento dello stato dell'utente, ma non viene visualizzata in questo altre app in questa posizione!" Inoltre, ho sempre avuto un po' strana app gli sviluppatori devono ricorrere al cloud per la comunicazione tra due applicazioni seduti sullo stesso dispositivo. Dovrà pur esserci un modo migliore.

In questo articolo esaminerò alcuni degli strumenti Windows 10 fornite per semplificare le comunicazioni tra applicazioni più semplici. La comunicazione tra applicazioni può assumere la forma di un'applicazione di avvio di un'altra applicazione con alcuni dati o è possibile che applicazioni semplicemente lo scambio di dati tra loro senza dover avviare nulla. Windows 10 fornisce strumenti che possono essere sfruttati per entrambi gli scenari.

Preparazione di un'applicazione per il collegamento completo

Iniziamo con l'esempio di un'applicazione di inventario del prodotto che consente di visualizzare dettagli sui prodotti. Associamo anche un'applicazione di vendita in combinazione che può visualizzare le tendenze generali sulle quali vendite per i percorsi e il tipo di vendita dovrà dove vanno. L'applicazione di vendita dispone di un'esperienza utente di drill-down che consente di visualizzare i dettagli su singoli prodotti. Naturalmente, la visualizzazione più dettagliata di un prodotto è nell'applicazione di inventario. Figura 1 viene illustrato lo scenario di cui si fa riferimento.

Collegamenti diretti di vendite App nell'App inventario
Figura 1 collegamenti diretti di vendite App nell'App inventario

In questo scenario, la prima cosa che è necessario eseguire è rendere disponibili per l'avvio dell'applicazione di inventario. Per eseguire questa operazione è aggiungere una dichiarazione di protocollo al manifesto di pacchetto dell'applicazione di inventario (appxmanifest). La dichiarazione di protocollo è modo di inventario dell'applicazione di sapere tutto il mondo è disponibile per essere avviata da altre applicazioni. Figura 2 viene illustrato l'aspetto di questa dichiarazione. Si noti l'utilizzo di com.contoso.showproduct nome protocollo. Infatti, una buona convenzione di denominazione per i protocolli personalizzati Contoso possiede il dominio contoso.com. Le probabilità di un altro sviluppatore app erroneamente utilizzando lo stesso schema personalizzato sono remote.

La dichiarazione di protocollo
Figura 2, la dichiarazione di protocollo

Ecco il codice XML generato la dichiarazione di protocollo:

<uap:Extension Category="windows.protocol">
  <uap:Protocol Name="com.contoso.showproduct" />
</uap:Extension>

Successivamente, è necessario aggiungere del codice di attivazione in modo che l'applicazione di inventario può rispondere in modo appropriato quando viene avviata utilizzando il nuovo protocollo. Il codice deve essere inserito classe dell'applicazione dell'applicazione di inventario (App.xaml.cs) perché è in cui vengono indirizzate tutte le attivazioni. L'override del metodo di OnActivated della classe di applicazione per rispondere alle attivazioni di protocollo. Figura 3 viene illustrato l'aspetto di tale codice.

Figura 3, la gestione di un collegamento diretto

protected override void OnActivated(IActivatedEventArgs args)
{
  Frame rootFrame = CreateRootFrame();
  if (args.Kind == ActivationKind.Protocol)
  {
    var protocolArgs = args as ProtocolActivatedEventArgs;
    rootFrame.Navigate(typeof(ProtocolActivationPage), protocolArgs.Uri);
  }
  else
  {
    rootFrame.Navigate(typeof(MainPage));
  }
  // Ensure the current window is active
  Window.Current.Activate();
}

Controllare il tipo di IActivatedEventArgs in ingresso per verificare se si tratta di un'attivazione protocollo. Questo caso, il cast di tipo gli argomenti in arrivo come ProtocolActivatedEventArgs e inviare l'URI in ingresso nella pagina Dettagli prodotto. La pagina Dettagli prodotto è configurata per analizzare un URI come com.contoso.showproduct:Details? ProductId = 3748937 e visualizzare i dettagli del prodotto corrispondente. A questo punto, l'applicazione di inventario è pronto per la gestione di collegamenti diretti in ingresso.

L'ultimo passaggio per completare questo scenario è consentire all'applicazione di vendita di deep link di nell'inventario app. Questa è la parte più semplice del processo. App vendita utilizza semplicemente l'API Launcher.LaunchUriAsync per collegamento diretto nell'inventario app. Ecco l'aspetto che il codice:

Uri uri = new Uri("com.contoso.showproduct:?ProductId=3748937");
await Launcher.LaunchUriAsync(uri);

Condivisione di dati tra applicazioni

Esistono scenari in cui le applicazioni devono condividere i dati ma non necessariamente prevedono l'invio all'utente in un'altra applicazione. Mia applicazione di vendita di esempio, ad esempio, possibile visualizzare le vendite per regione e persino drill down Negozi specifici. Con questi dati classificati in base al prodotto sarebbe utile avere il numero di unità del prodotto disponibile in un archivio o una regione. La migliore fonte per questi dati è l'applicazione di inventario, ma in questo caso avviando l'applicazione di magazzino sarebbe problematica per l'UX. Questo è esattamente il tipo di scenario, l'estensione AppService (bit.ly/1JfcVkx) è stato progettato per gestire.

L'idea è semplice: L'applicazione di inventario fornisce un "servizio" che può richiamare l'applicazione di vendita. L'applicazione di vendita utilizza questo servizio per eseguire l'applicazione di inventario per i dati di che dispone una query. La connessione tra l'applicazione di vendita e l'applicazione di inventario, una volta stabilita, può essere tenuta aperta fino a quando l'applicazione di vendita non è stata sospesa.

Creazione del servizio di applicazione di inventario

Diamo un'occhiata a come l'applicazione di inventario crea e pubblica il servizio app che intende fornire. Servizi App sono essenzialmente attività specializzate in background. Pertanto per aggiungere un servizio di applicazione si aggiunge un progetto di componente Windows Runtime (Windows universale) per la soluzione di Visual Studio contenente l'applicazione di inventario. È possibile trovare progetti di componente Windows Runtime nella finestra Aggiungi nuovo progetto di Visual Studio in Visual c# | Windows | Universale. Il modello di progetto è in un percorso simile per le altre lingue.

All'interno del nuovo progetto di componente Windows Runtime, aggiungere una nuova classe denominata InventoryServiceTask. Servizi App sono attività in background specializzate perché, come illustrato in precedenza, si desidera che questo codice in esecuzione in background senza mostrare un'interfaccia utente. Per indicare il sistema operativo che InventoryServiceTask è un'attività in background, è sufficiente implementare l'interfaccia IBackgroundTask. Il metodo Run dell'interfaccia IBackgroundTask sarà il punto di ingresso per il servizio applicazione di inventario. In questa posizione, è eseguire un'esclusione per informare il sistema operativo che l'attività deve essere incluso tutto per fino a quando il client (l'applicazione di vendita) abbia bisogno. Inoltre possibile associare un gestore eventi all'evento RequestReceived app specifico del servizio. Questo gestore eventi verrà richiamato ogni volta che il client invia una richiesta per questo servizio gestire. Figura 4 viene illustrato l'aspetto del codice per inizializzare il servizio applicazione di inventario.

Figura 4 inizializzazione del servizio di applicazione di inventario nel metodo Run

namespace Contoso.Inventory.Service
{
  public sealed class InventoryServiceTask : IBackgroundTask
  {
    BackgroundTaskDeferral serviceDeferral;
    AppServiceConnection connection;
    public void Run(IBackgroundTaskInstance taskInstance)
    {
      // Take a service deferral so the service isn't terminated
      serviceDeferral = taskInstance.GetDeferral();
      taskInstance.Canceled += OnTaskCanceled;
      var details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
      connection = details.AppServiceConnection;
      // Listen for incoming app service requests
      connection.RequestReceived += OnRequestReceived;
    }
  }
}

Ora esaminiamo implementazione del gestore RequestReceived. Anche in questo caso, è eseguire un'esclusione non appena arriva una richiesta. Come termine verrà rilasciare questo rinvio gestisce la richiesta in ingresso. La valuta di comunicazione tra il client del servizio di applicazione e il servizio app è una struttura di dati denominata valore impostato. ValueSets sono dizionari chiave/valore contenenti tipi semplici, ad esempio numeri interi, a virgola mobile punto numeri, stringhe e matrici di byte.

Figura 5 viene illustrato come il servizio app inventario gestisce le richieste in ingresso. Controlla se il messaggio in arrivo per un comando e quindi risponde con il risultato corretto. In questo caso, è illustrato il comando GetProductUnitCountForRegion a cui il servizio risponde con il numero di unità del prodotto e l'ultima volta i dati che disponibili è stato aggiornato. Il servizio può anche essere recupero di dati da un servizio Web o recuperarli solo da una cache offline. Di seguito l'aspetto interessante è che il client (l'applicazione di vendita) non è necessario importanza da cui derivano i dati.

Figura 5 la ricezione di richieste per l'applicazione di inventario

async void OnRequestReceived(AppServiceConnection sender,
  AppServiceRequestReceivedEventArgs args)
{
  // Get a deferral so we can use an awaitable API to respond to the message
  var messageDeferral = args.GetDeferral();
  try
  {
    var input = args.Request.Message;
    string command = input["Command"] as string;
    switch(command)
    {
      case "GetProductUnitCountForRegion":
        {
          var productId = (int)input["ProductId"];
          var regionId = (int)input["RegionId"];
          var inventoryData = GetInventoryData(productId, regionId);
          var result = new ValueSet();
          result.Add("UnitCount", inventoryData.UnitCount);
          result.Add("LastUpdated", inventoryData.LastUpdated.ToString());
          await args.Request.SendResponseAsync(result);
        }
        break;
      // Other commands
      default:
        return;
    }
  }
  finally
  {
    // Complete the message deferral so the platform knows we're done responding
    messageDeferral.Complete();
  }
}
// Handle cancellation of this app service background task gracefullyprivate void OnTaskCanceled(IBackgroundTaskInstance sender,
  BackgroundTaskCancellationReason reason)
{
  if (serviceDeferral != null)
  {
    // Complete the service deferral
    serviceDeferral.Complete();
    serviceDeferral = null;
  }
}

Come mostrato nella Figura 5 è l'implementazione del gestore di annullamento. È importante che il servizio app rinunciare il rinvio impiegato normalmente quando viene richiesto l'annullamento. Annullamento di un'attività in background servizio app potrebbe verificarsi in quanto il client chiusa la connessione al servizio app o il sistema ha esaurito le risorse. In entrambi i casi, un normale annullamento assicura che l'annullamento non è considerato un arresto anomalo dalla piattaforma.

Prima di qualsiasi utente può chiamare il servizio applicazione di inventario, è necessario pubblicarla e assegnargli un endpoint. È innanzitutto necessario aggiungere un riferimento al nuovo componente Windows Runtime nel progetto di applicazione di inventario. Aggiungere quindi una dichiarazione di servizio app al progetto di applicazione di inventario, come illustrato nella Figura 6. Il punto di ingresso è impostato il nome completo della classe InventoryServiceTask e nome è il nome che verrà utilizzato per identificare questo endpoint del servizio app. Questo è lo stesso servizio app nome client utilizzeranno per raggiungerlo.

La dichiarazione di servizio App
Figura 6 la dichiarazione di servizio App

Ecco il codice XML generato la dichiarazione di servizio app:

<uap:Extension Category="windows.appService"
  EntryPoint="Contoso.Inventory.Service.InventoryServiceTask">
  <uap:AppService Name="com.contoso.inventoryservice"/>
</uap:Extension>

Un'altra informazione che sarà necessario comunicare con il servizio applicazione di inventario client è il nome di famiglia pacchetto dell'applicazione di inventario. Il modo più semplice per ottenere questo valore è utilizzare l'API Windows.ApplicationModel.Package.Current.Id.FamilyName all'interno dell'app di inventario. In genere solo output di questo valore per la finestra di debug e prelevare da lì.

La chiamata al servizio App

Ora che il servizio applicazione di inventario è sul posto, è possibile chiamare da app vendite. Per chiamare un servizio applicazione di un client può utilizzare l'API AppServiceConnection. Un'istanza della classe AppServiceConnection richiede il nome dell'endpoint del servizio di applicazione e il nome di famiglia pacchetto del pacchetto in cui risiede il servizio. Questi due valori può essere considerato come l'indirizzo di un servizio di applicazione.

Figura 7 Mostra il codice dell'applicazione di vendita utilizza per connettersi al servizio di applicazione. Si noti che la proprietà AppServiceConnection.AppServiceName è stata impostata il nome dell'endpoint è dichiarato nel manifesto di pacchetto dell'applicazione di inventario. Inoltre, il nome di famiglia pacchetto dell'applicazione di inventario è stata collegata alla proprietà AppServiceConnection.PackageFamilyName. Una volta pronti, chiamare l'API AppServiceConnection.OpenAsync per aprire una connessione. L'API OpenAsync restituisce uno stato al completamento e questo stato viene utilizzato per determinare se la connessione è stata stabilita correttamente.

Figura 7, la chiamata al servizio di applicazione di inventario

using (var connection = new AppServiceConnection())
{
  // Set up a new app service connection
  connection.AppServiceName = "com.contoso.inventoryservice";
  connection.PackageFamilyName = "Contoso.Inventory_876gvmnfevegr";
  AppServiceConnectionStatus status = await connection.OpenAsync();
  // The new connection opened successfully
  if (status != AppServiceConnectionStatus.Success)
  {
    return;
  }
  // Set up the inputs and send a message to the service
  var inputs = new ValueSet();
  inputs.Add("Command", "GetProductUnitCountForRegion");
  inputs.Add("ProductId",productId);
  inputs.Add("RegionId", regionId);
  AppServiceResponse response = await connection.SendMessageAsync(inputs);
  // If the service responded with success display the result and walk away
  if (response.Status == AppServiceResponseStatus.Success)
  {
    var unitCount = response.Message["UnitCount"] as string;
    var lastUpdated = response.Message["LastUpdated"] as string;
    // Display values from service
  }
}

Una volta connesso, il client invia il servizio app per un set di valori in un valore impostato utilizzando l'API AppServiceConnection.SendMessageAsync. Si noti che la proprietà di comando nel valore impostato è impostata su GetProductUnitCountForRegion. Si tratta di un comando che comprensibile per il servizio di applicazione. SendMessageAsync restituisce una risposta contenente il valore impostato restituito dal servizio dell'app. Analizzare i valori UnitCount e LastUpdated e visualizzarli. Niente altro. Che è tutto ciò che serve per comunicare con un servizio di applicazione. Inserire la AppServiceConnection nell'utilizzo di un blocco. Appena l'utilizzo di questo chiama il metodo Dispose su AppServiceConnection il blocco termina. La chiamata Dispose è un modo per il client dire che si è verificato a comunicare con il servizio app e può ora essere terminata.

Tempo di attesa, Microsoft utilizza queste API?

Ovviamente, Microsoft utilizza queste API. La maggior parte delle applicazioni di Microsoft che fanno parte di Windows 10 sono infatti App universale piattaforma Windows. Sono incluse applicazioni come foto, fotocamera, posta elettronica, calendario, Groove musica e l'archivio. Gli sviluppatori che hanno scritto queste applicazioni utilizzavano numerose API descritte di seguito per implementare scenari di integrazione. Ad esempio, notare il collegamento "Get musica nell'archivio" all'interno dell'applicazione musicale di Groove? Quando si toccare o fare clic su tale collegamento, l'app musica Groove utilizza l'API Launcher.LaunchUriAsync per iniziare l'app Store.

Un altro esempio significativo è l'applicazione delle impostazioni. Quando si passa in account | L'account e provare a utilizzare la fotocamera per richiedere una nuova immagine del profilo, utilizza un'API denominata Launcher.LaunchUriForResultsAsync per avviare l'applicazione della fotocamera per rendere tale immagine. LaunchUriForResultsAsync è un tipo speciale di LaunchUriAsync descritta in dettaglio in aka.ms/launchforresults.

Un numero elevato di applicazioni inoltre utilizza servizi di applicazione per comunicare informazioni relative a Cortana in tempo reale. Ad esempio, quando un'applicazione tenta di installare i comandi vocali che Cortana deve rispondere, esegue effettivamente chiamate in un'applicazione servizio fornito da Cortana.

Avvolgendo

10 Windows dotato di potenti strumenti che facilitano la comunicazione tra applicazioni in esecuzione sullo stesso dispositivo. Questi strumenti non inserire alcuna restrizione limiti per le applicazioni possono comunicare tra loro o il tipo di dati per lo scambio. Che è molto simile per impostazione predefinita. L'intento è consentire applicazioni definire i propri contratti tra loro ed estendere le rispettive funzionalità. Ciò consente inoltre di sviluppatori di applicazioni scomporre le proprie applicazioni in più piccoli, dalle dimensioni esperienze più facili da gestire, aggiornare e utilizzare. Questo è molto importante come utenti sempre più live loro vita su più dispositivi e utilizzano il dispositivo che ritengono più adatti a un'attività. Tutte le API sono inoltre universale, ovvero che funzionano su desktop, portatili, Tablet, telefoni cellulari e presto su Xbox, area Hub e HoloLens.


Arun Singhè un senior program manager del team Universal piattaforma Windows. Seguirlo su Twitter: @aruntalkstech o leggere il suo blog all'indirizzo aruntalkstech.com.

Grazie ai seguenti esperti tecnici per la revisione di questo articolo: Hector Barbera, Jill Bender, Howard Kapustein, Abdul Hadi Sheikh, Stefan Wick e Jon Wiswall
Stefan Wick è un program manager e funziona con l'esecuzione di app e la distribuzione di Microsoft
Hector Barbera è un program manager che lavorano su app mobile di Microsoft e backup
Howard Kapustein è un ingegnere e funziona sulla gestione dello stato di app presso Microsoft
Abdul Hadi Sheikh è un ingegnere e funziona in esecuzione app presso Microsoft
Jill Bender è un program manager e lavora in scenari di integrazione applicazioni come Microsoft
Jon Wiswall è un ingegnere e lavora sul modello di applicazione API Microsoft