帮助中心/文档详情/

常见问题

通用问题
为什么返回的广告中有重复广告?

同一个广告主在广告后台会使用相似的素材内容创建多个广告计划,因此平台在返回的广告中可能会有很多相似内容的广告,但是这些广告对应的广告计划ID是不相同的。

穿山甲的去重规则是什么?

1. 展示或者点击因为重复被去重:一次请求返回的广告,如果用户多次看到或者点击,有效展示和点击只记录一次,客户端展示点击会回调多次,穿山甲在服务端进行去重;

2. 超时去重:广告从下发到展示的有效时限为1小时,如果超过一个小时展示,不会被计算为一个有效展示,所以提醒开发者要注意广告的缓存时间,超过一个小时,请重新请求新的广告来展示。

如何统计有效请求次数?

Android可以通过ad.getMediaExtraInfo().get("request_id")获取request_id,iOS可以通过mediaExt对象去获取request_id。每个request_id代表客户端的一次请求。开发者每次请求1条广告的情况,可以使用request_id对展示、点击等维度数据进行去重。每次请求返回的某个广告的有效展示和点击最多一次。

穿山甲展示、点击的统计口径是什么?

穿山甲提供了展示和点击回调方法,开发者可以在穿山甲提供的方法里进行埋点统计。


* iOS:nativeAdDidBecomeVisible,nativeAdDidClick;

* Android:onAdShow,onAdClicked


穿山甲广告有效展示定义

- 开屏广告:展示高度不小于屏幕高度75%,宽为屏幕宽,展示时间超过1s会上报展示;

- 信息流广告:展示面积超过20%像素,展示时间超过1s会上报展示(图片和视频广告展示检测规则一致)

- 全屏视频&激励视频广告:视频开始播放即会上报展示(不以播放完成为标准)

- banner:展示1s即可展示上报,轮播的最小时间是2.5s,宽度不小于50px

广告填充低?

穿山甲在没有任何策略的情况下,填充都在95%以上,若持续出现填充率低于95%的情况,可以先自查广告的展示率和cpm是否过低。本地复现的情况也可以提供抓包数据,抓包地址:https://域名或者ip地址/api/ad/union/sdk/get_ads/ 提供返回的数据进行确认。

数据示例:

{

"request_id": "xxxx",

"status_code": 20001,

"reason": 112

}

开屏广告超时设置

开发者可以根据穿山甲提供的方法去设置开屏广告的超时时间,默认逻辑为x秒后客户端没有广告返回,则执行超时或者错误回调,默认超时时间:3.5s。 开发者若对整体开屏广告的请求时间有限制,且需要在代码逻辑中做强限制,则可以使用此方法。若需要在此方法外增加一层逻辑限制,则要保证自己设置的超时时间不小于提供给穿山甲设置的超时时间。

什么是服务器回调模式?

服务器回调是指在用户在看完激励视频后,穿山甲服务端会向开发者服务端发送一个验证申请,开发者服务端来判断是否给用户奖励,返回给服务器true/false。需要开发者按照文档要求去进行接口的开发验证。

SDK提供了onRewardVerify接口,boolean verify 可以获取这个判断。如不使用服务器回调模式,在视频完整播放完成 verify 默认返回true。

服务器回调模式是必须的吗?

不是必须的,服务器模式只是增加了一次第三方服务器验证判断,具体的奖励的发放是由客户端完成。在不使用服务器回调模式时,视频播放完成后rewardedVideoAdServerRewardDidSucceed接口的 verify 默认返回true。

不同的激励视频代码位服务端回调地址可以是相同的么?

可以,不同的代码位可以使用相同的接口去进行有效性验证的。

激励视频和全屏视频可以强制关闭吗?

全屏视频支持5s跳过,激励视频必须看完。具体可参看规范介绍:https://ad.oceanengine.com/union/media/doc?id=5dd0fe7d850782001208831a

激励视频暂停复播后,倒计时重新开始问题

视频会增设关键帧,复播后视频会从上一个关键帧位置开始播放。

如何确定使用的SDK版本?

1.通过SDK文档或者SDK文件夹名称确认 ;

2.安卓通过TTAdSdk.getAdManager().getSDKVersion()方法获取 ; iOS 通过 po [BUAdSDKManager SDKVersion] 方法获取

开屏广告下方可以自定义产品的logo么?

开屏广告返回的是一个view,客户端直接展示view即可。如果要缩小的开屏广告的展示区域,请求的时候宽和高填写裁剪后宽和高即可,即请求尺寸为屏幕宽*(屏幕高-logo高)

iOS常见问题
iOS为什么会出现有的广告点击后没有出现跳转的现象?

出现此现象一般是两个原因导致:

1. 注册点击的时间过晚;

2. rootvc设置错误。rootViewController是必传参数,是弹出落地页广告ViewController的。

2900及以上iOS SDK注意事项。

1. 穿山甲拆分了两个framework,「BUAdSDK.framework, BUFoundation.framework」,所以需要升级的开发者都需要加上新的framework【BUFoundation.framework】

2. 升级SDK必须同时更新framework和bundle文件

使用3400版本SDK出现接受不到回调的情况

3400以上版本SDK,任意广告类型均不支持中途更改代理,中途更改代理会导致接收不到广告相关回调,如若存在中途更改代理场景,需自行处理相关逻辑,确保广告相关回调正常执行。

模板Banner广告展示白屏

⁣为了保证模版bannar广告流畅展示,避免异常情况的发生,需要在nativeExpressBannerAdViewRenderSuccess渲染成功回调方法后再进行广告的展示。

3000 以上 iOS SDK版本注意事项:

1. 从3000版本开始,只支持x86_64, armv7, arm64,i386(3200版本开始支持)这几种架构,不再支持armv7s;

2. 为了优化zip包的下载速度,demo中只放置了Podfile而没有运行,请先cd到BUDemo文件夹下,运行pod install,成功后,即可正常运行demo;

广告点击事件与开发者自身应用点击事件冲突(广告点击事件不生效),可从以下方面进行排查:

1. 检查开发者加载广告的父视图frame、广告返回view的frame设置尺寸,确认是否出现"超"视图场景

2. 检查广告视图是否在展示界面最上层,如若不是最上层,可设置bringSubviewToFront

3. 可检查广告对象是否被提前释放,一般强引用对象即可避免

4. 可查看view图层,即相关的UIView层级树

5. 打印相关view是否有宽高为0的情况导致点击事件不执行

6. 跳转须知:广告接口中的所有rootViewController均为必传项,用来处理广告跳转。 SDK里所有的跳转均采用present的方式,请确保传入的rootViewController不能为空且没有present其他的控制器,否则会出现presentedViewController已经存在而导致present失败。rootViewController是否设置正确,否则可能导致此场景

7. 在相关界面添加UIGestureRecognizerDelegate代理,并实现-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[xxx class]]) { return YES; } return NO;}

备注:xxx为广告视图加载的父视图

iPhone刘海屏手机,视频类广告跳过按钮被状态栏遮挡?

可使用- (BOOL)prefersStatusBarHidden 隐藏状态栏来解决此问题


调用广告失败,反馈超时,“The request timed out”可从如下方面进行排查:

1. 项目中是否有设置请求超时的时间

2. 是否设置Allow Arbitrary Loads权限

3. 更换网络和设备进行验证

广告跳转是否需要添加bytedance的白名单?

SDK使用的是openurl进行的跳转不需要添加白名单,当出现canopenurl:failed for url 日志输出时,您那边如果觉得不便,可以 [BUAdSDKManager setLoglevel:BUAdSDKLogLevelNone];禁用掉日志的输出。

信息流广告 右上角的关闭按钮可以隐藏么?点击关闭按钮没反应

1. 目前Dislike按钮无法隐藏,也不建议隐藏 Dislike按钮可以更好的匹配广告,提高收益。

2. 点击没有弹出选择界面,请检查是否设置了Dislike回调方法,并在此回调方法中做了相关的逻辑处理

3. 检查是否正确设置了rootViewController

广告关闭按钮为灰色不显示“X”

bundle文件不匹配导致,bundle文件需要在Copy Bundle resources 里添加,并且放到根目录下。

cocospods配置时,进行pod install操作,终端报错,拉取不到SDK

可尝试切换网络或链接vpn进行拉取即可解决问题。

手动集成SDK运行崩溃,报错: -[__NSCFString bu_MD5HashString]: unrecognized selector sent to instance 0x281bcf900

请检查是否配置了 -Objc 和 all_load

Android常见问题
穿山甲SDK如何自定义上传oaid

在穿山甲3000以上版本,开发者通过设置TTCustomController的getDevOaid()方法,自定义oaid。规避在穿山甲统计不到oaid的设备上变现效率变差。开发者自定义上传,提高变现效率。

点击广告下载app后,吊起安装时系统弹出open fail提示怎么处理?

这个问题是因为Android 7.0、8.0 系统版本的手机上没有正常吊起安装,解决方案是:

1. 需要检查app 中的fileprovider配置是否与对接文档中配置一致,具体方式请看对接文档“适配Anroid7.0”这部分。

2. 检查是否和别的SDK冲突

3. 检查file_path配置是否正确,请参考对应版本的SDK文档进行设置。

4. Support v4版本在24.2.0以上

Android端下载apk提示“下载失败”

当targetSdkVersion=29时,谷歌临时允许使用老版本的权限来解决储存分区问题。需要在application子节中添加android:requestLegacyExternalStorage ="true" 。如非必要,建议开发者targetSdkVersion<29 。

穿山甲 3400版本sdk已支持targetSdkVersion>=29

Android升级3400及以上版本build编译过程找不到queries元素如何处理?

错误:AndroidManifest.xml: error: unexpected element <queries> found in <manifest>

解决方案:如果您使用的是Android Studio 4.1(当前为Beta)或更高版本,并且具有匹配的Android Gradle插件(例如,该4.1.*系列中的产品),则无需做任何更改即可。反之升级Gradle插件升级即可。

Android端4G网络下视频无法播放​问题

当targetSdkVersion=30时,WiFi下正常播放网络状态变动导致视频4G下无法播放显示静态界面

如非必要,建议开发者targetSdkVersion<29 。

没有展示数据的原因?或者平台上的展示数据为0?

1.请注意测试状态是不统计数据的,必须转为正式状态才有数据显示。

2.未能正确注册展示回调setAdInteractionListener。

3.如果开发者使用了windowmanager,其中FLAG_NOT_FOCUSABLE影响到SDK检测上报show的机制,导致无展示上报,所以需要去掉FLAG_NOT_FOCUSABLE这个属性。

4. 可能是在广告展示后才为广告注册的监听事件,必须在广告展示前注册监听事件。


5. 开发者的应用设置里勾选了调试SHA1值,且调试SHA1值和上面填的正式SHA1一致,导致广告是按照调试SHA1来做处理,最终会被过滤掉,所以如果调试SHA1值和正式SHA1值一致的话就不要勾选这个选项了。


6. 如果开发者应用本身不是多进程,或者没有在多进程场景下使用广告,那么一定不要打开多进程开关,否则可能导致没有展示回调的问题。


7. 排查以上问题没有结论可以根据穿山甲的demo来比对下,检测能否正常查看到展示回调。


广告展示点击正常,但是收不到回调是为什么?

可能是在广告展示后才为广告注册的监听事件,必须在广告展示前注册监听事件

广告请求出现40009

排查方向:

1.检查Provider配置。 Provider是穿山甲必配置的内容,不配置可能会apk影响下载,广告请求。

2.检查代码位ID设置。

3.代码位ID或者应用不是运行状态。

多进程涉及WebView使用,如何设置才可以使用开发者自己的数据路径?

多进程涉及WebView的使用,如果开发者想要使用自己的数据路径,可以在SDK初始化之前调用WebView.setDataDirectorySuffix()

资源文件找不到,出现崩溃,是什么原因?

混淆资源的白名单放在平台中的SDK包里,名字是whiteList.txt,如果您的应用对资源也进行混淆(如andResGuard),请不要混淆穿山甲的任何资源。

为何在应用开启时还需要申请权限TTAdManager.requestPermissionIfNecessary(this)?

部分操作需要用户授予相应的权限;为了确保获得相应权限,SDK会在初始化或者开发者调用获取权限方法时,去获取权限状态。

TTDelegateActivity导致了状态栏页面闪烁?

调用了requestPermissionIfNecessary方法导致,此方法会影响开发者activity的生命周期。在保证声明的权限用户都给了的前提下可以不调用或者降低调用频次。

android.permission.GET_TASKS 在Android5.0及以后版本android studio提示过期怎么办?

Android 5.0及以后版本可以不申请该权限,此权限仅针对Android 5.0以下版本。

集成了穿山甲的SDK之后发现请求广告,Activity会多调一次onPause()和onResume()方法。

造成此现象的原因是在请求广告之前申请权限导致( TTAdManagerHolder.get().requestPermissionIfNecessary(this); ),开发者可以自行调整权限申请时机以避免此问题,可以统一在应用首次启动时申请所有权限。

Android9.0设备上视频加载成功,但播放时黑屏或者加载图片白屏,之后跳转endcard是什么原因引起的?

Android 9默认只支持https,需要在androidmanifest里面添加android:usesCleartextTraffic="true" 来支持http。开发者需要如下配置

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    <domain-config>
        <domain includeSubdomains="true">i.snssdk.com</domain>
        <domain includeSubdomains="true">is.snssdk.com</domain>
        <domain includeSubdomains="true">pangolin.snssdk.com</domain>
        <domain includeSubdomains="true">extlog.snssdk.com</domain>
        <domain includeSubdomains="true">sf3-ttcdn-tos.pstatp.com</domain>
        <domain includeSubdomains="true">bds.snssdk.com</domain>
        <domain includeSubdomains="true">dig.bdurl.net</domain>
    </domain-config>
</network-security-config>
切换主题复制
激励/全屏视频播放广告前出现短暂黑屏

1.在onFullScreenVideoCached/onRewardVideoCached缓存成功后再展示 这样会保证展示流畅 用户观看广告的体验更好 从而减少视频观看异常的情况

2.该activity尝试开启硬件加速android:hardwareAccelerated="true" 网络情况也可能影响到广告的渲染 在保证网络文档的情况下多设备尝试

3.也可在激励视频页面要展示之前 提前请求广告 做广告的预加载 展示的时候直接调用show方法即可

4.排查以上原因扔没有改善的前提下,建议升级到SDK最近版本查看此场景是否得到改善

如何配置下载类广告在点击后二次弹窗确认?

开发者可以在初始化的时候调用directDownloadNetworkType方法,不传递任何参数即可在所有网络下均有下载的二次弹窗。此方法中传递参数即代表可以在某网络情况下点击直接下载,不用经过二次确认。

激励视频必现弹不出视频播放框?

1.首先排查是否开启多进程开关,如果开启,请检查是否每个进程都有初始化

2.如果多进程没问题,可以收集日志具体排查或者开发者提供可复现的demo 进行排查

3.是否在非主线程中调用了展示


下载广告apk后,不能弹出自动安装?

SDK2.4.1.2 版本之后,需要在代码里打开通知栏才会自动安装 .allowShowNotify(true) //是否允许SDK展示通知栏提示

安卓初始化的时候supportMultiProcess()的作用是什么?要怎样设置?

supportMultiProcess为多进程开关,开发者根据自身广告使用情况去进行设置。要求:

1.若应用为单进程应用,那么supportMultiProcess()方法设置为false;

2.若应用为多进程,但是仅在同一个进程中请求、展示广告,那么supportMultiProcess()方法设置为false。若存在跨进程使用,则需要在所有进程中都初始化穿山甲SDK,且supportMultiProcess()设置为true;

点击开屏素材再返回时,无法关闭splash页面,要如何处理?

需要开发者在Activity中onStop方法中做一个标记 在onResume方法中做跳转逻辑处理

@Override
protected void onResume() {
    //判断是否该跳转到主页面
    if (mForceGoMain) {
        goToMainActivity();
    }
    super.onResume();
}

@Override
protected void onStop() {
    super.onStop();
    mForceGoMain = true;
}
切换主题复制
点击广告进入落地页,顶部导航栏背景透明,可以看到app本身的内容,要如何处理?

默认使用主题的是TITLE_BAR_THEME_DARK,该主题是默认透明。可以调整成TITLE_BAR_THEME_LIGHT避免透明的问题。

安卓端拼接了视频的落地页,视频下方导航栏透明要怎么处理?

出现此问题为受到开发者应用主题设置的影响,需要开发者复写穿山甲的activity来规避。复写后设置主题

<style name="Theme.Light.NoActionBar" parent="Theme.AppCompat.Light">
        <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowNoTitle">true</item>
    </style>
切换主题复制

配置后若落地页出现了标题栏,则增加以下配置进行隐藏:

<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
切换主题复制
初始化报java.lang.ClassNotFoundException: com.android.id.impl.IdProviderImpl

此为正常日志输出,不会引起崩溃或其他问题,会在后续版本中进行优化。

出现java.lang.VerifyError: Verifier rejected class com.androidquery.callback.DrawableAjaxCallback 这个报错,怎么处理?

检查代码里是否导入了compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.6',或者把android-gif-drawable-1.2.6.aar导入到本地再compile,27xx之后版本的SDK,去掉了对gif库依赖,开发者可不必添加gif库的依赖

接入SDK后log信息报错No implementation found for java.lang.String com.ss.sys.ces.a.h() (tried Java_com_ss_sys_ces_a_h and Java_com_ss_sys_ces_a_h__)是什么原因引起的?

28xx以前,SDK中使用的so文件支持四种架构:x86,x86_64,armeabi-v7a,arm64-v8a;28xx开始,已支持五种架构:x86, x86_64, armeabi, armeabi-v7a, arm64-v8a

如果您应用中支持的架构超出这四种,请在build.gradle中使用abiFilters选择支持的架构。

如下所示:

ndk {
            // 设置支持的 SO 库构架,注意这里要根据你的实际情况来设置
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'armeabi'
    }
切换主题复制

若您的项目仅支持仅支持armeabi,可以把穿山甲SDK中的armeabi-v7a下的libnms.so库解压出来,直接放到配置中。armeabi-v7a兼容armeabi。

AndroidSDK存在SSL问题 导致PlayStore被下架警告,要如何处理?

具体可以参看文档 https://support.google.com/faqs/answer/7071387

1.SDK目前的线上的版本是不支持海外流量 如果您那边存在海外流量需要进行申请 提供其他版本的SDK对接Google商店

2.目前您的账号属于中国内地 穿山甲账号是区分国内外 如果您那边有海外地区流量吗?如果是的话,之后联系的邮件是pangle_support@bytedance.com, 请发送相关邮件到该邮箱,我们海外的同学会帮助处理相关问题

模板广告常见问题
关于模版广告的title字体的大小、样式等支持修改吗?

可以登陆到穿山甲后台,找到要修改的代码位,点击“编辑”,找到字体进行修改

模板Banner、插屏、信息流广告展示不全是什么问题导致的?

出现此情况一般是请求的尺寸过大或者与平台中勾选比例不一致导致或请求尺寸过大。若请求过大,穿山甲默认取屏幕最大的宽度作为模板的宽度进行返回,因此会出现展示不全的情况。

安卓模板开屏广告请求出现40029问题

开屏广告分为模板和非模板两种且安卓端请求开屏广告使用的是相同的方法,若开发者请求的是非模板渲染类型的开屏广告,那么切记不可设置setExpressViewAcceptedSize(),若设置此方法客户端则会默认为模板渲染类型开屏,此情况会出现40029的情况。模板渲染激励视频同理

模板广告和非模板广告请求上的差异是什么?如何分辨代码位是模板渲染类型还是非模板渲染类型?

1.iOS端模板和非模板广告的所有请求方法均有差异,在请求广告的时候需要严格区分,若使用错误会报40029的错误,模版类广告都带有express字段。安卓端除开屏、全屏视频、激励视频广告外其他所有广告类型的请求方法也严格区分,且模版开屏、模版全屏视频、模版激励视频需要再请求方法中增加单独的请求参数setExpressViewAcceptedSize高度不为0即可。建议参考线上文档进行开发。参考文档:https://www.pangle.cn/help/doc/5dd0fe716b181e00112e3eb8

2.分辨代码位是模板还是非模板只能通过穿山甲平台的代码位管理去进行确认,模板广告会有标识。

模板广告的关闭按钮是否可以隐藏?

模板广告中的关闭按钮是不可以隐藏的,此按钮用来给用户提供关闭广告的权利。开发者需要在Dislike的选择回调中去进行广告的重新请求或者移除广告的操作即可。

模板Banner、模板信息流要怎样预缓存?

开发者在加载到广告后,调用render方法,在渲染成功后把这条广告缓存起来。使用广告的时候,直接调用这个广告的getExpressAdView获取视图去进行展示。

安卓模板激励视频代码位id和SDK版本使用均没有错误的情况下返回40029

从2900开始,Android请求模板激励视频和模板全屏视频广告,必须设置setExpressViewAcceptedSize方法,宽高参数不为0即可,否则会返回40029错误码。

模板广告内容显示不全

开发者检查模板广告setExpressViewAcceptedSize方法设置的宽高,单位dp。如果宽高设置超过请求设备的最大宽高,那么可能会出现展示不全的情况。

Unity常见问题
请问Unity插件都支持那些版本?

Unity插件支持2018及以上版本,如果开发者Unity版本低于2018,那需要自行适配Unity版SDK或者选择其他版本SDK接入。

使用Unity2019.3之后的版本打包报错

更改XCodePostProcess文件中,将var targetGUID = proj.TargetGuidByName("Unity-iPhone"); 替换为: #if UNITY_2019_3_OR_NEWER var targetGUID = proj.GetUnityFrameworkTargetGuid(); #else var targetGUID = proj.TargetGuidByName("Unity-iPhone"); #endif

为什么Unity中RewardAdInteractionListener里实现的回调接口只有OnAdShow被调用

在调用ShowRewardAd以后又调用了RewardVideoAd的Dispose接口导致的,现需推迟了Dispose的调用时机为收到OnAdClose回调后

Unity插件化调用iOS原生端方法无法正常显示广告

1、信息流广告需注意是否进行了addView操作

2、模版激励视频/模版插屏进行广告展示时需确保展示的控制器为当前手机显示的控制器vc,且vc不为nil

Unity 安卓播放激励视频广告时按home键切到手机主界面,再进应用时没有继续播放广告,广告直接消失,要如何处理

1.isTaskRoot()方法是用来判断当前Activity是否是第一个activity,当我们遇到上面的问题时,使用以下方法就可解决:

if (!isTaskRoot()) {
    Intent intent = getIntent();
    String action = intent.getAction();
    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && action != null && action.equals(Intent.ACTION_MAIN)) {
        finish();
        return;
    }
}
切换主题复制

2.将返回的Activity的状态修改成android:launchMode="singleTop"

Unity升级因Bundle文件找不到导致的崩溃,要如何处理?

1.若SDK和bundle文件是先置于Unity工程(如本Demo)并无配置错误,然后导出的Xcode工程。此时,bundle文件会自动导入到Build Phases-Copy Bundle Resources。

2.当unity版本大于2019.3时,需要确定的是bundle文件添加到了Xcode工程的主target,而不是UnityFramework,并在添加时选择Copy if needed。

3.为确保bundle文件的正常,请在导出后务必检查bundle文件已经配置到Build Phases-Copy Bundle Resources。

4.如果是导出工程后,Pod引入SDK。确保主Target-Copy Pods Resources下有Pod目录下Bundle文件的copy脚本(一般会自动添加)正常,该配置与3不可共存。如果选择3需要将Bundle拷贝到主Target工程目录下(Copy if needed)。

Unity 模板激励视频OnAdShow回调不及时

为保证回调正常接收,可参看截图在IRewardAdInteractionListener里做如下调整

Unity 模板激励视频OnAdShow回调不及时
Unity销毁模板banner对象后,banner还是会出现轮播现象

1、保证ExpressAdDislikeCallback在show的时候正常绑定

2、找NativeAdManager.java对应位置调用removeExpressBannerView(); 方法如下:

找NativeAdManager.java对应位置调用removeExpressBannerView()
文档内容是否对您有帮助?
联系我们