穿山甲(iOS)
本文档介绍 iOS 端接入穿山甲(CSJ)广告平台的对接事项:引入适配器、工程配置、平台参数与注意事项。
概述
| 项目 | 说明 |
|---|---|
| 适配器 | UjuCsjAdapter 1.0.0(platformId=1) |
| 穿山甲 SDK | Ads-CN-Beta 7.8.0.0(subspec: CSJMediation),由开发者自行引入 |
| 依赖 | UjuAdCore ~> 3.4.2 |
| 支持广告类型 | 开屏、激励视频、插屏、横幅、原生(模板渲染) |
适配器遵循穿山甲官方接入规范对接,展示、点击等监测数据由穿山甲 SDK 自动上报,无需开发者额外处理。
一、前置条件
- 已按 iOS 初始化文档 完成优聚智汇 SDK 初始化。
- 在穿山甲平台注册并创建媒体与应用,获取穿山甲 App ID 与代码位 ID。
- 在优聚智汇开发者平台「广告平台配置」中开通穿山甲,填写穿山甲 App ID;在广告位瀑布流中配置穿山甲广告源(代码位 ID)。
二、引入适配器
1. Podfile
source 'https://gitee.com/ujuad/iossdk.git'
source 'https://cdn.cocoapods.org/'
pod 'UjuAdCore', '~> 3.4.2'
pod 'UjuCsjAdapter', '1.0.0'
# 穿山甲 SDK 由开发者自行引入(版本必须与适配器要求一致)
pod 'Ads-CN-Beta', '7.8.0.0', :subspecs => ['CSJMediation']
# 引入使用到的 ADN SDK,开发者请按需引入
Ads-CN-Beta的版本必须使用适配器声明的版本(7.8.0.0),版本不一致可能出现符号缺失或统计异常。CSJAdSDK.bundle资源由该 pod 自动携带。
2. Info.plist 适配器注册
<key>uju_adapter_csj</key>
<string>UjuCsjAdapter.CsjAdapterFactory</string>SDK 初始化时自动扫描 uju_adapter_* 前缀 key 并反射注册适配器,无需调用任何额外代码。穿山甲 SDK 的初始化也由优聚智汇 SDK 在策略下发后自动完成(使用后台配置的穿山甲 App ID)。
三、工程配置(穿山甲 SDK 要求)
1. ATS 例外
部分广告素材为 HTTP,需允许任意加载:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>2. ATT 授权(iOS 14.5+)
<key>NSUserTrackingUsageDescription</key>
<string>该标识符将用于向您投放个性化广告</string>建议在初始化前调用 ATTrackingManager.requestTrackingAuthorization 请求授权;用户拒绝授权时 IDFA 清零,可能降低广告收益。
3. SKAdNetwork
在 Info.plist 的 SKAdNetworkItems 中添加穿山甲 SKAdNetwork ID:
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>238da6jt44.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>x2jnk7ly8j.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>
</array>4. Other Linker Flags
Build Settings → Other Linker Flags 添加 -ObjC。pod 'UjuCsjAdapter' 的 user_target_xcconfig 已自动配置 -force_load / SWIFT_INCLUDE_PATHS 等必要参数,无需手动处理。
四、验证
真机运行后,在控制台过滤以下日志确认链路:
| 环节 | 日志关键字 |
|---|---|
| 适配器注册 | 反射注册 UjuCsjAdapter.CsjAdapterFactory 成功(platformId=1) |
| 穿山甲初始化 | 穿山甲 SDK 初始化成功 |
| 广告加载 | CsjSplash onLoadAd / splashAdLoadSuccess |
| 竞价胜出 | 竞价胜出(ADN): platformId=1 |
| 展示 | splashAdDidShow 等展示回调 |
穿山甲平台的展示、点击报表一般在广告实际展示后几分钟内可见(偶有小时级延迟)。请注意:仅完成"加载"未调用展示的请求,平台不计展示量。
五、注意事项(对接穿山甲官方文档要点)
- rootViewController 必须有效:穿山甲所有跳转均采用 present 方式,展示广告时优聚智汇 SDK 会传入当前页面控制器,请确保从可见的 UIViewController 发起
show,且该控制器未 present 其他控制器,否则会出现presentedViewController already exists导致跳转失败。 - 广告代理不可中途更改:穿山甲开屏文档明确"不支持中途更改代理,中途更改代理会导致接收不到广告相关回调"。适配器内部在加载阶段完成 delegate 绑定,业务方无需也不应持有并修改穿山甲广告对象的代理。
- 信息流必须设置 rootViewController:模板信息流广告视图必须关联有效控制器,否则点击跳转失败、dislike 回调不进(适配器内部已处理)。
- 同一广告对象只计一次有效展示:重复展示会被穿山甲系统过滤。请勿缓存已展示的
UjuAdObject重复调用show,需要再次展示时重新load。 - 激励视频服务器回调:如需服务端奖励验证,请在穿山甲平台填写奖励回调 URL,并确认用户 ID(userId)为非空字符串。
- 横幅展示需要容器:横幅广告渲染到
show(_:container:)传入的容器视图,请确保容器已布局(非零尺寸)后再展示。
六、常见问题
Q1:初始化报错 Invalid SDK Framework(错误码 98765),提示替换 CSJAdSDK.bundle?
宿主 App 内的 CSJAdSDK.bundle 与 BUAdSDK 版本不一致或 bundle 缺失。手动集成时请确认 CSJAdSDK.bundle 已加入 Copy Bundle Resources,且与引入的 Ads-CN-Beta 版本一致;使用 CocoaPods 引入 Ads-CN-Beta 则自动匹配。
Q2:穿山甲平台没有展示、点击数据?
- 确认已完整执行 加载 → 展示 流程(仅加载不计展示);
- 确认展示回调已触发(见「四、验证」日志);
- 检查
rootViewController是否有效(点击跳转失败会导致点击数据缺失); - 平台报表存在延迟,可在几分钟至一小时后复查。
Q3:加载返回 noFill / 无填充?
穿山甲测试代码位有 QPS 与频控限制;请确认代码位状态开启、包名与穿山甲平台配置一致,并参考穿山甲错误码文档排查。
