Как запустить приложение с помощью NFC-тега на Windows Phone 8?


У меня есть устройство Windows Phone 8, несколько NDEF-тегов в формате NFC, и мне интересно, можно ли реализовать запуск приложения на моем WP8 с помощью этих тегов? Я внимательно прочитал эту статью о схемахURI для запуска встроенных приложений для Windows Phone 8 , но не нашел ни одной ссылки, связанной с фактическим запуском сторонних приложений. Я могу запускать различные экраны настроек, или браузер, электронную почту, SMS...

Что еще интереснее, так это то, что в магазине WP есть по крайней мере два NFC-тега, которые можно "писать теги для запуска приложений", я пробовал их, но запуск просто не работает.

Таким образом, вопрос заключается в следующем: можно ли хранить информацию о теге NFC для запуска любого стороннего приложения на WP8? Если да, то каков формат такой схемы URI и как записать ее в тег с помощью WP8?

2 3

2 ответа:

Да, вы можете запустить любое приложение Windows Phone 8 с помощью NFC-тега. Вам нужно поместить сообщение NDEF на тег, который имеет LaunchApp запись как первая запись. Установите идентификатор платформы в полезных данных записи NDEF в "WindowsPhone" и установите идентификатор приложения в шестнадцатеричную строку в конце URL-адреса магазина Windows Phone между " {"и"}", например, для http://www.windowsphone.com/en-us/store/app/stackoverflow-feeds/226fcc72-69ff-4a85-b945-cbb7f5ea00af to "{226fcc72-69ff-4a85-b945-cbb7f5ea00af}".

Эта библиотека может помочь создать такие записи NDEF. Ограниченная документация от MS доступна здесь .

Чтобы запустить приложение с помощью NFC-тега, необходимо зарегистрировать его для ассоциации URI, добавив расширение в файл WMAppManifest.xml, например:

<Extensions>
  <Protocol Name="mynfcapp" NavUriFragment="encodedLaunchUri=%s" TaskID="_default" />
</Extensions>

Затем вам нужно будет создать URI mapper, который может обрабатывать ассоциацию URI, например:

public class AssociationUriMapper : UriMapperBase
{
    public override Uri MapUri(Uri uri)
    {
        string url = HttpUtility.UrlDecode(uri.ToString());

        if (url.Contains("mynfcapp:MainPage"))
        {
            int paramIndex = url.IndexOf("source=") + 7;
            string paramValue = url.Substring(paramIndex);

            return new Uri("/MainPage.xaml?source=" + paramValue, UriKind.Relative);
        }

        return uri;
    }
}

А вот код для написания тега NFC, который запустит приложение:

public partial class MainPage : PhoneApplicationPage
{
    private readonly ProximityDevice _proximityDevice;
    private long subId = 0;
    private long pubId = 0;

    public MainPage()
    {
        InitializeComponent();
        _proximityDevice = ProximityDevice.GetDefault();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (_proximityDevice != null)
            subId = _proximityDevice.SubscribeForMessage("WriteableTag", OnWriteableTagArrived);

        base.OnNavigatedTo(e);
    }
    private void OnWriteableTagArrived(ProximityDevice sender, ProximityMessage message)
    {
        var dataWriter = new DataWriter();
        dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;
        string appLauncher = string.Format(@"mynfcapp:MainPage?source=mynfctest");
        dataWriter.WriteString(appLauncher);
        pubId = sender.PublishBinaryMessage("WindowsUri:WriteTag", dataWriter.DetachBuffer());
    }
}