Как Javascript notify () с ms-appdata в Windows 10 UWP

Из-за проблем с безопасностью записи файлов мы попытались переключить наше приложение с использования ms-appx-web: на использование ms-appdata :. Но это сразу же терпит неудачу, потому что мы полагаемся на window.external.notify (), который отлично работает с ms-appx-web: но, похоже, ведет себя как безоперационный с ms-appdata :. В качестве теста мы загрузили следующий HTML-код в объект WebView:

<html>
<head>
    <script>
        function demofunc( str ) {
            document.getElementById("demo").innerHTML += str;
            window.external.notify( str );
        }
    </script>
</head>
<body onLoad="demofunc('demofunc()');">
    demo &lt;body&gt;
    <div id="demo"></div>
</body>
</html>

который дает такой результат, как и должно:

demo <body> 
demofunc()

НО, НЕ создает всплывающих сообщений любого типа. Почему? Очевидно, что метод demofunc () вызывается для добавления второй строки вывода в демонстрационный блок div, но window.external.notify () не создает всплывающее сообщение. Существуют ли особые правила относительно notify () вместе с ms-appdata:

Обновление - вопрос Не удается запустить предупреждения javascript в универсальном приложении веб-просмотр на платежном шлюзе аналогичен и работает для ms-appx-web: но не для ms-appdata :. Этот вопрос улавливает ScriptNotify (), который затем использует Windows.UI.Popups.MessageDialog для вызова диалогового окна. С ms-appx-web: вызывается ScriptNotify (), но с ms-appdata: ScriptNotify () не вызывается. Это наша проблема, всплывающее окно не появляется.


person user3334340    schedule 18.04.2017    source источник
comment
Может это поможет? social.msdn.microsoft.com/Forums/en-US/   -  person NewToJS    schedule 18.04.2017
comment
Спасибо за ссылку, очень интересно. Кажется, он обращается к перехвату события notify () и запуску другого метода, который действительно очень полезен. Но нам также действительно нужно вывести диалоговое окно для пользователя. Отсутствие всплывающего диалогового окна на самом деле является самой важной причиной этого сообщения.   -  person user3334340    schedule 18.04.2017
comment
Возможный дубликат Как получить scriptNotify от html в appdata в UWP c #   -  person Jay Zuo    schedule 20.04.2017


Ответы (1)


Но это сразу же терпит неудачу, потому что мы полагаемся на window.external.notify (), который отлично работает с ms-appx-web: но, похоже, ведет себя как безоперационный с ms-appdata :.

Для вашего сценария используйте схему ms-local-stream:///, а не ms-appdata:///. И я тестировал ms-local-stream:/// схему, она работает неплохо.

Для использования , необходимо передать реализацию IUriToStreamResolver, которая переводит шаблон URI в поток содержимого. Пожалуйста, укажите следующий код.

StreamUriWinRTResolver

public sealed class StreamUriWinRTResolver : IUriToStreamResolver
    {
        /// <summary>
        /// The entry point for resolving a Uri to a stream.
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        public IAsyncOperation<IInputStream> UriToStreamAsync(Uri uri)
        {
            if (uri == null)
            {
                throw new Exception();
            }
            string path = uri.AbsolutePath;
            // Because of the signature of this method, it can't use await, so we
            // call into a separate helper method that can use the C# await pattern.
            return getContent(path).AsAsyncOperation();
        }

        /// <summary>
        /// Helper that maps the path to package content and resolves the Uri
        /// Uses the C# await pattern to coordinate async operations
        /// </summary>
        private async Task<IInputStream> getContent(string path)
        {
            // We use a package folder as the source, but the same principle should apply
            // when supplying content from other locations
            try
            {
                Uri localUri = new Uri("ms-appdata:///local" + path);
                StorageFile f = await StorageFile.GetFileFromApplicationUriAsync(localUri);
                IRandomAccessStream stream = await f.OpenAsync(FileAccessMode.Read);
                return stream.GetInputStreamAt(0);
            }
            catch (Exception) { throw new Exception("Invalid path"); }
        }
    }

MainPage

public MainPage()
 {
     this.InitializeComponent();
     MyWebView.ScriptNotify += MyWebView_ScriptNotify;
     Uri url = MyWebView.BuildLocalStreamUri("MyTag", "/Test/HomePage.html");
     StreamUriWinRTResolver myResolver = new StreamUriWinRTResolver();
     MyWebView.NavigateToLocalStreamUri(url, myResolver);
 }

Я загрузил образец кода на github. Пожалуйста, проверьте.

person Nico Zhu - MSFT    schedule 19.04.2017
comment
Спасибо, это действительно решает проблему, когда всплывающее диалоговое окно не отображается. Очевидно, UWP не позволяет Javascript запускать всплывающее окно с помощью ms-appdata, но позволяет использовать ms-local-stream. - person user3334340; 19.04.2017