当前位置: 首页 > news >正文

OMSDK WebView Display 接入步骤

目录

1. 初始化 WebView

2. 检索广告响应

3. 将 OM SDK JS 库注入广告响应中

4. 创建并配置广告会话

5. 设置要跟踪的视图可见性(viewability)

5.1 设置视图

5.2 Register obstructions 添加障碍

5.3 更新视图参考

6. 开始会话

7. 发出 loaded 事件信号

8. 发出 impression 事件信号

9. 停止会话

Demo

相关推荐


1. 初始化 WebView

WebView adView;
adView = (WebView)findViewById(R.id.webviewad);
adView.getSettings().setJavaScriptEnabled(true);

2. 检索广告响应

像平常一样检索广告响应。为了便于后续步骤,广告响应应为 HTML 字符串。

//获取服务端返回的Html素材字符串
String adResponseHtmlString = "<html>...</html>";

3. 将 OM SDK JS 库注入广告响应中

获取到的 OM SDK JS

String OMID_JS_SERVICE_URL = context.getString(R.string.omid_js_service);
StringRequest stringRequest = new StringRequest(Request.Method.GET, OMID_JS_SERVICE_URL,new Response.Listener<String>() {@Overridepublic void onResponse(String response) {OMID_JS_SERVICE_CONTENT = response;}
},new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {}
});
RequestQueue queue = Volley.newRequestQueue(context);queue.add(stringRequest);

获取内容如下,可前往IAB OMSDK下载Demo,其中就有omsdk_v1.js,得到后在后面步骤拼接即可:

获取到广告响应 HTML 后,将上一步获取到的 OM SDK JS 库注入到广告响应中,并在 WebView 中加载:

try {//注入 omsdk.js,OMID_JS_SERVICE_CONTENT就是 omsdk.js 的内容,也可以让服务端注入,那么就不需要移动端操作了String htmlString =ScriptInjector.injectScriptContentIntoHtml(OMID_JS_SERVICE_CONTENT,adResponseHtml);adView.loadDataWithBaseURL("", htmlString, "text/html", "UTF-8", "");
} catch (IllegalArgumentException | IllegalStateException e){e.printStackTrace();
}

注意 ,初始化第二步提到,如果服务端已经注入了 JS 服务库,则此步骤可以不用执行。此处需要加一个判断,并且在webview调用loadDataWithBaseURL前执行。

4. 创建并配置广告会话

为了避免稍后启动会话时出现问题,您必须等到 WebView 完成加载 OM SDK JavaScript 后才能创建 AdSession

过早创建会话可能会导致无法向 WebView 内的验证脚本发送事件(例如展示)如果展示未被有效统计,可能就是这个原因导致的。

避免此问题的最简单方法是在 WebView 回调 WebViewClient.onPageFinished() 中创建 AdSession。或者,如果实现可以从 WebView 接收 HTML5 DOMContentLoaded 事件,则可以在该事件的消息处理程序中创建 AdSession

对于 WebView 展示广告,这通常是原生层。对于展示广告,mediaEventsOwner 的值应为Owner.NONE。我们将在后续步骤中介绍事件的实际发送方式:

@NonNull
public static AdSession getJsAdSession(Context context, WebView webView, String customReferenceData, CreativeType creativeType) {// 激活OMID SDK,需要在应用启动时调用一次Omid.activate(context.getApplicationContext());// 创建广告会话配置AdSessionConfiguration adSessionConfiguration =AdSessionConfiguration.createAdSessionConfiguration(creativeType,                    // 广告创意类型(如HTML_DISPLAY、VIDEO等)ImpressionType.VIEWABLE,         // 展示类型:基于可视区域触发Owner.NATIVE,                    // 媒体资源所有者:原生应用// 根据创意类型决定会话所有者// 如果是原生展示广告,则没有会话所有者;否则为原生应用(creativeType == CreativeType.NATIVE_DISPLAY) ? Owner.NONE : Owner.NATIVE,false);                          // 是否隔离模式:否// 创建合作伙伴信息,使用构建配置中的合作伙伴名称和版本号Partner partner = Partner.createPartner(BuildConfig.PARTNER_NAME, BuildConfig.VERSION_NAME);// 创建JavaScript广告会话上下文AdSessionContext adSessionContext = AdSessionContext.createJavascriptAdSessionContext(partner,          // 合作伙伴信息webView,          // 承载广告的WebView组件null,             // 内容URL(可选参数,此处为null)customReferenceData // 自定义参考数据,用于跟踪和调试);// 创建并返回广告会话实例AdSession adSession = AdSession.createAdSession(adSessionConfiguration, adSessionContext);return adSession;
}
//调用
private static final String CUSTOM_REFERENCE_DATA = "{ \"birthday\":-310957844000, \"user\":\"me\" }";
AdSession adSession = AdSessionUtil.getJsAdSession(getContext(), webView, CUSTOM_REFERENCE_DATA, CreativeType.NATIVE_DISPLAY);

5. 设置要跟踪的视图可见性(viewability)

5.1 设置视图

设置用于跟踪可见度的视图。对于 WebView 广告,此视图为 WebView 本身。对于原生广告,此视图为包含广告所有相关元素的原生视图:

try {adSession.registerAdView(adView);
} catch (IllegalArgumentException e) {e.printStackTrace();
}

5.2 Register obstructions 添加障碍

如果您认为任何原生元素(例如关闭按钮、徽标文字或其他装饰)属于广告的一部分,则应将其注册为友好遮挡,以防止其被计入广告覆盖范围。这适用于视图层次结构中的任何祖先视图或同级视图(adView 的所有子视图将自动被视为广告的一部分):

try {adSession.addFriendlyObstruction(logoView);
} catch (IllegalArgumentException e) {e.printStackTrace();
}

5.3 更新视图参考

如果视图由于全屏扩展或类似原因而随后发生变化,则应始终将 adView 引用更新为当时适当的内容:

try {adSession.registerAdView(adView);
} catch (IllegalArgumentException e) {e.printStackTrace();
}

6. 开始会话

启动会话并不会触发展示,它只是为跟踪会话做准备。在发送任何事件之前启动会话非常重要。

通常,您应该在完成上述步骤后立即开始会话:

adSession.start();

如第4步所述,这应该在 WebView 加载后发生

7. 发出 loaded 事件信号

理想情况下,这会在广告会话中创意加载时尽早发生,但也可以将其在展示之前发送

try {AdEvents adEvents = AdEvents.createAdEvents(adSession);adEvents.loaded();
} catch (IllegalArgumentException | IllegalStateException e) {e.printStackTrace();
}

8. 发出 impression 事件信号

展示的定义通常被认为是广告渲染时,因此您很可能希望在此时触发该事件。该事件应该只触发一次,尝试多次触发将导致错误。

try {adEvents.impressionOccurred();
} catch (IllegalStateException e) {e.printStackTrace();
}

9. 停止会话

展示完成后,请停止会话并销毁广告。请注意,停止会话后,尝试重新启动会话或在已完成的会话中触发展示将导致错误。

请注意 ,结束 OMID 广告会话会向集成提供的 Web 视图中运行的验证脚本发送一条消息。为了使验证脚本有足够的时间处理 sessionFinish 事件,集成必须在会话结束后至少 1.0 秒内保持对 Web 视图的强引用。

    if (adSession != null) {try {adSession.finish();} catch (Exception e) {InnerLog.e(TAG, "Error finishing adSession");} finally {adSession = null;  // 确保在异常情况下也能置空}}

Demo

    //注入并加载广告try {String htmlString =ScriptInjector.injectScriptContentIntoHtml(OmidJsLoader.getOmidJs(Context()),adResponseHtml);adView.loadDataWithBaseURL("", htmlString, "text/html", "UTF-8", "");} catch (IllegalArgumentException | IllegalStateException e){e.printStackTrace();}//在finished中创建AdSession,发出事件信号setWebViewClient(new WebViewClient() {......@Overridepublic void onPageFinished(WebView view, String url) {try{if(mWebView!=null){createAdSessionHtml();}}catch (Exception e){e.printStackTrace();}}});private boolean isCallImpressionEvent;private void createAdSessionHtml(){try {Context context = GlobalInner.getInstance().getContext();adSession = AdSessionUtil.getJsAdSession(context, mWebView, "", CreativeType.HTML_DISPLAY);adSession.registerAdView(mWebView);adSession.start();if (adEvents==null){adEvents = AdEvents.createAdEvents(adSession);adEvents.loaded();if (!isCallImpressionEvent) {isCallImpressionEvent = true;adEvents.impressionOccurred();}}} catch (Throwable t) {t.printStackTrace();}}

相关推荐

移动端实战指南:深入理解 & 接入 IAB OMSDK

OMSDK - APP 集成指南

http://www.dtcms.com/a/520272.html

相关文章:

  • 零基础新手小白快速了解掌握服务集群与自动化运维(十S四)储存服务-NFS文件储存
  • tidex-数字货币交易所
  • C#使用OpenVinoSharp+魔塔社区的读光中英文OCR ONNX模型进行文字检测(仅检测不做识别)
  • 积分商城小程序深圳seo网络优化公司
  • [Linux文件系统——Lesson17.软硬链接]
  • apr库在x86架构下交叉编译成arm64架构
  • 软件设计师-结构化分析方法-耦合
  • 响应式企业网站 下载网站制作是不是要先用ps做
  • 购买网站建设需要注意app软件开发制作公司电话
  • 【AI Agent】入门、学习、求职
  • C++中const与引用深度解析:从使用到底层原理
  • Product Hunt 每日热榜 | 2025-10-23
  • 【大话码游之 Observation 传说】上集:月光宝盒里的计数玄机
  • raid恢复之后数据库故障处理(ora-01200,ORA-26101,ORA-600)---惜分飞
  • 2025年中专机电一体化专业做什么工作?
  • JavaWeb 全栈学习路径:从工具到项目的实战蜕变指南
  • 中国工信备案查询网站做网站的软件电子
  • tailwindcss暗色主题切换
  • Classwork 5 - Check the HTML Tags
  • 15、【Ubuntu】【VSCode】VSCode 断联问题分析:UID 补充
  • 本地网站404错误德州网站怎样建设
  • 从被动防御到主动防护:雷池WAF+cpolar的安全实践
  • 网络营销咨询网站源码多平台网页制作
  • 广州在建火车站在哪里国内最好的危机公关公司
  • mysql锁整理
  • linux下java程序使用jprofiler进行压测
  • R语言随机森林分析显示R方和P值
  • 《Python爬虫 + 飞书自动化上传》全流程详细讲解
  • ELK——logstash
  • 图像进行拼接-后进行ocr检测识别