我目前正致力于将应用程序移植到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
我尝试了什么:
myArgs
足够短 - 不应该是一个问题.
Windows
或者WindowsPhone
没有任何区别.两者都不起作用.
AppFamilyName
是我的应用程序清单中的正确应用程序系列名称.该应用程序与商店相关联,看起来这也不应该是问题.
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相关联的应用程序吗?" - 看起来不是非常用户友好.所以这对我来说不是真正的解决方案,更多我不想使用的解决方法.
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上运行 - 用于编写标记和启动应用程序.再次 - 鉴于它已通过商店发布和安装:
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很大.