为什么返回的广告中有重复广告?
同一个广告主在广告后台会使用相似的素材内容创建多个广告计划,因此平台在返回的广告中可能会有很多相似内容的广告,但是这些广告对应的广告计划ID是不相同的。
穿山甲的去重规则是什么?
展示或者点击因为重复被去重:一次请求返回的广告,如果用户多次看到或者点击,有效展示和点击只记录一次,客户端展示点击会回调多次,穿山甲在服务端进行去重;
超时去重:广告从下发到展示的有效时限为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。
不同的激励视频代码位服务端回调地址可以是相同的么?
可以,不同的代码位可以使用相同的接口去进行有效性验证的。
如何确定使用的SDK版本?
1.通过SDK文档或者SDK文件夹名称确认 ;
2.安卓通过TTAdSdk.getAdManager().getSDKVersion()方法获取 ; iOS 通过 po [BUAdSDKManager SDKVersion] 方法获取
开屏广告下方可以自定义产品的logo么?
开屏广告返回的是一个view,客户端直接展示view即可。如果要缩小的开屏广告的展示区域,请求的时候宽和高填写裁剪后宽和高即可,即请求尺寸为屏幕宽*(屏幕高-logo高)
iOS常见问题
iOS为什么会出现有的广告点击后没有出现跳转的现象?
出现此现象一般是两个原因导致:
注册点击的时间过晚;
rootvc设置错误。rootViewController是必传参数,是弹出落地页广告ViewController的。
模板Banner广告展示白屏
为了保证模版bannar广告流畅展示,避免异常情况的发生,需要在nativeExpressBannerAdViewRenderSuccess渲染成功回调方法后再进行广告的展示。
3000 以上 iOS SDK版本注意事项:
从3000版本开始,只支持x86_64, armv7, arm64,i386(3200版本开始支持)这几种架构,不再支持armv7s;
为了优化zip包的下载速度,demo中只放置了Podfile而没有运行,请先cd到BUDemo文件夹下,运行pod install,成功后,即可正常运行demo;
广告点击事件与开发者自身应用点击事件冲突(广告点击事件不生效),可从以下方面进行排查:
检查开发者加载广告的父视图frame、广告返回view的frame设置尺寸,确认是否出现"超"视图场景
检查广告视图是否在展示界面最上层,如若不是最上层,可设置bringSubviewToFront
可检查广告对象是否被提前释放,一般强引用对象即可避免
可查看view图层,即相关的UIView层级树
打印相关view是否有宽高为0的情况导致点击事件不执行
跳转须知:广告接口中的所有rootViewController均为必传项,用来处理广告跳转。 SDK里所有的跳转均采用present的方式,请确保传入的rootViewController不能为空且没有present其他的控制器,否则会出现presentedViewController已经存在而导致present失败。rootViewController是否设置正确,否则可能导致此场景
在相关界面添加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”可从如下方面进行排查:
项目中是否有设置请求超时的时间
是否设置Allow Arbitrary Loads权限
更换网络和设备进行验证
广告跳转是否需要添加bytedance的白名单?
SDK使用的是openurl进行的跳转不需要添加白名单,当出现canopenurl:failed for url 日志输出时,您那边如果觉得不便,可以 [BUAdSDKManager setLoglevel:BUAdSDKLogLevelNone];禁用掉日志的输出。
信息流广告 右上角的关闭按钮可以隐藏么?点击关闭按钮没反应
目前Dislike按钮无法隐藏,也不建议隐藏 Dislike按钮可以更好的匹配广告,提高收益。
点击没有弹出选择界面,请检查是否设置了Dislike回调方法,并在此回调方法中做了相关的逻辑处理
检查是否正确设置了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 系统版本的手机上没有正常吊起安装,解决方案是:
需要检查app 中的fileprovider配置是否与对接文档中配置一致,具体方式请看对接文档“适配Anroid7.0”这部分。
检查是否和别的SDK冲突
检查file_path配置是否正确,请参考对应版本的SDK文档进行设置。
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这个属性。
可能是在广告展示后才为广告注册的监听事件,必须在广告展示前注册监听事件。
开发者的应用设置里勾选了调试SHA1值,且调试SHA1值和上面填的正式SHA1一致,导致广告是按照调试SHA1来做处理,最终会被过滤掉,所以如果调试SHA1值和正式SHA1值一致的话就不要勾选这个选项了。
如果开发者应用本身不是多进程,或者没有在多进程场景下使用广告,那么一定不要打开多进程开关,否则可能导致没有展示回调的问题。
按照官方文档在清单文件中配置xxx.TTMultiProvider,其中android:authorities="${applicationId}.TTFileProvider"不可更改
排查以上问题没有结论可以根据穿山甲的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); ),开发者可以自行调整权限申请时机以避免此问题,可以统一在应用首次启动时申请所有权限。