2017-04-18 20 views
0

ファイル書き込みのセキュリティ上の問題のため、ms-appx-webを使用するアプリケーションをms-appdata:を使用するように切り替えることを試みました。しかし、ms-appx-webでうまく動作するwindow.external.notify()に依存しているため、すぐには失敗しますが、ms-appdata:でno-opとして動作するようです。Windows 10のms-appdataでJavascript notify()を実行する方法UWP

<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() 

しかし、どのような種類のポップアップメッセージを生成しませんテストとして、我々はWebViewのオブジェクトに次のHTMLをロードしました。どうして?明らかに、demofunc()メソッドが呼び出されてdemo divの2行目の出力が追加されますが、window.external.notify()はポップアップメッセージを生成しません。 ms-appdataと一緒にnotify()に関する特別なルールがありますか:

更新 - 質問Can't run javascript alerts in universal app's webview at payment gatewayはms-appx-webでは似ていて動作しますが、ms-appdataでは動作しません。その質問はScriptNotify()を捕捉し、Windows.UI.Popups.MessageDialogを使用してダイアログをポップアップします。 ms-appx-webの場合:ScriptNotify()はms-appdataと一緒に呼び出されますが、ScriptNotify()は呼び出されません。それが私たちの問題です。ポップアップは起こりません。

+0

これは役に立ちますか? https://social.msdn.microsoft.com/Forums/en-US/bdde7d0f-b1dd-4708-95a9-afe1a50dbb75/script-notify-for-msappdata?forum=w81prevwCsharp – NewToJS

+0

[JavaScriptのアラートを実行できません]の重複している可能性がありますユニバーサルアプリのwebviewでの支払いゲートウェイ](http://stackoverflow.com/questions/31804380/cant-run-javascript-alerts-in-universal-apps-webview-at-payment-gateway) – AVK

+0

リンクありがとうございました、それは非常に興味深いです。 notify()イベントをキャッチし、別のメソッドを実行しているようですが、これは本当に便利です。しかし、実際には、ユーザーのダイアログメッセージをポップアップする必要もあります。実際にこのポストの最も重要な理由は、ポップアップダイアログが欠落していることです。 – user3334340

答えて

1

しかし、ms-appx-webでうまく動作するwindow.external.notify()に依存しているため、すぐに失敗します。ms-appdata:でno-opとして動作するようです。

ms-appdata:///ではなく、ms-local-stream:///というスキームを使用してください。そして、私はms-local-stream:///スキームをテストしました、それはかなりうまくいっています。

NavigateToLocalStreamUriメソッドを使用するには、URIパターンをコンテンツストリームに変換するIUriToStreamResolver実装を渡す必要があります。次のコードを参考にしてください。

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"); } 
     } 
    } 

メインページ

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のにcode sampleをアップロードしました。チェックしてください。

+0

ありがとう、これは実際には表示されないポップアップダイアログの問題を解決します。どうやらUWPでは、Javascriptがms-appdataを使ってポップアップを開始することはできませんが、ms-local-streamを使用することは可能です。 – user3334340