Expo SDK 33升级后Facebook广告无法加载,报错1002求助
先看你控制台抛出的错误——errorCode: 1002对应的提示是"Ad was re-loaded too frequently",这是Facebook Ads的限流警告:你的应用在短时间内请求广告的频次太高,触发了平台的频率限制。
结合你贴的代码,我注意到几个可能导致这个问题的细节:
1. Native Ads Manager预加载数量设置过高
你初始化Native Ads Manager时用了new FacebookAds.NativeAdsManager("2272791379702600_2272795453035526", 10);,第二个参数是预加载广告的数量。设置10个预加载广告对于绝大多数场景来说都太多了,尤其是如果你的页面会频繁挂载、卸载,很容易导致短时间内发起大量广告请求,触发限流。
2. Native Ad组件未绑定指定的AdsManager
你的AdScreenFacebook通过withNativeAd高阶组件包装,但没有指定使用你提前创建的adsManager,这会导致组件自动创建新的广告请求实例。再加上你同时渲染了BannerAd组件,多个独立的广告请求叠加起来,很容易触发频次限制。
另外,如果你的导航栈会重复创建AdScreen实例(比如切换页面再返回),外部初始化的adsManager可能会被重复关联,进一步加剧请求频率问题。
具体修复步骤
第一步:调整Native Ads Manager的预加载数量
把预加载数量降到合理值,比如2-3个,减少一次性发起的广告请求数:
const adsManager = new FacebookAds.NativeAdsManager("2272791379702600_2272795453035526", 2);
第二步:给Native Ad组件绑定指定的AdsManager
修改AdScreenFacebook的导出代码,通过withNativeAd的配置项指定使用你创建的adsManager,避免组件自动创建新的请求:
// AdScreenFacebook.js // 确保这里能访问到全局的adsManager,或者把adsManager作为参数传入 export default FacebookAds.withNativeAd(AdScreenFacebook, { adsManager: adsManager, });
这样就不需要再通过props传递adsManager了,组件会直接复用你初始化的实例。
第三步:避免重复初始化广告实例
把adsManager的初始化放到App的根组件(比如App.js)里,确保整个应用生命周期内只初始化一次,而不是在页面组件中重复创建:
// App.js import * as FacebookAds from 'expo-ads-facebook'; // 全局单例的AdsManager export const adsManager = new FacebookAds.NativeAdsManager("2272791379702600_2272795453035526", 2); // 然后在AdScreenFacebook.js里导入 import { adsManager } from './App';
第四步:添加错误重试逻辑
在BannerAd的onError回调里,针对1002错误添加延迟重试机制,不要立即重新请求:
<FacebookAds.BannerAd placementId="2272791379702600_2272803043034767" type="standard" onPress={() => console.log('click')} onError={error => { console.log('error', error); if (error.nativeEvent.errorCode === 1002) { // 30秒后再尝试加载广告,避免再次触发限流 setTimeout(() => { // 可以通过刷新组件状态来重新加载广告 this.setState({ reloadAd: !this.state.reloadAd }); }, 30000); } }} />
记得给AdScreen组件添加reloadAd状态,用来触发广告组件的重新渲染。
额外注意点
- 检查
package.json里的expo-ads-facebook版本,SDK33对应的版本应该是~5.0.0,确保版本兼容。 - 测试时不要频繁刷新页面,Facebook在测试环境的限流机制会更严格,尽量模拟真实用户的操作节奏。
内容的提问来源于stack exchange,提问作者Top World

