Как запустить приложение через тег 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?" - который выглядит не очень удобным для пользователя. Так что никакого реального решения для меня, более обходного пути я не хочу использовать.
Ответы
Ответ 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