【问题标题】:How to launch my app via NFC tag?如何通过 NFC 标签启动我的应用程序?
【发布时间】:2016-03-17 06:20:49
【问题描述】:

我目前正在将应用移植到 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 是我的应用清单中的正确应用系列名称。该应用与商店相关联,看起来这也不应该是问题。
  4. 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 关联的应用程序吗?” - 这看起来不是很用户友好。所以这对我来说不是真正的解决方案,更多的是我不想使用的解决方法。

【问题讨论】:

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


    【解决方案1】:

    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 移动版 - 用于编写标签和启动应用程序。再次 - 鉴于它已通过商店发布和安装:

    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 很大。

    【讨论】:

    • 谢谢安德烈亚斯!我已经在您的代码中看到了我的 SO 问题的链接,所以感谢您的详细回答:) 我认为这里真正的问题是如果应用程序没有通过商店安装,则会引发异常,所以让我们看看 MS 是否可以这样做someone from the NFC team of MSFT answered in my MSDN forum thread about this problem
    • 很高兴看到这一点,感谢您的链接!我还在跟进我们的 MVP 邮件列表 - 当我们从 MS 得到明确答复时,让我们保持更新 SO 帖子!
    【解决方案2】:

    这是一种方法:

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

    【讨论】:

    • 请问“NFC 触发器”应该是什么?我找不到任何IBackgroundTaskTrigger 会在找到 NFC 标签时触发?
    • 您同时回答了其他几个问题,我猜您在这里也不知道您的“答案”......太糟糕了。 :/ 我希望其他人可以提供帮助。
    • 我试图找到解决方案。我遇到了 sensordatathreshold 触发器的这个触发器,但不幸的是我没有启用 NFC 的 WINdows 设备来测试或实验这个..所以我现在无法进一步帮助你..有一个艰难的方法,但我不值得痛苦..它正在构建自定义触发器..我认为普通开发人员无法访问它..如果你想采取 lokk 去msdn.microsoft.com/en-us/library/windows/hardware/…
    • 也许您可以尝试研究低级 api 并获取 dll 并围绕它创建一个 c# 包装器并将其用作触发器.. 只是理论.. 未经测试..
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多