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#初心者なのでよくわからない。
オチ
- チュートリアル: 単純な Windows ランタイム コンポーネントの作成と JavaScript からの呼び出し
- JSから直接Windowsランタイムコンポーネントを参照できたというね。