本页目录

优酷自渲染信息流接入

适用于本仓库 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>] 中文原因与处理提示。记录错误并修正布局或绑定关系,不要在拒绝后自行补跳转。

列表复用与释放

  1. 列表数据层按稳定条目持有 IFLYNativeFeedAd;Cell 负责当前 UI。
  2. willDisplay 中根据原 Ad 的 adData 渲染并 attach,正常离屏不重新请求。
  3. didEndDisplaying、prepareForReuse 或切换为普通内容时,立即对该回调 Cell 的容器调用 +[IFLYNativeFeedAd detachAdFromContainerView:]。不要按旧 indexPath 反查,也不要延迟解绑。
  4. 条目仍存在且广告有效时,回屏可继续 attach 原 Ad;视频可恢复原进度。手动暂停或停止后,需要再次 resumePlay / startPlay 才申请播放。
  5. 广告关闭、条目永久删除或页面退出时,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 表示进入点击处理,不保证取得加速度样本或跳转成功。