メインコンテンツまでスキップ

Android appの実装

サンプルコードを例に、advertising_idなどの受け渡し、そのほか実装上の注意事項に関して説明します。

  1. JavaScriptとの連携方法
    1. Webページにデータ取得用のインターフェース作成
    2. Webページからadvertising_id,appbundle,platformvを取得する
  2. 広告リダイレクトの対応
  3. その他WebViewの設定

JavaScriptとの連携方法

ネイティブアプリにデータ取得用のインターフェース作成

クラス作成

import android.os.Build

class WebAppInterface {

companion object {
private const val TAG = "WebAppInterface"
}

private var advertising_id: String? = ""
private var isLAT: Boolean = false
private lateinit var context: Context

constructor(ct: Context) {
this.context = ct
this.initAdIdThread()
}

private fun initAdIdThread() {
val adIdThread = Thread {
var adInfo: AdvertisingIdClient.Info? = null
try {
adInfo = AdvertisingIdClient
.getAdvertisingIdInfo(this.context)
advertising_id = adInfo.id
isLAT = adInfo.isLimitAdTrackingEnabled
} catch (e: Exception) {
Log.d(TAG, "getAdId failed")
}
}
adIdThread.start()
}

@JavascriptInterface
open fun getAppBundle(): String {
return this.context.packageName ?: ""
}

@JavascriptInterface
open fun getAdvertisingId(): String {
val adid = advertising_id ?: ""
return if (!isLAT) adid else ""
}

@JavascriptInterface
open fun getPlatformV(): String {
return Build.VERSION.RELEASE
}
}

javascriptから処理を呼び出せるように設定

val context = applicationContext
webView.addJavascriptInterface(WebAppInterface(context), "Android")

Webページからadvertising_id,appbundle,platformvを取得する

const advertising_id = Android.getAdvertisingId();
const appbundle = Android.getAppBundle();
const platformv = Android.getPlatformV();

取得したadid,packageNameを利用し 広告タグにパラメータを生成してください。 {〜}が置換部分となります。値はURLエンコードを行ってください。 AdvertisingIDについては、端末側でオプトアウトされている場合は付与しないようにご注意ください。

<div id="adg_area"></div>
<script>
/*
idfa : iOSの場合この変数にidfaがセットされているとする(オプトアウト時除く)
aaid : Androidの場合この変数にAdvertising IDがセットされているとする(オプトアウト時除く)
appbundle : 実際にはこの変数にBundle IDかPackage Nameがセットされているとする。
platformv : iOS/Androidのバージョンがセットされているとする。
*/
(function() {
const div = document.getElementById("adg_area");
const script = document.createElement('script');
script.type = 'text/javascript';

let idfa = window?.adgAdParams?.idfa ?? "";
let advertising_id = window?.Android?.getAdvertisingId?.() ?? "";
let appbundle = window?.adgAdParams?.appbundle ?? window?.Android?.getAppBundle?.() ?? "";
let platformv = window?.adgAdParams?.platformv ?? window?.Android?.getPlatformV?.() ?? "";


// scriptのsrcにセットするテキストは実際に管理画面から取得されるタグのsrcと合わせてください。ただし、asyncは必ずtrueにしてください。
let srcText ='https://i.socdm.com/sdk/js/adg-script-loader.js?id=48547&targetID=adg_48547&displayid=1&adType=SP&async=true&tagver=2.0.0';
if(idfa.length > 0){
srcText += '&idfa=' + encodeURIComponent(idfa);
}
else if(advertising_id.length > 0){
srcText += '&advertising_id=' +encodeURIComponent(advertising_id);
}
if(appbundle.length > 0){
srcText += '&appbundle=' + encodeURIComponent(appbundle);
}
if(platformv.length > 0){
srcText += '&platformv=' + encodeURIComponent(platformv);
}
script.src =srcText;
if(div != null){
div.appendChild(script);
}
})();
</script>

広告リダイレクトの対応

配信される広告のタップ動作によって、外部のサイトへ移動したり Google Playのリンクなどを開けるようにする。 サンプルではドメインによって、外部サイトを判定しています。

webView.webViewClient = object : WebViewClient() {

override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?,
): Boolean {
Log.d(TAG, "shouldOverrideUrlLoading")
if (request?.url?.host == null) {
return false
}

val currentDomain = URL(view?.url).host

// http-httpsではないものは別
if (!request.url.scheme.equals("http") &&
!request.url.scheme.equals("https")
) {
val intent = Intent(Intent.ACTION_VIEW, request.url)
// If the URL cannot be opened, return early.
try {
Log.d(TAG, "Handle custom URL schemes ${request.url.scheme}")
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}
} catch (exception: ActivityNotFoundException) {
Log.d("TAG", "Failed to load URL with scheme: ${request.url.scheme}")
}
return true
}

// 現在のドメインと遷移先のドメインが異なれえば外部のサイトだと判定する
val targetDomain = request?.url?.host
if (!currentDomain.equals(targetDomain)) {
// 外部のサイト
Log.d(TAG, "external Web Site ${request.url.scheme}")
val intent: CustomTabsIntent = CustomTabsIntent.Builder().build()
intent.launchUrl(this@MainActivity, request.url)
return true
}

// 同一サイト
return false
}

override fun doUpdateVisitedHistory(view: WebView?, url: String?, isReload: Boolean) {
onBackPressedCallback.isEnabled = webView.canGoBack()
}
}

その他WebViewの設定

以下の点を対応してください。

  • cookieの有効化
  • JavaScriptの有効化
  • LocalStorage有効化
  • 動画の自動再生許可
// cookieを利用できるようにする
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true)
// JavaScript有効化
webView.settings.javaScriptEnabled = true
// LocalStorage有効化
webView.settings.domStorageEnabled = true
// 動画の自動再生許可
webView.settings.mediaPlaybackRequiresUserGesture = false