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

时间:2015-12-11 10:53:24

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

我目前正致力于将应用移植到UWP。该应用程序有一个页面,其中包含"写入NFC"按钮。在用户点击它之后,它会等待NFC标记并写入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()); } 二进制消息。

什么在WP8.1下运行良好,在Windows 10 UWP下根本不起作用:

launchAppMessage

不幸的是,这不起作用。 NFC功能已启用,WP8.1应用程序可在同一部手机上运行,​​因此这不应成为问题。

我已经尝试了多种格式,因为问题似乎是myArgs\tWindows\tAppFamilyName!App ,我没有找到UWP文档。这是一篇Windows 8+ MSDN文章,它描述了格式为字符串的字符串:

myArgs

我尝试了什么:

  1. Windows足够短 - 不应该成为问题。
  2. WindowsPhoneAppFamilyName没有任何区别。两个都不工作。
  3. App是我的应用清单中正确的应用系列名称。该应用与商店相关联,看起来这也不应该成为问题。
  4. <Application id="App" ... />是我的应用清单中MyAppNamespace.App内的内容。尝试CurrentApp.AppId也没有效果,并且调用myArgs\tWindows\tAppFamilyName!App(在WinRT应用中使用的内容)会引发异常。
  5. 不工作&#34;我的意思是它写入标签,但Windows 10根本无法识别标签。

    我发现的另一件事是,对于System.ExecutionEngineException was unhandled Message: An unhandled exception of type 'System.ExecutionEngineException' occurred in Unknown Module. ,应用程序抛出以下异常 - 没有任何进一步的细节:

    WindowsUri:WriteTag

    我真的希望有人知道如何解决这个问题。不幸的是,目前还没有UWP样本,而且文档仍旧是旧的...:/

    PS:使用自定义协议和{{1}}一起工作正常,但我只想用NFC标签打开我的应用。此外,确认对话框看起来像&#34;您是否要打开与mycustomprotocol相关联的应用程序?&#34; - 看起来不是非常用户友好。这对我来说不是真正的解决方案,更多我不想使用的解决方法。

3 个答案:

答案 0 :(得分:5)

Windows 10移动UWP

如果您只定位Windows 10移动版,那么8.1方式仍然有效,因为您获得了正确的应用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上运行 - 用于编写标记和启动应用程序。再一次 - 鉴于它已经出版&amp;通过商店安装:

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

不幸的是,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非常庞大。

答案 1 :(得分:1)

这是一种方式:

  1. 注册后台任务并使用NFC触发器
  2. 注册您的应用以激活uri。
  3. 编程后台任务以在使用NFC标签轻触时激活,然后启动应用程序suing 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);
    

答案 2 :(得分:0)

如果您有一个WP8.1应用程序并在Windows Phone 10上运行此应用程序并想要在手机上编写NFC标签,则必须检索Node * addFront( Node *first, double x, double y ) { Node *temp = malloc( sizeof( Node ) ); if ( temp != NULL ) { temp->x = x; temp->y = y; temp->next = first; first = temp; } // start pf inline test size_t size = 0; for ( Node *current = first; current != NULL; current = current->next ) { printf( "(%.4f, %.4f)\n", current->x, current->y ); ++size; } printf( "Size: %zu\n", size ); // end pf inline test return first; } 。这是通过打开Windows Dev Center打开相应的应用,点击AppId然后点击App Management来完成的。然后在App identity点下复制URL for Windows Phone 8.1 and earlier并替换GUID