Подтвердить что ты не робот

Как запустить приложение через тег NFC?

В настоящее время я работаю над переносом приложения в UWP. В приложении есть страница с кнопкой "Write to NFC". После того, как пользователь ударит его, он ждет ярлыка NFC и записывает двоичное сообщение LaunchApp:WriteTag.

Что работало нормально в WP8.1, вообще не работает под 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());
}

К сожалению, это не сработает. Возможность NFC включена, и приложение WP8.1 работает на одном телефоне, поэтому это не должно быть проблемой.

Я уже пробовал несколько форматов, так как проблема выглядит как launchAppMessage, где я не нашел для этого документа UWP. Там есть статья Windows 8+ MSDN, в которой описывается строка в формате:

myArgs\tWindows\tAppFamilyName!App

Что я пробовал:

  • myArgs достаточно короткий - не должно быть проблемой.
  • Windows или WindowsPhone не имеет никакого значения. Оба не работают.
  • AppFamilyName - это правильное имя семейства приложений, которое находится внутри манифеста приложения. Приложение связано с хранилищем, и похоже, что это тоже не проблема.
  • App - это то, что внутри <Application id="App" ... /> в манифесте приложения. Попытка MyAppNamespace.App тоже не работала, и вызов CurrentApp.AppId (что используется в приложениях WinRT) генерирует исключение.

Под "нерабочим" я подразумеваю, что он записывает тег, но тег вообще не распознается Windows 10.

Еще одна вещь, которую я нашел, заключается в том, что для myArgs\tWindows\tAppFamilyName!App приложение выдает следующее исключение - без каких-либо дополнительных сведений:

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

Я действительно надеюсь, что у кого-то есть идея, как это решить. К сожалению, для этого пока нет образцов UWP, и документы все еще старые...:/

PS: использование пользовательского протокола вместе с WindowsUri:WriteTag отлично работает, но я хочу открыть только мое приложение с помощью тега NFC. Кроме того, диалоговое окно подтверждения выглядит так: "Вы хотите открыть приложение, связанное с mycustomprotocol?" - который выглядит не очень удобным для пользователя. Так что никакого реального решения для меня, более обходного пути я не хочу использовать.

4b9b3361

Ответ 1

Windows 10 Mobile UWP

Если вы ориентируетесь только на Windows 10 Mobile, все еще работает 8.1, учитывая, что вы получаете правильный идентификатор приложения. Его можно найти через:

Windows.ApplicationModel.Store.CurrentApp.AppId

Однако это работает только тогда, когда приложение установлено через хранилище, поскольку идентификатор присваивается во время ассоциации/публикации магазина. В развернутых разработчиках сборках API будет разбиваться с помощью "Исключение из HRESULT: 0x803F6107".

В результате записи LaunchApp требуется платформа "WindowsPhone" и этот идентификатор приложения. Следующий код создает тег LaunchApp через библиотеку NFC/NDEF с открытым исходным кодом (https://github.com/andijakl/ndef-nfc) и работает на Windows 10 Mobile - как для написания тег и запуск приложения. Опять же - учитывая, что он был опубликован и установлен через магазин:

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

К сожалению, для ПК все по-другому. Вышеуказанный метод там не работает, также не документированный метод для Windows 8.1.

Самое близкое, что я могу донести до сих пор, - это заставить Windows 10 распознавать тег LaunchApp и открыть хранилище на правильной странице. Но Windows/магазин не понимает, что приложение уже установлено и поэтому не открывает его.

Это код, снова используя библиотеку 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);

Конечно, вы также можете комбинировать два идентификатора платформы с одним тегом NFC, учитывая, что у вас достаточно записываемой памяти, поскольку эти идентификаторы приложений огромны.

Ответ 2

Вот способ:

  • Зарегистрировать фоновое задание и использовать триггер NFC
  • Зарегистрируйте свое приложение для активации uri.
  • Запрограммируйте фоновый набор, который будет активирован при использовании тега NFC, а затем запустите приложение, использующее схемы URI

    //Установите рекомендуемое приложение

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

Ответ 3

Если у вас есть приложение WP8.1 и запущено это приложение на Windows Phone 10 и вы хотите записать теги NFC на свой телефон, вы должны получить AppId. Для этого откройте Центр Windows Dev, откройте соответствующее приложение, нажмите App Management, а затем App identity. Затем под точкой URL for Windows Phone 8.1 and earlier скопируйте GUID и замените Windows.ApplicationModel.Store.CurrentApp.AppId