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

C# 如何通过NFC标签启动我的应用程序?,c#,windows-runtime,nfc,windows-10,uwp,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 launchAr

我目前正在将一个应用程序移植到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文档。有一篇MSDN文章描述了以下格式的字符串:

myArgs\tWindows\tAppFamilyName!App
我尝试的是:

  • myArgs
    足够短-应该不会有问题
  • Windows
    WindowsPhone
    没有任何区别。两者都不起作用
  • AppFamilyName
    是我的应用程序清单中正确的应用程序系列名称。该应用程序与商店关联,看起来这也不应该是问题所在
  • App
    是我的应用程序清单中
    的内容。尝试
    MyAppNamespace.App
    也无法正常工作,调用
    CurrentApp.AppId
    (WinRT应用程序中使用的内容)会引发异常
  • “不工作”是指它写入标记,但Windows 10根本无法识别该标记

    我还发现了一件事,那就是
    myArgs\tWindows\tAppFamilyName!应用程序
    应用程序引发以下异常-无任何进一步详细信息:

    System.ExecutionEngineException was unhandled
    Message: An unhandled exception of type 'System.ExecutionEngineException' occurred in Unknown Module.
    
    我真的希望有人知道如何解决这个问题。不幸的是,目前还没有UWP样本,文档仍然是旧的…:/

    PS:使用自定义协议和
    WindowsUri:WriteTag
    可以很好地工作,但我只希望我的应用程序使用NFC标记打开。此外,确认对话框看起来像“您想打开与mycustomprotocol关联的应用程序吗?”——这看起来不是很友好。所以这对我来说不是真正的解决方案,更多的是我不想使用的解决方法。

    这里有一种方法:

  • 注册后台任务并使用NFC触发器
  • 注册应用程序以激活uri
  • 将backgroundtask编程为在使用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方式仍然有效,前提是您获得了正确的应用程序ID。可以通过以下方式检索:

    Windows.ApplicationModel.Store.CurrentApp.AppId
    
    但是,这仅在通过商店安装应用程序时有效,因为ID是在商店关联/发布期间分配的。在开发人员部署的构建中,API将崩溃,并出现“来自HRESULT的异常:0x803F6107”

    然后,生成的LaunchApp记录需要平台“WindowsPhone”和该应用ID。以下代码通过开源NFC/NDEF库()创建LaunchApp标记,并在Windows 10 Mobile上运行-用于写入标记和启动应用。再次说明-假定已通过商店发布和安装:

    var record=newndeflaunchapprecord{Arguments=“Hello World”};
    var appId=Windows.ApplicationModel.Store.CurrentApp.appId;//注意:应用未通过应用商店安装时崩溃!
    记录.AddPlatformAppId(“WindowsPhone”,appId);
    var message=新的NdefMessage{record};
    proximityDevice.PublishBinaryMessage(“NDEF:WriteTag”,msgArray.AsBuffer(),messagewritenHandler);
    
    Windows 10 PC

    不幸的是,PC的情况不同。上面的方法在那里不起作用,Windows 8.1的文档化方法也不起作用

    到目前为止,我能做的最接近的事情就是让Windows 10识别LaunchApp标签,并在正确的页面上打开商店。但是Windows/商店没有意识到应用程序已经安装,因此没有打开它

    这是代码,同样使用NFC/NDEF库:

    var record=newndeflaunchapprecord{Arguments=“Hello World”};
    var familyName=Windows.ApplicationModel.Package.Current.Id.familyName;
    var appId=Windows.ApplicationModel.Store.CurrentApp.appId;//注意:应用未通过应用商店安装时崩溃!
    AddPlatformAppId(“Windows”,“{”+familyName+“!”+appId+“}”);
    var message=新的NdefMessage{record};
    proximityDevice.PublishBinaryMessage(“NDEF:WriteTag”,msgArray.AsBuffer(),messagewritenHandler);
    

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

    如果你有一个WP8.1应用程序,并且在Windows Phone 10上运行此应用程序,并且想在你的手机上写NFC标签,你必须检索
    AppId
    。打开相应的应用程序,单击
    app Management
    ,然后单击
    app identity
    ,即可完成此操作。然后在Windows Phone 8.1及更早版本的
    URL点下,复制
    GUID
    并替换
    Windows.ApplicationModel.Store.CurrentApp.AppId

    我可以问一下“NFC触发器”应该是什么吗?我找不到任何
    IBackgroundTaskTrigger
    在找到NFC标签时会触发哪些?因为您同时回答了其他几个问题,我猜您也不知道您的“答案”。。。太糟糕了。:/我希望其他人能帮上忙。我正试图找到一个解决办法。我遇到了sensordatathreshold触发器的这个触发器,但不幸的是,我没有一个支持NFC的WIndows设备来测试或实验这个。。所以在这一点上我不能再帮你了。。这是一条艰难的道路,但我认为不值得付出痛苦。。它正在构建自定义触发器。。我认为普通开发者无法访问它。。如果你想做一个lokk-go-be,你可以尝试研究底层API,获取dll并在其周围创建一个c#包装器,并将其用作触发器。。只是理论。。不