@onemore/sdk 接入方1.6.1onemore 能力前,需要先检查并声明所需权限。onemore 当前依赖以下权限:ohos.permission.INTERNETohos.permission.APP_TRACKING_CONSENTohos.permission.GET_NETWORK_INFOpayload.connectionType、device.netType、device.connection_type 从默认回退值提升为真实网络值ohos.permission.ACCELEROMETERohos.permission.GYROSCOPEohos.permission.APP_TRACKING_CONSENT 属于 user_grant 权限,reason 和 abilities 为必填项,配置方式可参考 requestPermissions 规范。module.json5 示例:{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.APP_TRACKING_CONSENT",
"reason": "$string:reason",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
},
{
"name": "ohos.permission.ACCELEROMETER",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
},
{
"name": "ohos.permission.GYROSCOPE",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
},
{
"name": "ohos.permission.GET_NETWORK_INFO"
},
{
"name": "ohos.permission.INTERNET"
}
]
}
}ohos.permission.GET_NETWORK_INFO,SDK 仍可正常请求与展示广告,但网络类型相关字段会回退为 unknown / 0。queryScheme 的可打开状态查询,还需要在应用 module.json5 里声明对应的 querySchemes,例如:{
"module": {
"querySchemes": [
"weixin",
"alipay",
"store"
]
}
}{
"dependencies": {
"@onemore/sdk": "file:../onemore.har"
}
}@onemore/sdk 已包含默认广告源承接所需能力。业务侧通常只需要引入 @onemore/sdk,不需要再额外引入各广告源 SDK。import { ONEMORE_VERSION } from '@onemore/sdk'
console.info('onemore version=', ONEMORE_VERSION)EntryAbility.onWindowStageCreate(...) 中先调用 bootstrap(...):import { OnemoreSdk, type OnemoreConfig } from '@onemore/sdk'
const onemoreConfig: OnemoreConfig = {
appId: '<your-onemore-app-id>',
appKey: '<your-onemore-app-key>',
oaid: '<optional-oaid>',
platformOptions: {
ads_kit: {
adOptions: {
tagForUnderAgeOfPromise: -1
}
}
}
}
OnemoreSdk.bootstrap(this.context, {
windowStage,
config: onemoreConfig
})
OnemoreSdk.setDebug(true)bootstrap(...) 内部已完成配置写入、运行时装配和默认广告源能力注册bootstrap(...) 完成同步运行时装配后,继续调用 init(...) 拉取 聚合配置await OnemoreSdk.init(onemoreConfig)bootstrap(...) 运行时装配后,使用同一份 OnemoreConfig 调用 await OnemoreSdk.init(onemoreConfig)。等待初始化成功后,再调用 OnemoreSdk.load(...) 请求广告。await OnemoreSdk.setUserId('<your-user-id>')OnemoreConfig.extendInfo 仍可作为 SDK 级默认扩展参数使用OnemoreSdk.load({ extendInfo }) 里单独传入,便于按请求透传和联调验证orientation 指定素材方向:import { OnemoreAdType, OnemoreOrientation, OnemoreSdk } from '@onemore/sdk'
const ad = await OnemoreSdk.load({
slotId: 'your_onemore_slot_id',
adType: OnemoreAdType.SPLASH,
orientation: OnemoreOrientation.AUTO
})OnemoreOrientation.AUTO:默认行为,每次加载时按设备当前方向自动解析OnemoreOrientation.PORTRAIT:固定按竖屏方向请求OnemoreOrientation.LANDSCAPE:固定按横屏方向请求width / height 时会自动使用当前屏幕 尺寸。Banner、信息流和原生广告建议传入实际容器宽高。自渲染广告会随容器尺寸重新布局;第三方模板广告若平台不支持展示中旋转,需要在方向改变后销毁旧广告并重新加载。import { OnemoreAdType, OnemoreSdk, OnemoreSplashView } from '@onemore/sdk'
const ad = await OnemoreSdk.load({
slotId: '<your-onemore-slot-id>',
adType: OnemoreAdType.SPLASH,
extendInfo: {
scene: 'launch',
traceId: '<trace-id>'
}
})
// 在页面中挂载开屏 View,由 View 承接真实展示、点击、关闭等展示态回调
OnemoreSplashView(ad)import {
OnemoreAdType,
OnemoreInterstitialView,
OnemoreLoadedAd,
OnemoreSdk,
OnemoreShowListener
} from '@onemore/sdk'
let loadedAd: OnemoreLoadedAd | undefined
let showOverlay = false
// aboutToAppear 中先调用一次
OnemoreSdk.setUiContext(this.getUIContext())
loadedAd = await OnemoreSdk.load({
slotId: '<your-onemore-slot-id>',
adType: OnemoreAdType.INTERSTITIAL,
extendInfo: {
scene: 'interstitial',
traceId: '<trace-id>'
}
})
const networkName = OnemoreSdk.getAdNetworkName(loadedAd.adId)
const shouldMountOverlay = networkName === 'yimeng' || networkName === 'ads_kit'
if (shouldMountOverlay) {
showOverlay = true
// build() 里:
// if (showOverlay && loadedAd) {
// OnemoreInterstitialView(
// loadedAd,
// () => {},
// () => {},
// () => { showOverlay = false }
// )
// }
}
const showListener: OnemoreShowListener = {
onShow: () => {},
onClick: () => {},
onClose: () => { showOverlay = false },
onFail: () => { showOverlay = false }
}
await OnemoreSdk.show(loadedAd, undefined, showListener)show 的页面在 aboutToAppear 都必须调一次 OnemoreSdk.setUiContext(this.getUIContext()),便于 SDK 内部按需读取yimeng 组件类广告的 onShow 当前采用统一可视展示口径:组件可见区域达到 50% 且连续停留 1 秒 后才会触发;若页面存在自定义弹层/蒙层,建议业务侧额外结合自身遮挡状态一起判断yimeng / ads_kit 插屏 / 激励:必须先挂 View、再调 OnemoreSdk.show(ad)taku 插屏 / 激励:平台 SDK 自带全屏弹窗,OnemoreSdk.show(ad) 之后画面已经出现,业务侧不要再挂 OnemoreInterstitialView / OnemoreRewardViewOnemoreSdk.getAdNetworkName(ad.adId)onShow / onClick / onClose 回调告诉业务侧关闭信号,业务侧需在 onClose 与 listener onFail 里把页面 @State showOverlay = falseOnemoreSdk.show(ad);连续点击会被 SDK 直接拦截并返回 duplicate_showOnemoreInterstitialView / OnemoreRewardView 若遇到当前版本未支持的 ADN,会输出日志并触发 onClose,不会停在“暂不支持”的占位页import { OnemoreAdType, OnemoreSdk, OnemoreBannerView } from '@onemore/sdk'
const ad = await OnemoreSdk.load({
slotId: '<your-onemore-slot-id>',
adType: OnemoreAdType.BANNER,
width: 360,
height: 57
})
await OnemoreSdk.show(ad)
// 在页面内业务自行决定 banner 的挂载位置
OnemoreBannerView(ad, onShow, onClick, onClose)OnemoreSdk.show(ad) 触发上报,再挂 OnemoreBannerView(ad, ...) 承接画面OnemoreBannerView(ad, ...) 承接的是 yimeng 广告时,onShow 会在组件可见区域达到 50% 且连续停留 1 秒 后触发OnemoreBannerView(ad, ...) 所在组件离树、页面返回或宿主主动移除 Banner 时,SDK 会自动执行 OnemoreSdk.destroy(ad) 释放“展示中”状态;如需再次展示,请重新 loadOnemoreBannerView(ad, ...) 暂不接入自动挂载(与插屏 / 激励不同),保留对外暴露