优酷自渲染信息流接入
适用于本仓库 SDK 6.5.1。API 以所安装版本的 framework 公开头为准。
NativeFeed 由宿主根据 ad.adData 渲染标题、图片、广告标识、CTA 和关闭按钮。SDK 负责绑定后的曝光、点击、跳转及视频播放。它没有 didReady 回调,也不会替宿主下载并显示图片。
接入步骤:创建并持有 Ad → loadAdWithRequestConfig: → 收到 nativeFeedAdDidLoad: → 准备视图和图片 → 在主线程调用 attachWithViewBinder:error:。可直接参考 列表示例 和视觉示例。
下面的绑定方法适用于已完成布局的单个广告卡片;传入的图片/视频承载视图、CTA 和关闭按钮须先加入 container,宿主持有这些视图:
#import <IFLYADLib/IFLYADLib.h>
- (BOOL)attachAd:(IFLYNativeFeedAd *)ad
container:(UIView *)container
mediaView:(UIView *)mediaView
ctaView:(UIView *)ctaView
closeView:(UIView *)closeView {
IFLYNativeFeedAdData *data = ad.adData;
if (!data.isMaterialComplete) return NO;
BOOL clickable = data.interactionType == IFLYNativeFeedAdInteractionTypeRedirect
|| data.interactionType == IFLYNativeFeedAdInteractionTypeDownload;
IFLYNativeFeedAdViewBinder *binder = [[IFLYNativeFeedAdViewBinder alloc] init];
binder.containerView = container;
binder.renderViews = @[mediaView, ctaView, closeView];
binder.clickViews = clickable ? @[mediaView, ctaView] : @[];
binder.closeView = closeView;
binder.videoView = data.materialType == IFLYNativeFeedAdMaterialTypeVideo
? mediaView : nil;
IFLYAdError *error = nil;
BOOL attached = [ad attachWithViewBinder:binder error:&error];
if (!attached) {
NSLog(@"NativeFeed attach failed: %d %@", error.errorCode, error.errorDescription);
} else if (ad.hasVideoTemplate) {
[ad startPlay];
}
return attached;
}创建时设置 delegate、currentViewController 和所需的 muteOnStart,并像开屏、插屏示例一样强引用广告对象。以上方法的视图参数均须非空;视频的 mediaView 使用普通 UIView,不要创建自己的 AVPlayer。startPlay 提出播放请求,实际起播仍须满足已绑定、已曝光等条件。可以通过 pausePlay、resumePlay、stopPlay 控制播放,通过对应回调更新封面与按钮。
素材、曝光与点击
| 接入内容 | 使用规则 |
|---|---|
| 单图 / 多图 | 按 materialType 和 imageURLs 渲染;图片由宿主下载,并处理失败和 Cell 复用时的旧图片回调 |
| 视频 | 使用 videoView 承载 SDK 播放,videoCoverURL 是可选封面;缺少封面不等于视频不可用 |
| 文案 | 读取 title、desc、content、ctaText、brand、appName,允许非必填文案为空 |
| 广告标识 | 宿主展示清晰的广告标识,可使用 adSourceMark、adSourceIconURL |
| 点击 | Redirect / Download 注册实际 CTA;Exposure / Unknown 显式传空 clickViews,不应自行兜底成可跳转 |
| 关闭 | 将关闭按钮传给 closeView,避免关闭操作被当成广告点击;收到关闭回调后移除该条目 |
| 曝光 | 前台活跃、未锁屏且容器至少 2/3 可见并连续保持 500ms 后触发;绑定成功不等于曝光 |
可左右滚动查看完整表格
自然曝光前滚出再回来需要重新累计连续可见时间;同一广告已经曝光后,正常离屏再回屏不重复曝光。曝光回调表示 SDK 已执行对应处理,不应视为服务端统计入库凭证。
点击、DeepLink 和落地页由 SDK 处理。宿主不要依据 targetURL、deeplinkURL 等字段另行打开页面或补报点击。是否跳转成功以 nativeFeedAd:didJumpWithSuccess: 为准;不存在 nativeFeedAdDidJump: 回调。
容器外 CTA
默认 clickViews 应位于广告容器内。确有布局需要时,设置 binder.allowsExternalClickViews = YES。外部 CTA 可以在绑定后再挂载、布局,但点击时必须与广告位于同一 window/scene,自身可见、可交互、具有有效尺寸,广告容器在前台至少 2/3 可见。不要传 UIWindow、控制器页面根视图或把无关页面区域注册成广告热区;同一个外部 CTA 不应同时交给多个广告。
renderViews、closeView、videoView 仍须属于广告容器。更换点击视图或改变其容器内外关系时,先 detach,再重新 attach。普通子视图的点击可由注册的父级 CTA 处理;带有宿主按钮事件或自有手势的子视图优先执行宿主交互。显式注册为 CTA 的按钮本身由 SDK 处理,关闭按钮及子视图与广告点击分离。
绑定阶段失败由 attachWithViewBinder:error: 返回 NO 并回调 didFailToRenderWithError:;已绑定后的点击被拒绝,由 nativeFeedAd:didRejectClickWithError: 返回 71503。错误描述格式为 [71503/<point>] 中文原因与处理提示。记录错误并修正布局或绑定关系,不要在拒绝后自行补跳转。
列表复用与释放
- 列表数据层按稳定条目持有
IFLYNativeFeedAd;Cell 负责当前 UI。 willDisplay中根据原 Ad 的adData渲染并 attach,正常离屏不重新请求。didEndDisplaying、prepareForReuse或切换为普通内容时,立即对该回调 Cell 的容器调用+[IFLYNativeFeedAd detachAdFromContainerView:]。不要按旧indexPath反查,也不要延迟解绑。- 条目仍存在且广告有效时,回屏可继续 attach 原 Ad;视频可恢复原进度。手动暂停或停止后,需要再次
resumePlay/startPlay才申请播放。 - 广告关闭、条目永久删除或页面退出时,detach 已知容器、置空 delegate 和
currentViewController,释放最后一个 Ad 强引用。需要立即终止但仍保留对象引用时才主动调用destroy。
detachFromCurrentContainer 仅用于固定、非复用且不会迁移的单容器。已过期广告不能迁移或重新挂载,收到过期错误后创建新 Ad。完整列表实现见 Simple。
优酷媒体摇一摇
优酷版额外提供媒体侧摇一摇上报接口。它只上报媒体已经识别到的摇一摇事件,不会替代普通点击:
IFLYAdError *error = nil;
BOOL accepted = [ad reportMediaShakeTriggeredWithError:&error];
if (!accepted) {
NSLog(@"Shake report failed: %d %@", error.errorCode, error.errorDescription);
}只能在主线程、广告已自然曝光且当前活动挂载有效可见时调用,不以服务端 interact、interactionType、素材类型或跳转目标为准入条件。媒体调用是该模式的摇一摇点击触发源;同一已加载广告最多接受一次,离屏再回屏不会重置;普通点击已进入点击链路后不能再次上报。返回 YES 表示进入点击处理,不保证取得加速度样本或跳转成功。