Condividi tramite


Come supportare operazioni pull (HTML)

[ Questo articolo è rivolto agli sviluppatori per Windows 8.x e Windows Phone 8.x che realizzano app di Windows Runtime. Gli sviluppatori che usano Windows 10 possono vedere Documentazione aggiornata ]

Il più delle volte, l'app fornisce immediatamente i dati da condividere tramite il proprio gestore eventi datarequested. Tuttavia a volte un'app potrebbe impiegare qualche tempo a preparare i dati da condividere. In quei casi, puoi fornire un elenco di formati supportati, ma aspettare a preparare e fornire il contenuto fino al momento in cui viene richiesto dall'app di destinazione. Aspettare a fornire il contenuto fino al momento in cui l'app di destinazione lo richiede è un'operazione definita pull (o condivisione ritardata).

Per supportare le operazioni pull, devi prima creare una funzione che generi il pacchetto dei dati che l'utente vuole condividere. Invece di fornire i dati effettivi a un'altra app, devi quindi fornire una funzione di delegato che verrà chiamata dalla tua app quando l'app di destinazione cerca di ottenere i dati. Il vantaggio è che in questo modo la tua app può condividere i dati dietro le quinte, consentendo all'utente di continuare a usarla per altre attività.

Cosa sapere

Tecnologie

Prerequisiti

Istruzioni

Passaggio 1: Creare una funzione gestore pulsanti per consentire all'utente di scegliere un file immagine

Il codice seguente per il gestore pulsanti permette all'utente di selezionare un file immagine. Questo file viene usato nei passaggi successivi di questa esercitazione.

Nota  

Il codice seguente usa pickSingleFileAsync. In Windows Phone 8.1, è invece necessario usare pickSingleFileAndContinue.

var imageFile = null;
function pickImageFile() {
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.fileTypeFilter.replaceAll([".jpg", ".bmp", ".gif", ".png"]);
    picker.pickSingleFileAsync().done(function (file) {
        imageFile = file;
    });
}

Passaggio 2: Crea una funzione di delegato per fornire il contenuto che l'utente vuole condividere.

L'esatta natura della funzione di delegato dipende dalla tua app. Ecco un esempio.

function onDeferredImageRequested(request) {
    if (imageFile) {
        var imageStreamRef = Windows.Storage.Streams.RandomAccessStreamReference.createFromFile(imageFile);
        request.setData(imageStreamRef);
    }
}

Nota che questa funzione di delegato usa il metodo setData per aggiungere il contenuto e non una funzione specifica del formato come setBitmap o setStorageItems. Ogni volta che usi una funzione di delegato, devi usare setData per fornire il contenuto.

Passaggio 3: Impostare l'app come origine di condivisione

L'oggetto DataTransferManager è il punto di partenza principale per qualsiasi operazione di condivisione. Aggiungi un gestore per l'evento DataRequested da attivare quando l'utente vuole richiamare la condivisione. In un'app di Windows Store questa operazione viene eseguita automaticamente quando l'utente richiama l'accesso alla condivisione. Se stai sviluppando un'app per Windows Phone, non esiste alcun accesso alla condivisione incorporato. Dovrai quindi aggiungere un controllo che l'utente dovrà toccare per attivare il gestore.

var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();
dataTransferManager.addEventListener("datarequested", sharePullHandler);

I passaggi rimanenti riguardano l'implementazione della funzione sharePullHandler.

Passaggio 4: Recuperare un oggetto DataRequest

Quando si verifica un evento datarequested, l'app riceve un oggetto DataRequest. Questo oggetto contiene un oggetto DataPackage che puoi usare per fornire il contenuto che l'utente vuole condividere. Nelle operazioni pull, tuttavia, specifichi una funzione di delegato invece dei dati effettivi.

var request = e.request;

Passaggio 5: Impostare le proprietà di titolo e descrizione

request.data.properties.title = "Share Pull Example";
request.data.properties.description = "Demonstrates how to pull operations in share.";

Passaggio 6: Imposta i tipi di file, se necessario.

Se usi una funzione di delegato per condividere i file, devi specificare i tipi di file supportati dalla tua app.

request.data.properties.fileTypes.replaceAll([".jpg", ".bmp", ".gif", ".png"]);

Passaggio 7: Aggiungere la funzione di delegato all'oggetto DataPackage

Il metodo setDataProvider specifica la funzione di delegato creata per fornire il contenuto effettivo.

request.data.setDataProvider(Windows.ApplicationModel.DataTransfer.StandardDataFormats.bitmap, onDeferredImageRequested);

A questo punto, quando l'utente tocca il pulsante di accesso rapido Condividi, l'app può rispondere immediatamente con un oggetto DataPackage contenente la funzione di delegato. L'operazione di condivisione può ora procedere dietro le quinte, permettendo all'utente di continuare liberamente qualsiasi altra attività.

Tieni presente che se usi il metodo setStorageItems per condividere i file, questo crea oggetti StorageFile di sola lettura per la condivisione e conserva gli oggetti originali. Questo significa che se aggiungi proprietà espanse al file originale dopo aver chiamato setStorageItems, queste nuove proprietà non verranno incluse negli oggetti StorageFile condivisi. Per questo motivo ti consigliamo di non aggiungere file fino a quando non sei completamente pronto.

Osservazioni

Un'app che condivide i dati usando il rendering ritardato dovrebbe essere un'app con una pagina singola per evitare spostamenti tra le pagine. Se l'app supporta anche spostamenti all'interno dei frame, dovrebbe usare il contesto dello script di livello superiore per registrare le funzioni di delegato invece di registrare i delegati a livello del frame. L'esplorazione provoca la perdita del contesto dello script che annulla le funzioni di delegato e l'esito negativo del rendering ritardato.

Esempio completo

var imageFile = null;
function pickImageFile() {
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.fileTypeFilter.replaceAll([".jpg", ".bmp", ".gif", ".png"]);
    picker.pickSingleFileAsync().done(function (file) {
        imageFile = file;
    });
}

function onDeferredImageRequested(request) {
    if (imageFile) {
        var imageStreamRef = Windows.Storage.Streams.RandomAccessStreamReference.createFromFile(imageFile);
        request.setData(imageStreamRef);
    }
}

function sharePullHandler(e) {
    var request = e.request;
    request.data.properties.title = "Share Pull Example";
    request.data.properties.description = "Demonstrates how to support pull operations in share.";
    request.data.properties.fileTypes.replaceAll([".jpg", ".bmp", ".gif", ".png"]);
    request.data.setDataProvider(Windows.ApplicationModel.DataTransfer.StandardDataFormats.bitmap, onDeferredImageRequested);
}

app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // This app is newly launched; register it as a share source.
            var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();
            dataTransferManager.addEventListener("datarequested", sharePullHandler);
            // Set up the button handler to pick an image file.
            document.getElementById("chooseImageButton").addEventListener("click", pickImageFile, false);
        } else {
            // TODO: This app was reactivated from suspension.
            // Restore the app state here.
        }
        args.setPromise(WinJS.UI.processAll());
    }
};

Argomenti correlati

Esempio di app di origine per la condivisione di contenuto

Condivisione e scambio di dati

Come produrre i dati richiesti in modo asincrono

Guida introduttiva: Condivisione di contenuto

DataPackage

Windows.ApplicationModel.DataTransfer

Windows.ApplicationModel.DataTransfer.Share