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

How to launch my app via NFC tag?

我目前正在努力将应用程序移植到 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 应用程序在相同的 phone 上工作,因此这应该不是问题。

我已经尝试了多种格式,因为问题似乎出在 launchAppMessage,我没有在其中找到 UWP 文档。有一篇 Windows 8+ MSDN 文章,其中描述了格式为的字符串:

myArgs\tWindows\tAppFamilyName!App

我尝试了什么:

  1. myArgs 足够短 - 应该不是问题。
  2. WindowsWindowsPhone 没有任何区别。两个都不行。
  3. AppFamilyName 是我的应用清单中的正确应用系列名称。该应用已与商店相关联,看起来这应该不是问题所在。
  4. App 是我的应用程序清单中 <Application id="App" ... /> 内的内容。尝试 MyAppNamespace.App 效果不佳,调用 CurrentApp.AppId(在 WinRT 应用程序中使用的)会引发异常。

"not working" 我的意思是它写入标签,但 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 标签打开我的应用程序。此外,确认对话框看起来像 "Do you want to open the app associated with mycustomprotocol?" - 看起来不太用户友好。所以这对我来说不是真正的解决方案,更多的是我不想使用的解决方法。

这里有一个方法:

  1. 注册后台任务并使用 NFC 触发器
  2. 注册您的应用以激活 uri。
  3. 对后台任务进行编程,使其在轻触 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);
    

Windows 10 个移动 UWP

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

Windows.ApplicationModel.Store.CurrentApp.AppId

但是,这仅在通过商店安装应用程序时有效,因为 ID 是在商店关联/发布期间分配的。在开发人员部署的构建中,API 将通过 "Exception from 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 很大。

如果你有一个 WP8.1 应用程序并且 运行 这个应用程序在 Windows Phone 10 上,并且想在你的 phone 上写 NFC 标签,你必须检索AppId。这是通过打开 Windows Dev Center 打开相应的应用程序,单击 App Management,然后单击 App identity 来完成的。然后在点URL for Windows Phone 8.1 and earlier下复制GUID并替换Windows.ApplicationModel.Store.CurrentApp.AppId