c# - 如何通过 NFC 标签启动我的应用程序?

标签 c# windows-runtime nfc windows-10 uwp

我目前正致力于将应用程序移植到 UWP。该应用程序有一个带有“写入 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

我尝试过的:

  1. myArgs足够短 - 应该不是问题。
  2. WindowsWindowsPhone没有任何区别。两者都不起作用。
  3. AppFamilyName是我的应用 list 中的正确应用系列名称。该应用已与商店相关联,看起来这也不应该是问题所在。
  4. App里面是什么<Application id="App" ... />在我的应用程序 list 中。尝试 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:将自定义协议(protocol)与 WindowsUri:WriteTag 一起使用工作正常,但我只希望我的应用程序使用 NFC 标签打开。此外,确认对话框看起来像“你想打开与 mycustomprotocol 关联的应用程序吗?” - 看起来不太用户友好。所以这对我来说不是真正的解决方案,更多的是我不想使用的解决方法。

最佳答案

Windows 10 移动版 UWP

如果您只针对 Windows 10 移动版,8.1 方式仍然有效,前提是您获得了正确的 App ID。可以通过以下方式检索:

Windows.ApplicationModel.Store.CurrentApp.AppId

但是,这仅在通过商店安装应用程序时有效,因为 ID 是在商店关联/发布期间分配的。在开发人员部署的版本中,API 将崩溃并显示“HRESULT 异常:0x803F6107”。

生成的 LaunchApp 记录需要平台“WindowsPhone”和该应用程序 ID。以下代码通过开源 NFC/NDEF 库 (https://github.com/andijakl/ndef-nfc) 创建 LaunchApp 标签并在 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 电脑

不幸的是,PC 的情况有所不同。上面的方法在那里不起作用,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);

当然,如果你有足够的可写内存,你也可以将两个平台 ID 组合到一个 NFC 标签中,因为这些应用程序 ID 很大。

关于c# - 如何通过 NFC 标签启动我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34221812/

相关文章:

c# - 当这种情况发生时如何通知一个人?

c# - 在 C# 中包装包含固定大小 C 数组的结构

c# - 在UWP应用程序中直接调用后台任务

windows-8 - WinRT MVVM Light 示例项目

nfc - 用于支付的 MIFARE 卡符合 EMVco 标准

java - 如何使用 smartcardio 和 Java 控制 ACR122 上的 LED?

c# - 没有构造函数的本地化依赖注入(inject)

c# - 为什么新线程可以访问UI?

nfc - Apple Watch 是否被 RFID 读取器检测到?

c# - 无法在 WPF 应用程序中创建自定义命令