横幅和 MREC 广告

在 React Native 应用中集成 CloudX 横幅和 MREC 广告

组件横幅

当广告需要参与 React Native 布局时,使用 CloudXBannerView。该组件会像普通视图一样渲染,因此父级布局、间距、安全区域、覆盖层和层级顺序都按应用 UI 的常规方式工作。

import React from 'react';
import { View } from 'react-native';
import { CloudXBannerView } from 'cloudx-react-native';

const AD_UNIT_ID = 'home_banner';

export function HomeScreen() {
    return (
        <View>
            <CloudXBannerView
                adUnitId={AD_UNIT_ID}
                placement="home_screen"
                customData="subscriber"
                extraParameters={{
                    section: 'top_stories',
                    refreshIndex: 1,
                    loggedIn: true,
                    experiments: ['component_banner'],
                    user: {
                        cohort: 'sports',
                    },
                }}
                onAdLoaded={(adInfo) => {
                    console.log('横幅已加载,来自', adInfo.networkName);
                }}
                onAdLoadFailed={(error) => {
                    console.log('横幅加载失败:', error.code, error.message);
                }}
                onAdClicked={(adInfo) => {
                    console.log('横幅已点击:', adInfo.adUnitId);
                }}
                onAdRevenuePaid={(adInfo) => {
                    console.log('横幅收入:', adInfo.revenue);
                }}
            />
        </View>
    );
}

CloudXBannerView 在手机上默认为 320x50,在平板上默认为 728x90。你可以传入普通 React Native ViewProps,包括 styletestID 和无障碍属性。

组件会自行管理原生广告生命周期。组件广告位不要再调用 CloudXBannerAd.createAd()showAd()destroyAd()。如果需要更换 adUnitId,请通过不同的 React key 重新挂载组件。

<CloudXBannerView
    adUnitId="home_banner"
    style={{ alignSelf: 'center', marginVertical: 12 }}
/>

组件 MREC

使用 CloudXMRECView 集成布局内的 300x250 MREC 广告位。它支持与 CloudXBannerView 相同的组件 props 和回调。

组件会自行管理原生广告生命周期。组件广告位不要再调用 CloudXMRECAd.createAd()showAd()destroyAd()

import React from 'react';
import { View } from 'react-native';
import { CloudXMRECView } from 'cloudx-react-native';

export function ArticleScreen() {
    return (
        <View>
            <CloudXMRECView
                adUnitId="article_mrec"
                placement="article_body"
                customData="sports_article"
                onAdLoaded={(adInfo) => {
                    console.log('MREC 已加载,来自', adInfo.networkName);
                }}
                onAdLoadFailed={(error) => {
                    console.log('MREC 加载失败:', error.code, error.message);
                }}
                onAdClicked={(adInfo) => {
                    console.log('MREC 已点击:', adInfo.adUnitId);
                }}
                onAdRevenuePaid={(adInfo) => {
                    console.log('MREC 收入:', adInfo.revenue);
                }}
            />
        </View>
    );
}

组件 Props

Prop类型说明
adUnitIdstring必填的 CloudX 广告单元 ID。
placementstringnull可选的 placement 名称,用于报表统计。
customDatastringnull可选的 custom data 字符串。
extraParametersCloudXExtraParametersnull可选的额外参数,用于广告网络或服务端配置。
onAdLoaded(adInfo) => void广告加载成功时调用。
onAdLoadFailed(error) => void广告加载失败时调用。
onAdClicked(adInfo) => void广告被点击时调用。
onAdRevenuePaid(adInfo) => void展示级收入可用时调用。

CloudXExtraParameters 支持 string、number、boolean、null、数组和嵌套对象。

<CloudXBannerView
    adUnitId="home_banner"
    extraParameters={{
        screen: 'home',
        position: 1,
        autoplay: false,
        keywords: ['sports', 'scores'],
        auction: {
            floor: 0.5,
        },
    }}
/>

程序化叠加横幅

需要现有原生叠加行为时,使用 CloudXBannerAd。程序化横幅会在固定屏幕位置覆盖在应用内容上方。

import { CloudXBannerAd, CloudXAdPosition } from 'cloudx-react-native';

const AD_UNIT_ID = 'home_banner';

CloudXBannerAd.addAdLoadedEventListener((adInfo) => {
    console.log('横幅已加载,来自', adInfo.networkName);
});
CloudXBannerAd.addAdLoadFailedEventListener((error) => {
    console.log('横幅加载失败:', error.code, error.message);
});
CloudXBannerAd.addAdClickedEventListener((adInfo) => {
    console.log('横幅已点击');
});
CloudXBannerAd.addAdExpandedEventListener((adInfo) => {
    console.log('横幅已展开');
});
CloudXBannerAd.addAdCollapsedEventListener((adInfo) => {
    console.log('横幅已收起');
});
CloudXBannerAd.addAdRevenuePaidListener((adInfo) => {
    console.log('横幅收入:', adInfo.revenue);
});

CloudXBannerAd.createAd(AD_UNIT_ID, CloudXAdPosition.BOTTOM_CENTER);
CloudXBannerAd.showAd(AD_UNIT_ID);

CloudXBannerAd.hideAd(AD_UNIT_ID);
CloudXBannerAd.destroyAd(AD_UNIT_ID);

默认启用自动刷新。如需手动控制:

CloudXBannerAd.stopAutoRefresh(AD_UNIT_ID);
CloudXBannerAd.startAutoRefresh(AD_UNIT_ID);

使用 CloudXAdPosition 放置叠加横幅:

TOP_LEFTTOP_CENTERTOP_RIGHTCENTER_LEFTCENTEREDCENTER_RIGHTBOTTOM_LEFTBOTTOM_CENTERBOTTOM_RIGHT

如需像素级控制,使用偏移量:

CloudXBannerAd.createAdWithOffsets(AD_UNIT_ID, CloudXAdPosition.TOP_CENTER, 0, 50);
CloudXBannerAd.updatePosition(AD_UNIT_ID, CloudXAdPosition.BOTTOM_CENTER);
CloudXBannerAd.updateOffsets(AD_UNIT_ID, 0, 20);

用于统计的可选 placement 和 custom data:

CloudXBannerAd.setBackgroundColor(AD_UNIT_ID, '#000000');
CloudXBannerAd.setPlacement(AD_UNIT_ID, 'home_screen');
CloudXBannerAd.setCustomData(AD_UNIT_ID, 'custom_data');

程序化叠加 MREC

MREC 叠加广告使用 CloudXMRECAd,尺寸为 300x250

import { CloudXMRECAd, CloudXAdPosition } from 'cloudx-react-native';

const AD_UNIT_ID = 'home_mrec';

CloudXMRECAd.addAdLoadedEventListener((adInfo) => {
    console.log('MREC 已加载,来自', adInfo.networkName);
});
CloudXMRECAd.addAdLoadFailedEventListener((error) => {
    console.log('MREC 加载失败:', error.code, error.message);
});
CloudXMRECAd.addAdClickedEventListener((adInfo) => {
    console.log('MREC 已点击');
});
CloudXMRECAd.addAdExpandedEventListener((adInfo) => {
    console.log('MREC 已展开');
});
CloudXMRECAd.addAdCollapsedEventListener((adInfo) => {
    console.log('MREC 已收起');
});
CloudXMRECAd.addAdRevenuePaidListener((adInfo) => {
    console.log('MREC 收入:', adInfo.revenue);
});

CloudXMRECAd.createAd(AD_UNIT_ID, CloudXAdPosition.CENTERED);
CloudXMRECAd.showAd(AD_UNIT_ID);

CloudXMRECAd.destroyAd(AD_UNIT_ID);

CloudXMRECAdCloudXBannerAd 的 API 相同,包括位置、偏移、背景色、placement、custom data、自动刷新控制和事件监听器。

React Hook

import React, { useEffect } from 'react';
import { Text } from 'react-native';
import { useCloudXBanner, CloudXBannerAd, CloudXAdPosition } from 'cloudx-react-native';

function HomeScreen() {
    const { isLoaded, error } = useCloudXBanner('home_banner');

    useEffect(() => {
        CloudXBannerAd.createAd('home_banner', CloudXAdPosition.BOTTOM_CENTER);
        CloudXBannerAd.showAd('home_banner');
        return () => CloudXBannerAd.destroyAd('home_banner');
    }, []);

    return <Text>{isLoaded ? '横幅展示中' : error?.message ?? '加载横幅中...'}</Text>;
}

返回:{ isLoaded, error }