2015-12-11 26 views
31

Attualmente sto lavorando al porting di un'app su UWP. L'app ha una pagina con il pulsante "Scrivi su NFC". Dopo che l'utente lo ha toccato, attende un tag NFC e scrive un messaggio binario LaunchApp:WriteTag.Come avviare la mia app tramite tag NFC?

cosa ha funzionato bene sotto WP8.1, non funziona affatto sotto Windows 10 UWP:

var proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault(); 

if (proximityDevice != null) 
{ 
    var launchArgs = "user=default"; 

    var appId = "App"; 
    var appName = Windows.ApplicationModel.Package.Current.Id.FamilyName + "!" + appId; 

    var launchAppMessage = launchArgs + "\tWindows\t" + appName; 

    var dataWriter = new Windows.Storage.Streams.DataWriter(); 
    dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE; 
    dataWriter.WriteString(launchAppMessage); 
    var launchAppPubId = proximityDevice.PublishBinaryMessage("LaunchApp:WriteTag", dataWriter.DetachBuffer()); 
} 

Purtroppo questo non funziona. La funzionalità NFC è abilitata e l'app WP8.1 funziona sullo stesso telefono, quindi questo non dovrebbe essere un problema.

Ho già provato più formati in quanto il problema sembra essere il launchAppMessage, in cui non ho trovato un documento UWP per. C'è un articolo di MSDN Windows 8+, che descrive la stringa per essere nel formato:

myArgs\tWindows\tAppFamilyName!App 

Quello che ho cercato:

  1. myArgs è abbastanza breve - non dovrebbe essere un problema.
  2. Windows o WindowsPhone non fa alcuna differenza. Entrambi non funzionano.
  3. AppFamilyName è il nome corretto della famiglia di app che si trova nel mio manifest dell'app. L'app è associata al negozio e sembra che questo non dovrebbe essere il problema.
  4. App è il contenuto di <Application id="App" ... /> nel manifest dell'app. Cercando il MyAppNamespace.App non ha funzionato bene e chiamando lo CurrentApp.AppId (ciò che viene utilizzato nelle app WinRT) genera un'eccezione.

Per "non funziona" intendo che scrive sul tag, ma il tag non viene riconosciuto da Windows 10.

più Una cosa che ho trovato, è che per myArgs\tWindows\tAppFamilyName!App l'applicazione genera la seguente eccezione - senza ulteriori dettagli:

System.ExecutionEngineException was unhandled 
Message: An unhandled exception of type 'System.ExecutionEngineException' occurred in Unknown Module. 

spero davvero che qualcuno ha un'idea su come risolvere questo problema. Purtroppo non ci sono ancora campioni UWP per questo e i documenti sono ancora vecchi ...:/

PS: l'uso di un protocollo personalizzato insieme a WindowsUri:WriteTag funziona bene ma voglio solo che la mia app si apra con il tag NFC. Inoltre, la finestra di dialogo di conferma appare come "Vuoi aprire l'app associata a mycustomprotocol?" - che non sembra molto facile da usare. Quindi non è una soluzione reale per me, più una soluzione che non voglio usare.

risposta

5

di Windows 10 Mobile UWP

Se si sta prendendo di mira solo Windows 10 Mobile, il modo 8.1 funziona ancora, dato che si ottiene il diritto ID app. Può essere recuperate attraverso:

Windows.ApplicationModel.Store.CurrentApp.AppId 

tuttavia, che funziona solo quando l'applicazione viene installata attraverso il negozio, come l'ID viene assegnato durante il negozio di associazione/pubblicazione. Nelle build distribuite dallo sviluppatore, l'API si interromperà con "Eccezione da HRESULT: 0x803F6107".

Il record LaunchApp risultante richiede quindi la piattaforma "WindowsPhone" e quell'ID dell'app. Il codice seguente crea un tag LaunchApp tramite la libreria NFC/NDEF open source (https://github.com/andijakl/ndef-nfc) e funziona su Windows 10 Mobile: sia per scrivere il tag sia per avviare l'app. Anche in questo caso - dato che è stato pubblicato & installato attraverso il negozio:

var record = new NdefLaunchAppRecord { Arguments = "Hello World" }; 
var appId = Windows.ApplicationModel.Store.CurrentApp.AppId; // Note: crashes when app is not installed through app store! 
record.AddPlatformAppId("WindowsPhone", appId); 
var message = new NdefMessage { record }; 
proximityDevice.PublishBinaryMessage("NDEF:WriteTag", msgArray.AsBuffer(), MessageWrittenHandler); 

di Windows 10 PC

Purtroppo, le cose sono diverse per i PC. Il metodo sopra non funziona lì, né il metodo documentato per Windows 8.1.

Il più vicino che ho potuto ottenere finora è di far sì che Windows 10 riconosca il tag LaunchApp e apra lo store sulla pagina corretta. Ma Windows/il negozio non si rende conto che l'app è già installata e quindi non la apre.

Questo è il codice, sempre utilizzando la libreria NFC/NDEF:

var record = new NdefLaunchAppRecord { Arguments = "Hello World" }; 
var familyName = Windows.ApplicationModel.Package.Current.Id.FamilyName; 
var appId = Windows.ApplicationModel.Store.CurrentApp.AppId; // Note: crashes when app is not installed through app store! 
record.AddPlatformAppId("Windows", "{" + familyName + "!" + appId + "}"); 
var message = new NdefMessage { record }; 
proximityDevice.PublishBinaryMessage("NDEF:WriteTag", msgArray.AsBuffer(), MessageWrittenHandler); 

Naturalmente, è anche possibile combinare i due ID piattaforma per un singolo tag NFC, dato che si dispone di memoria sufficiente scrivibile, come quegli ID app sono enormi.

+0

Grazie Andreas! Ho già visto il link alla mia domanda SO nel codice, quindi grazie per la risposta dettagliata :) Penso che il vero problema qui sia l'eccezione che viene generata se l'app non è installata attraverso lo store, quindi vediamo se MS può fare qualcosa su questo [qualcuno del team NFC di MSFT ha risposto nel thread del forum MSDN su questo problema] (https://social.msdn.microsoft.com/Forums/en-US/b1e2743c-1cb3-4129-ade9-f8774d13ae0e/UWP-how-to-direttamente-lancio-my-app-via-NFC-tag? forum = wpdevelop). – sibbl

+1

Fantastico vederlo, grazie per il link! Sto anche seguendo la nostra mailing list MVP - manteniamo aggiornata la postazione SO quando avremo una risposta definitiva da MS! –

1

Ecco un modo:

  1. Registrare un task in background e l'utilizzo di un trigger NFC
  2. registrare l'applicazione per l'attivazione uri.
  3. programma BackgroundTask per attivare se battuto con un tag NFC e poi lanciare l'applicazione citato in giudizio schemi URI

    // Imposta l'applicazione consigliata

    var options = new Windows.System.LauncherOptions(); 
    options.PreferredApplicationPackageFamilyName= "Contoso.URIApp_8wknc82po1e"; 
    options.PreferredApplicationDisplayName = "Contoso URI Ap"; 
    
    // Launch the URI and pass in the recommended app 
    // in case the user has no apps installed to handle the URI 
    var success = await Windows.System.Launcher.LaunchUriAsync(uriContoso, options); 
    
+0

Posso chiedere che cosa dovrebbe essere un "trigger NFC"? Non riesco a trovare alcun 'IBackgroundTaskTrigger' che si innesca quando vengono trovati tag NFC? – sibbl

+0

Come hai risposto a diverse altre domande nel frattempo immagino che tu non abbia idea della tua "risposta" anche qui ... peccato. :/Spero che gli altri possano aiutarti. – sibbl

+0

Stavo cercando di trovare una soluzione. Mi sono imbattuto in questo trigger di trigger di soglia di sensibilità ma sfortunatamente non ho un dispositivo WIndows abilitato NFC per testare o sperimentare questo .. quindi non posso aiutarti ulteriormente a questo punto .. C'è un modo difficile ma non ne vale la pena. sta creando trigger personalizzati .. Penso che non sia accessibile agli sviluppatori comuni .. se vuoi prendere un lokk vai a https://msdn.microsoft.com/en-us/library/windows/hardware/dn705812(v = vs.85).aspx –

0

Se si dispone di un'app WP8.1 e si esegue questa app su Windows Phone 10 e si desidera scrivere tag NFC sul telefono, è necessario recuperare lo AppId. Questo viene fatto aprendo il Windows Dev Center aprire l'app corrispondente, fare clic su App Management e quindi App identity. Quindi sotto il punto URL for Windows Phone 8.1 and earlier copia il GUID e sostituisci Windows.ApplicationModel.Store.CurrentApp.AppId