在我的React Native App中,我正在使用WebView通过“ injectedJavascript”道具来显示Google广告(AdSense)。问题是我无法提前知道广告的高度。因此,我首先给它一个随机的高度,当它的样式更新时,我打算正确设置它的高度。
我假设必须在注入的JS代码中获取高度,然后使用“ window.postMessage()”方法通过“ onMessage”道具将其发送到WebView。
将MutationObserver与promise结合起来似乎非常适合这种情况。现在,我只想从Webview接收消息。所以这是我的代码,但是没有消息发送:
export default class App extends Component {
constructor(props) {
super(props);
}
_onMessage(e) {
console.warn(e.nativeEvent.data);
}
render() {
const jsCode = `
window._googCsa('ads', pageOptions, adblock1);
function waitForAdSense(id) {
var config = {
attributes: true,
attributeFilter: ['style'],
};
return new Promise((resolve, reject) => {
var adSenseElement = document.body.getElementById(id);
if (adSenseElement.style) {
resolve(adSenseElement.style.height);
return;
}
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.attributeName === 'style') {
observer.disconnect();
resolve(adSenseElement);
return;
}
});
});
observer.observe(adSenseElement, config);
});
}
waitForAdSense('afscontainer1').then(height => {
window.postMessage(height, '*');
});
`;
return (
<ScrollView>
<WebView
key={'AdSense'}
ref={'webview2'}
style={{ height: 300 }}
source={{
uri: isAndroid
? 'file:///android_asset/widget/adSense.html'
: './widget/index.html',
}}
javaScriptEnabled={true}
mixedContentMode="compatibility"
injectedJavaScript={jsCode}
scrollEnabled={false}
domStorageEnabled={true}
onMessage={this._onMessage}
scalesPageToFit
startInLoadingState={true}
automaticallyAdjustContentInsets={false}
/>
;
</ScrollView>
);
}
}
尽管,我可以使其与这段代码一起使用,但是setTimeout并不是最佳解决方案:
window._googCsa('ads', pageOptions, adblock1);
var adSenseContainer = document.getElementById("afscontainer1");
setTimeout(function(){ window.postMessage(adSenseContainer.style.height, '*'); },1000);
您有什么想法吗?我认为我的函数waitForAdSense()可能会以某种方式错误。预先感谢!
答案 0 :(得分:1)
最好的解决方案是在React Native移动应用程序上使用AdMob代替AdSense。弄乱这些问题有点没有意义,因为AdSense JavaScript并不是出于这种用例而设计的。这是一个library,可轻松将AdMob集成到您的应用中。
答案 1 :(得分:0)
我设法使其与注入的代码中的此更改一起工作:
window._googCsa('ads', pageOptions, adblock1);
function waitForAdSense() {
var config = {
attributes: true,
attributeFilter: ["style"]
};
var adSenseContainer = document.getElementById("afscontainer1");
return new Promise((resolve, reject) => {
var observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
if (mutation.attributeName === 'style' && adSenseContainer.style.height) {
var height = adSenseContainer.style.height;
resolve(height);
observer.disconnect();
return;
};
});
});
observer.observe(adSenseContainer, config);
});
};
waitForAdSense().then(height => {
window.postMessage(height, '*');
});
感谢您的建议!