アプリに HTML 広告を表示するために使用する WebView コンポーネントがあります。ユーザーが WebView で広告をクリックすると、外部ブラウザで広告リンクが開きます。それ、どうやったら出来るの?
WP7 ブラウザーからの OnNavigating のようなものが必要です。WebView の Tapped イベントを試しましたが、IsTapEnabled=true に設定しても呼び出されません。次のようなものが必要です
アプリに HTML 広告を表示するために使用する WebView コンポーネントがあります。ユーザーが WebView で広告をクリックすると、外部ブラウザで広告リンクが開きます。それ、どうやったら出来るの?
WP7 ブラウザーからの OnNavigating のようなものが必要です。WebView の Tapped イベントを試しましたが、IsTapEnabled=true に設定しても呼び出されません。次のようなものが必要です
これには ScriptNotify イベントを使用する必要があります。シナリオをどのように処理したかを次に示します (NavigateToString を使用)。URL から Web ビューのコンテンツを取得する場合、これが機能するように HTML を変更できる必要があります。
次の Javascript コードを HTML に追加します。
<script type="text/javascript">for (var i = 0; i < document.links.length; i++) { document.links[i].onclick = function() { window.external.notify('LaunchLink:' + this.href); return false; } }</script>
これにより、ページ上のすべてのリンク (<a href="..."></a>) に onclick ハンドラーが追加されます。window.external.notify は、Webview で機能する Javascript メソッドです。
ScriptNotify イベント ハンドラーを Web ビューに追加します。
WebView.ScriptNotify += WebView_ScriptNotify;
イベント ハンドラーを宣言する
async private void WebView_ScriptNotify(object sender, NotifyEventArgs e)
{
try
{
string data = e.Value;
if (data.ToLower().StartsWith("launchlink:"))
{
await Launcher.LaunchUriAsync(new Uri(data.Substring("launchlink:".Length), UriKind.Absolute));
}
}
catch (Exception)
{
// Could not build a proper Uri. Abandon.
}
}
外部 URL を使用している場合は、これを webview の許可された Uris ホワイトリスト ( http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml. controls.webview.scriptnotify参照)。
NavigationStarting イベントの処理を試みます。ここで、URL の読み込みをインターセプトしてキャンセルできます。Web ビューで開くリンクと、既定のブラウザーで開くリンクをフィルター処理できます。
private async void webView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
{
if(null != args.Uri && args.Uri.OriginalString == "URL OF INTEREST")
{
args.Cancel = true;
await Launcher.LaunchUriAsync(args.Uri);
}
}