usos tarjetas que programar mercadolibre etiquetas etiqueta compatible c# windows-runtime nfc windows-10 uwp

c# - tarjetas - programar etiquetas nfc



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

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

Lamentablemente, 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 ser launchAppMessage , donde no encontré un documento de UWP. Hay un artículo de Windows 8+ MSDN, que describe la cadena en el formato:

myArgs/tWindows/tAppFamilyName!App

Lo que probé:

  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 del manifiesto de mi aplicación. La aplicación está asociada a la tienda y parece que este no debería ser el problema también.
  4. App es lo que está adentro <Application id="App" ... /> en el manifiesto de mi aplicación. Probar MyAppNamespace.App no funcionó tan bien y llamar a CurrentApp.AppId (lo que se usa en las aplicaciones WinRT) arroja una excepción.

Al decir "no funciona" me refiero a que se escribe en la etiqueta, pero Windows 10 no reconoce la etiqueta.

Una cosa más que encontré, es que para la aplicación myArgs/tWindows/tAppFamilyName!App la aplicación arroja 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. Lamentablemente, todavía no hay muestras de UWP para esto y los documentos siguen siendo los antiguos ...: /

PD: usando 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 aparece como "¿Desea abrir la aplicación asociada con mycustomprotocol?" - que no parece muy fácil de usar. Así que esa no es una solución real para mí, más una solución alternativa que no quiero usar.


Aquí hay una manera:

  1. Registre una tarea de fondo y use 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 de 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);


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 la AppId . Esto se hace al abrir el Centro de desarrollo de Windows, abrir la aplicación correspondiente, hacer clic en App Management y luego en App identity . Luego, debajo de la URL for Windows Phone 8.1 and earlier punto URL for Windows Phone 8.1 and earlier copie el GUID y reemplace Windows.ApplicationModel.Store.CurrentApp.AppId


Windows 10 Mobile UWP

Si solo tiene como objetivo Windows 10 Mobile, la forma 8.1 aún funciona, dado que obtiene la ID de la aplicación correcta. 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 la identificación se asigna durante la asociación / publicación de la tienda. En las construcciones desplegadas por el desarrollador, la API se bloqueará con "Excepción de HRESULT: 0x803F6107".

El registro de LaunchApp resultante necesita la plataforma "WindowsPhone" y la ID de la aplicación. El siguiente código crea una etiqueta LaunchApp a través de la biblioteca NFC / NDEF de código abierto ( https://github.com/andijakl/ndef-nfc ) y funciona en Windows 10 Mobile, tanto para escribir la etiqueta como para iniciar la aplicación. Nuevamente, 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 método documentado para Windows 8.1.

Lo más cerca que pude llegar hasta ahora es lograr que Windows 10 reconozca la etiqueta LaunchApp y abrir 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, nuevamente utilizando 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 las dos ID de plataforma con una sola etiqueta NFC, dado que tiene suficiente memoria grabable, ya que esas ID de aplicación son enormes.