Cómo iniciar mi aplicación a través de la etiqueta NFC?


Actualmente estoy trabajando en portar una aplicación a UWP. La aplicación tiene una página con un botón "Escribir en NFC". Después de que el usuario lo toque, espera una etiqueta NFC y escribe un mensaje binario LaunchApp:WriteTag.

Lo que funcionó bien bajo WP8.1, no funciona en absoluto bajo 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());
}

Desafortunadamente esto no funciona. La capacidad NFC está habilitada y la aplicación WP8.1 funciona en el mismo teléfono, por lo que esto no debería ser un problema.

Ya probé varios formatos ya que el problema parece para ser el launchAppMessage, donde no encontré un médico de UWP para. Hay un artículo de MSDN Windows 8+, que describe la cadena en el formato:

myArgs\tWindows\tAppFamilyName!App

Lo que intenté: {[16]]}

  1. myArgs es lo suficientemente corto - no debería ser un problema.
  2. Windows o WindowsPhone no hace ninguna diferencia. Ambos no funcionan.
  3. AppFamilyName es el nombre correcto de la familia de la aplicación que está dentro de mi manifiesto de aplicación. La aplicación está asociada a la tienda y parece que esto no debería ser el problema bien.
  4. App es lo que hay dentro de <Application id="App" ... /> en mi manifiesto de aplicación. Intentar MyAppNamespace.App no funcionó tan bien y llamar a CurrentApp.AppId (lo que se usa en las aplicaciones WinRT) arroja una excepción.

Por "no funciona" quiero decir que escribe en la etiqueta, pero la etiqueta no es reconocida por Windows 10 en absoluto.

Una cosa más que encontré, es que para myArgs\tWindows\tAppFamilyName!App la aplicación lanza la siguiente excepción - sin más detalles:

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

Realmente espero que alguien tenga una idea sobre cómo resolver esto. Desafortunadamente no hay muestras de UWP para esto todavía y los documentos siguen siendo los antiguos... :/

PD: usar un protocolo personalizado junto con WindowsUri:WriteTag funciona bien, pero solo quiero que mi aplicación se abra con la etiqueta NFC. Además, el cuadro de diálogo de confirmación se ve como " ¿Desea abrir la aplicación asociada con mycustomprotocol?"- que no parece muy fácil de usar. Así que eso no es una solución real para mí, más una solución alternativa que no quiero usar.

Author: sibbl, 2015-12-11

3 answers

Windows 10 Mobile UWP

Si solo se dirige a Windows 10 Mobile, la forma 8.1 todavía funciona, dado que obtiene el ID de aplicación correcto. Se puede recuperar a través de:

Windows.ApplicationModel.Store.CurrentApp.AppId

Sin embargo, eso solo funciona cuando la aplicación se instala a través de la tienda, ya que el ID se asigna durante la asociación / publicación de la tienda. En las compilaciones implementadas por desarrolladores, la API se bloqueará con "Excepción de HRESULT: 0x803F6107".

El registro LaunchApp resultante entonces necesita el plataforma "WindowsPhone" y ese ID de aplicación. El siguiente código crea una etiqueta LaunchApp a través de la biblioteca de código abierto NFC / NDEF ( https://github.com/andijakl/ndef-nfc ) y funciona en Windows 10 Mobile, tanto para escribir la etiqueta como para iniciar la aplicación. Una vez más - dado que ha sido publicado e instalado a través de la tienda:

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);

Windows 10 PC

Desafortunadamente, las cosas son diferentes para las PC. El método anterior no funciona allí, tampoco lo hace el documentado método para Windows 8.1.

Lo más cerca que pude llegar hasta ahora es conseguir que Windows 10 reconozca la etiqueta LaunchApp y abra la tienda en la página correcta. Pero Windows / la tienda no se da cuenta de que la aplicación ya está instalada y, por lo tanto, no la abre.

Este es el código, de nuevo usando la biblioteca 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);

Por supuesto, también puede combinar los dos ID de plataforma en una sola etiqueta NFC, dado que tiene suficiente memoria de escritura, ya que esos ID de aplicaciones son enorme.

 5
Author: Andreas Jakl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-28 08:42:42

Aquí hay una manera:

  1. Registrar una tarea en segundo plano y usar un disparador NFC
  2. Registre su aplicación para la activación de uri.
  3. Programe la tarea de fondo para activarla cuando se toque con una etiqueta NFC y luego inicie la aplicación demandando esquemas URI

    / / Establecer la aplicación recomendada

    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);
    
 1
Author: Akash Gutha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-24 12:02:32

Si tiene una aplicación WP8.1 y ejecuta esta aplicación en Windows Phone 10 y desea escribir etiquetas NFC en su teléfono, debe recuperar AppId. Esto se hace abriendo el Windows Dev Center abra la aplicación correspondiente, haga clic en App Management y luego App identity. Luego, en el punto URL for Windows Phone 8.1 and earlier copie el GUID y reemplace Windows.ApplicationModel.Store.CurrentApp.AppId

 0
Author: Michael Mairegger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-30 08:23:37