我目前正在尝试使用原生桥实现谷歌搜索广告,并且我能够在原生(android)上看到广告,并且我知道桥正在工作,因为我使用简单的原生按钮进行了测试,但我无法获得这些广告通过桥出现。
通过检查布局检查器,我可以看到 SearchAdView 已添加到带有 webview 子级的布局中,但 webview 的高度为 0。
任何人都有这方面的经验或知道可能出了什么问题?
这是 SDK https://developers.google.com/custom-search-ads/android/
还有我的实现(ids 是隐藏的)
反应面
import { requireNativeComponent } from 'react-native'
const GoogleAdView = requireNativeComponent('GoogleAdView')
export const GoogleAd = () => {
const adRequest = {
query: 'iphone',
clientId: 'MY_VALID_CLIENT_ID',
templateId: 'MY_TEMPLATE_ID',
adTest: true
}
return (
<GoogleAdView
request={adRequest}
style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}
/>
)
})
安卓代码
import android.content.res.Resources
import android.util.Log
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.common.MapBuilder
import com.facebook.react.uimanager.SimpleViewManager
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.annotations.ReactProp
import com.google.android.gms.ads.search.DynamicHeightSearchAdRequest
class ReactGoogleAdManager : SimpleViewManager<RctGoogleAd>() {
private companion object {
const val REACT_CLASS = "GoogleAdView"
const val QUERY = "query"
const val CLIENT_ID = "clientId"
const val TEMPLATE_ID = "templateId"
const val AD_TEST = "adTest"
}
override fun getName(): String {
return REACT_CLASS
}
override fun createViewInstance(reactContext: ThemedReactContext): RctGoogleAd {
return RctGoogleAd(reactContext)
}
@ReactProp(name = "request")
fun loadAds(view: RctGoogleAd, requestMap: ReadableMap) {
val (query, clientId, templateId, adTest) = parseRequestMap(requestMap)
val displayMetrics = Resources.getSystem().displayMetrics
val width = (view.width/displayMetrics.density).toInt()
val height = (view.height/displayMetrics.density).toInt()
Log.d("testlog", "container width: ${width}")
Log.d("testlog", "container height: ${height}")
val request = DynamicHeightSearchAdRequest.Builder()
.setAdTest(adTest)
.setQuery(query)
.setNumber(1)
.setAdvancedOptionValue("csa_adType", "plas")
.setAdvancedOptionValue("csa_width", "128")
.setAdvancedOptionValue("csa_height", "260")
.setAdvancedOptionValue("csa_styleId", templateId)
.build()
view.searchAdView.loadAd(request)
}
private fun parseRequestMap(request: ReadableMap): Request {
if (!request.hasKey(QUERY) ||
!request.hasKey(CLIENT_ID) ||
!request.hasKey(TEMPLATE_ID)) {
throw IllegalArgumentException("Missing required arguments! request: $request")
}
val query = request.getString(QUERY)
val clientId = request.getString(CLIENT_ID)
val templateId = request.getString(TEMPLATE_ID)
val adTest = if (request.hasKey(AD_TEST)) {
request.getBoolean(AD_TEST)
} else {
false
}
return Request(query, clientId, templateId, adTest)
}
data class Request(val query: String?,
val clientId: String?,
val templateId: String?,
val adTest: Boolean)
}
import android.graphics.Color
import android.util.Log
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReactContext
import com.facebook.react.uimanager.events.RCTEventEmitter
import com.facebook.react.views.view.ReactViewGroup
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdSize
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.search.SearchAdView
class RctGoogleAd(val reactContext: ReactContext) : ReactViewGroup(reactContext) {
val searchAdView: SearchAdView
init {
searchAdView = SearchAdView(reactContext).apply {
adUnitId = "MY_ADUNIT_ID"
adSize = AdSize.SEARCH
adListener = object : AdListener() {
override fun onAdLoaded() {
super.onAdLoaded()
Log.d("testlog", "loaded")
val parent = this@RctGoogleAd
measure(MeasureSpec.makeMeasureSpec(parent.width, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(parent.height, MeasureSpec.EXACTLY))
layout(parent.left, parent.top, parent.left + parent.width, parent.top + parent.height)
}
override fun onAdFailedToLoad(error: LoadAdError) {
super.onAdFailedToLoad(error)
Log.d("testlog", error.message)
}
}
}
addView(searchAdView)
}
}