0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

addWebAllowedObject

Last updated at Posted at 2016-05-22

addWebAllowedObject

  • UWPのWebViewのJavaScriptにオブジェクトを挿入して、JavaScriptからC#のメソッドにアクセスできる。AndroidのaddJavaScriptInterfaceみたいなもの。
  • インジェクションできるオブジェクトはWindowsランタイムコンポーネントのみ?
  • JavaScriptのUWPはappx化しても丸見え改竄し放題なので、これで隠したい実装や定数をWindowsランタイムコンポーネント側にC#で書くようなことができる。

XAML+WebViewでaddWebAllowedObject

  • XAMLにベタ書きしたWebViewのJavaScriptからWindowsランタイムコンポーネントのメソッドを呼べる。普通に値を返す場合はそれで事足りるんだけど、非同期にWebViewに値を戻したい場合はどうすればいい?具体的には確認ダイアログ。
  • MainPage.xaml.csからランタイムコンポーネント側にwebViewへの参照を渡しておいて、ランタイムコンポーネント側からInvokeScriptAsyncするとSystem.Exception とか System.UnauthorizedAccessException になる。
string x = await webView.InvokeScriptAsync("eval", new string[] { "confirmDialogResult('Yes')" });
  • WebViewが配置されたMainPageからしかJavaScript流しこめないのかな。
  • 確認ダイアログ程度ならJSでもまぁいいかと、Windows.UI.Popups.MessageDialog にしてみる。x86/x64では動くけど、armってかw10m実機でshowAsyncしてYesNo押してもメソッドが呼ばれない。こんなところでモバイルとPCの非互換。うーん。。。

JavaScript + x-ms-webviewでaddWebAllowedObject

  • JavaScriptとWindowsランタイムコンポーネントの構成。index.htmlにx-ms-webviewタグを書いて、jsでaddWebAllowedObjectできた。
  • ランタイムコンポーネント側でダイアログ系は動かない。まぁビューへの関連付けとか全然ケアしてないから折り込み済み。
  • で、確認ダイアログ程度ならJSでもまぁいいかと、Windows.UI.Popups.MessageDialog にしてみたけど、showAsyncしても何も表示されない。あれれ?。
base.js
// If getForCurrentView fails, it is an indication that we are running in a WebView without
// a CoreWindow where some WinRT APIs are not available. In this case, we just treat it as
// if no WinRT APIs are available.
var isCoreWindowAvailable = false;
try {
_Global.Windows.UI.ViewManagement.InputPane.getForCurrentView();
isCoreWindowAvailable = true;
} catch (e) { }
  • 要するにWebViewではWinRTの一部機能が使えませんよと。XAMLのほうはCoreWindow使えてるみたいだけど。

さてどうするか

  • JS + Windowsランタイムコンポーネントのほうがキレイだけど、x-ms-webviewでWindows.UI系のAPIが確実に利用できないので、諦める。
  • XAMLのほうはJSのWindows.UI.Popups.MessageDialogがモバイル実機でちゃんと動いてくれたらなー。UWPのくせになんで環境依存してるんだよ…
  • ランタイムコンポーネントからMainPage.xaml.csのメソッド呼べないのかな。MainPageクラスからならInvokeScriptAsyncが動く気がする。C#初心者なのでよくわからない。

オチ

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?