CINXE.COM
Google Ads Developer Blog: mobile_ads_sdk
<!DOCTYPE html> <html class='v2 list-page' dir='ltr' itemscope='' itemtype='http://schema.org/Blog' lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/3566091532-css_bundle_v2.css' rel='stylesheet' type='text/css'/> <title> Google Ads Developer Blog: mobile_ads_sdk </title> <meta content='width=device-width, height=device-height, minimum-scale=1.0, initial-scale=1.0, user-scalable=0' name='viewport'/> <meta content='IE=Edge' http-equiv='X-UA-Compatible'/> <meta content='Google Ads Developer Blog' property='og:title'/> <meta content='en_US' property='og:locale'/> <meta content='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' property='og:url'/> <meta content='Google Ads Developer Blog' property='og:site_name'/> <!-- Twitter Card properties --> <meta content='Google Ads Developer Blog' property='og:title'/> <meta content='summary' name='twitter:card'/> <meta content='@google' name='twitter:creator'/> <link href='https://fonts.googleapis.com/css?family=Roboto:400italic,400,500,500italic,700,700italic' rel='stylesheet' type='text/css'/> <link href='https://fonts.googleapis.com/icon?family=Material+Icons' rel='stylesheet'/> <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js' type='text/javascript'></script> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-82055326-1', 'auto'); ga('send', 'pageview'); </script> <!-- End --> <style id='page-skin-1' type='text/css'><!-- /* <Group description="Header Color" selector="header"> <Variable name="header.background.color" description="Header Background" type="color" default="#ffffff"/> </Group> */ .header-outer { border-bottom: 1px solid #e0e0e0; background: #ffffff; } html, .Label h2, #sidebar .rss a, .BlogArchive h2, .FollowByEmail h2.title, .widget .post h2 { font-family: Roboto, sans-serif; } .plusfollowers h2.title, .post h2.title, .widget h2.title { font-family: Roboto, sans-serif; } .widget-item-control { height: 100%; } .widget.Header, #header { position: relative; height: 100%; width: 100%; } } .widget.Header .header-logo1 { float: left; margin-right: 15px; padding-right: 15px; border-right: 1px solid #ddd; } .header-title h2 { color: rgba(0,0,0,.54); display: inline-block; font-size: 40px; font-family: Roboto, sans-serif; font-weight: normal; line-height: 48px; vertical-align: top; } .header-inner { background-repeat: no-repeat; background-position: right 0px; } .post-author, .byline-author { font-size: 14px; font-weight: normal; color: #757575; color: rgba(0,0,0,.54); } .post-content .img-border { border: 1px solid rgb(235, 235, 235); padding: 4px; } .header-title a { text-decoration: none !important; } pre { border: 1px solid #bbbbbb; margin-top: 1em 0 0 0; padding: 0.99em; overflow-x: auto; overflow-y: auto; } pre, code { font-size: 9pt; background-color: #fafafa; line-height: 125%; font-family: monospace; } pre, code { color: #060; font: 13px/1.54 "courier new",courier,monospace; } .header-left .header-logo1 { width: 128px !important; } .header-desc { line-height: 20px; margin-top: 8px; } .fb-custom img, .twitter-custom img, .gplus-share img { cursor: pointer; opacity: 0.54; } .fb-custom img:hover, .twitter-custom img:hover, .gplus-share img:hover { opacity: 0.87; } .fb-like { width: 80px; } .post .share { float: right; } #twitter-share{ border: #CCC solid 1px; border-radius: 3px; background-image: -webkit-linear-gradient(top,#ffffff,#dedede); } .twitter-follow { background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVVfowXWI6SI8HNCGPfnKyNRe-wyiGsM28Jazt5og63q6Ula3__QjfJ0krie-XTOtpO6IlDOtulriyGWBdin3XU7HN6VY_J5mT7lWez8I8QjoqsXHq5qmxyqePXRBJ_G-NZfaqplhFFBfg/s1600/twitter-bird.png) no-repeat left center; padding-left: 18px; font: normal normal normal 11px/18px 'Helvetica Neue',Arial,sans-serif; font-weight: bold; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; margin-bottom: 10px; } .twitter-fb { padding-top: 2px; } .fb-follow-button { background: -webkit-linear-gradient(#4c69ba, #3b55a0); background: -moz-linear-gradient(#4c69ba, #3b55a0); background: linear-gradient(#4c69ba, #3b55a0); border-radius: 2px; height: 18px; padding: 4px 0 0 3px; width: 57px; border: #4c69ba solid 1px; } .fb-follow-button a { text-decoration: none !important; text-shadow: 0 -1px 0 #354c8c; text-align: center; white-space: nowrap; font-size: 11px; color: white; vertical-align: top; } .fb-follow-button a:visited { color: white; } .fb-follow { padding: 0px 5px 3px 0px; width: 14px; vertical-align: bottom; } .gplus-wrapper { margin-top: 3px; display: inline-block; vertical-align: top; } .twitter-custom, .gplus-share { margin-right: 12px; } .fb-follow-button{ margin: 10px auto; } --></style> <style id='template-skin-1' type='text/css'><!-- .header-outer { clear: both; } .header-inner { margin: auto; padding: 0px; } .footer-outer { background: #f5f5f5; clear: both; margin: 0; } .footer-inner { margin: auto; padding: 0px; } .footer-inner-2 { /* Account for right hand column elasticity. */ max-width: calc(100% - 248px); } .google-footer-outer { clear: both; } .cols-wrapper, .google-footer-outer, .footer-inner, .header-inner { max-width: 978px; margin-left: auto; margin-right: auto; } .cols-wrapper { margin: auto; clear: both; margin-top: 60px; margin-bottom: 60px; overflow: hidden; } .col-main-wrapper { float: left; width: 100%; } .col-main { margin-right: 278px; max-width: 660px; } .col-right { float: right; width: 248px; margin-left: -278px; } /* Tweaks for layout mode. */ body#layout .google-footer-outer { display: none; } body#layout .header-outer, body#layout .footer-outer { background: none; } body#layout .header-inner { height: initial; } body#layout .cols-wrapper { margin-top: initial; margin-bottom: initial; } --></style> <!-- start all head --> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href="//ads-developers.googleblog.com/favicon.ico" rel="icon" type="image/x-icon"> <link href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Google Ads Developer Blog - Atom" href="http://ads-developers.googleblog.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Google Ads Developer Blog - RSS" href="http://ads-developers.googleblog.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Google Ads Developer Blog - Atom" href="https://www.blogger.com/feeds/7815614485808579332/posts/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' property='og:url'/> <meta content='Google Ads Developer Blog' property='og:title'/> <meta content='The official blog for information about the Google Ads, Google Ad Manager, Google Mobile Ads SDKs for AdMob and IMA SDKs, and other Google Advertising Platform developer tools.' property='og:description'/> <!-- end all head --> <base target='_self'/> <style> html { font-family: Roboto, sans-serif; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; } body { padding: 0; /* This ensures that the scroll bar is always present, which is needed */ /* because content render happens after page load; otherwise the header */ /* would "bounce" in-between states. */ min-height: 150%; } h2 { font-size: 16px; } h1, h2, h3, h4, h5 { line-height: 2em; } html, h4, h5, h6 { font-size: 14px; } a, a:visited { color: #4184F3; text-decoration: none; } a:focus, a:hover, a:active { text-decoration: none; } .Header { margin-top: 15px; } .Header h1 { font-size: 32px; font-weight: 300; line-height: 32px; height: 42px; } .header-inner .Header .titlewrapper { padding: 0; margin-top: 30px; } .header-inner .Header .descriptionwrapper { padding: 0; margin: 0; } .cols-wrapper { margin-top: 56px; } .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 60px; } .header-inner { height: 256px; position: relative; } html, .header-inner a { color: #212121; color: rgba(0,0,0,.87); } .header-inner .google-logo { display: inline-block; background-size: contain; z-index: 1; height: 46px; overflow: hidden; margin-top: 4px; margin-right: 8px; } .header-left { position: absolute; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); margin-top: 12px; width: 100%; } .google-logo { margin-left: -4px; } #google-footer { position: relative; font-size: 13px; list-style: none; text-align: right; } #google-footer a { color: #444; } #google-footer ul { margin: 0; padding: 0; height: 144px; line-height: 144px; } #google-footer ul li { display: inline; } #google-footer ul li:before { color: #999; content: "\00b7"; font-weight: bold; margin: 5px; } #google-footer ul li:first-child:before { content: ''; } #google-footer .google-logo-dark { left: 0; margin-top: -16px; position: absolute; top: 50%; } /** Sitemap links. **/ .footer-inner-2 { font-size: 14px; padding-top: 42px; padding-bottom: 74px; } .footer-inner-2 .HTML h2 { color: #212121; color: rgba(0,0,0,.87); font-size: 14px; font-weight: 500; padding-left: 0; margin: 10px 0; } .footer-inner-2 .HTML ul { font-weight: normal; list-style: none; padding-left: 0; } .footer-inner-2 .HTML li { line-height: 24px; padding: 0; } .footer-inner-2 li a { color: rgba(65,132,243,.87); } /** Archive widget. **/ .BlogArchive { font-size: 13px; font-weight: normal; } .BlogArchive .widget-content { display: none; } .BlogArchive h2, .Label h2 { color: #4184F3; text-decoration: none; } .BlogArchive .hierarchy li { display: inline-block; } /* Specificity needed here to override widget CSS defaults. */ .BlogArchive #ArchiveList ul li, .BlogArchive #ArchiveList ul ul li { margin: 0; padding-left: 0; text-indent: 0; } .BlogArchive .intervalToggle { cursor: pointer; } .BlogArchive .expanded .intervalToggle .new-toggle { -ms-transform: rotate(180deg); transform: rotate(180deg); } .BlogArchive .new-toggle { float: right; padding-top: 3px; opacity: 0.87; } #ArchiveList { text-transform: uppercase; } #ArchiveList .expanded > ul:last-child { margin-bottom: 16px; } #ArchiveList .archivedate { width: 100%; } /* Months */ .BlogArchive .items { max-width: 150px; margin-left: -4px; } .BlogArchive .expanded .items { margin-bottom: 10px; overflow: hidden; } .BlogArchive .items > ul { float: left; height: 32px; } .BlogArchive .items a { padding: 0 4px; } .Label { font-size: 13px; font-weight: normal; } .sidebar-icon { display: inline-block; width: 24px; height: 24px; vertical-align: middle; margin-right: 12px; margin-top: -1px } .Label a { margin-right: 4px; } .Label .widget-content { display: none; } .FollowByEmail { font-size: 13px; font-weight: normal; } .FollowByEmail h2 { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); background-repeat: no-repeat; background-position: 0 50%; text-indent: 30px; } .FollowByEmail .widget-content { display: none; } .searchBox input { border: 1px solid #eee; color: #212121; color: rgba(0,0,0,.87); font-size: 14px; padding: 8px 8px 8px 40px; width: 164px; font-family: Roboto, sans-serif; background: url("https://www.gstatic.com/images/icons/material/system/1x/search_grey600_24dp.png") 8px center no-repeat; } .searchBox ::-webkit-input-placeholder { /* WebKit, Blink, Edge */ color: rgba(0,0,0,.54); } .searchBox :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #000; opacity: 0.54; } .searchBox ::-moz-placeholder { /* Mozilla Firefox 19+ */ color: #000; opacity: 0.54; } .searchBox :-ms-input-placeholder { /* Internet Explorer 10-11 */ color: #757575; } .widget-item-control { margin-top: 0px; } .section { margin: 0; padding: 0; } #sidebar-top { border: 1px solid #eee; } #sidebar-top > div { margin: 16px 0; } .widget ul { line-height: 1.6; } /*main post*/ .post { margin-bottom:30px; } #main .post .title { margin: 0; } #main .post .title a { color: #212121; color: rgba(0,0,0,.87); font-weight: normal; font-size: 24px; } #main .post .title a:hover { text-decoration:none; color:#4184F3; } .message, #main .post .post-header { margin: 0; padding: 0; } #main .post .post-header .caption, #main .post .post-header .labels-caption, #main .post .post-footer .caption, #main .post .post-footer .labels-caption { color: #444; font-weight: 500; } #main .tr-caption-container td { text-align: left; } #main .post .tr-caption { color: #757575; color: rgba(0,0,0,.54); display: block; max-width: 560px; padding-bottom: 20px; } #main .post .tr-caption-container { line-height: 24px; margin: -1px 0 0 0 !important; padding: 4px 0; text-align: left; } #main .post .post-header .published{ font-size:11px; font-weight:bold; } .post-header .publishdate { font-size: 17px; font-weight:normal; color: #757575; color: rgba(0,0,0,.54); } #main .post .post-footer{ font-size:12px; padding-bottom: 21px; } .label-footer { margin-bottom: 12px; margin-top: 12px; } .comment-img { margin-right: 16px; opacity: 0.54; vertical-align: middle; } #main .post .post-header .published { margin-bottom: 40px; margin-top: -2px; } .post .post-content { color: #212121; color: rgba(0,0,0,.87); font-size: 17px; margin: 25px 0 36px 0; line-height: 32px; } .post-body .post-content ul, .post-body .post-content ol { margin: 16px 0; padding: 0 48px; } .post-summary { display: none; } /* Another old-style caption. */ .post-content div i, .post-content div + i { font-size: 14px; font-style: normal; color: #757575; color: rgba(0,0,0,.54); display: block; line-height: 24px; margin-bottom: 16px; text-align: left; } /* Another old-style caption (with link) */ .post-content a > i { color: #4184F3 !important; } /* Old-style captions for images. */ .post-content .separator + div:not(.separator) { margin-top: -16px; } /* Capture section headers. */ .post-content br + br + b, .post-content .space + .space + b, .post-content .separator + b { display: inline-block; margin-bottom: 8px; margin-top: 24px; } .post-content li { line-height: 32px; } /* Override all post images/videos to left align. */ .post-content .separator, .post-content > div { text-align: left; } .post-content .separator > a, .post-content .separator > span { margin-left: 0 !important; } /*.post-content img { max-width: 100%; height: auto; width: auto; }*/ .post-content .tr-caption-container img { margin-bottom: 12px; } .post-content iframe, .post-content embed { max-width: 100%; } .post-content .carousel-container { margin-bottom: 48px; } #main .post-content b { font-weight: 500; } /* These are the main paragraph spacing tweaks. */ #main .post-content br { content: ' '; display: block; padding: 4px; } .post-content .space { display: block; height: 8px; } .post-content iframe + .space, .post-content iframe + br { padding: 0 !important; } #main .post .jump-link { margin-bottom:10px; } .post-content img, .post-content iframe { margin: 30px 0 20px 0; } .post-content > img:first-child, .post-content > iframe:first-child { margin-top: 0; } .col-right .section { padding: 0 16px; } #aside { background:#fff; border:1px solid #eee; border-top: 0; } #aside .widget { margin:0; } #aside .widget h2, #ArchiveList .toggle + a.post-count-link { color: #212121; color: rgba(0,0,0,.87); font-weight: 400 !important; margin: 0; } #ArchiveList .toggle { float: right; } #ArchiveList .toggle .material-icons { padding-top: 4px; } #sidebar .tab { cursor: pointer; } #sidebar .tab .arrow { display: inline-block; float: right; } #sidebar .tab .icon { display: inline-block; vertical-align: top; height: 24px; width: 24px; margin-right: 13px; margin-left: -1px; margin-top: 1px; color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget-content > :first-child { padding-top: 8px; } #sidebar .active .tab .arrow { -ms-transform: rotate(180deg); transform: rotate(180deg); } #sidebar .arrow { color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget h2 { font-size: 14px; font-weight: normal; } #sidebar .Label h2, #sidebar .BlogArchive h2 { display: inline-block; } .HTML .feed-title { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAX5JREFUeNqsVDGSgkAQHL2rIiIikohIc/EBRkbwAIwuwgfwAXiAD9AHSI7kEkECRCb6AIyINDLx7K0aa6kT7uq0q7YYtnZ7umdnt7darXbr9Zpegeu61DNNc0dvwCcH4/GYJpMJnc9nOhwOVJbl/4hAAokMECZJQtvt9k+kH7qufyEYDAakqqqYxFdRFBqNRmTbNg2HQ0rTlK7XayvR0xqBdDqdkuM4dE/0ULhYLOh4PHYrknG5XGi/31MYhuL/nkwonM1mlGUZ1XXdrsiyLGEDhY7juJEZ1u5tIixDGdYhmYw+B7CAzPP5nDabjdgIAgCksMX1832/3drtdqPT6SQWapomiGEFNkDEdpDMMAzK81ys/7XYy+XyoQgq2WoURSIJ2iIIgp/WZCCTvFm2wgeAU31aI3Q2GhIDMeB53qPYPIcm5VrxXIOIOxsDMStjVawAc1VViRgN22lNBiuQN3GR+SY07hpOoStmFQAKXRRFY93bnpG+fONfedi+BRgAbkS8Fxp7QQIAAAAASUVORK5CYII="); background-repeat: no-repeat; background-position: 0 50%; text-indent: 30px; } #sidebar .widget .BlogArchive { padding-bottom: 8px; } #sidebar .widget { border-bottom: 1px solid #eee; box-shadow: 0px 1px 0 white; margin-bottom: 0; padding: 14px 0; min-height: 20px; } #sidebar .widget:last-child { border-bottom: none; box-shadow: none; margin-bottom: 0; } #sidebar ul { margin: 0; padding: 0; } #sidebar ul li { list-style:none; padding:0; } #sidebar ul li a { line-height: 32px; } #sidebar .archive { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUeNpiNDY23s9AAWBioBCwYBM8c+YMVsUmJibEGYBNMS5DaeMFfDYSZQA2v9I3FrB5AZeriI4FmnrBccCT8mhmGs1MwyAzAQQYAKEWG9zm9QFEAAAAAElFTkSuQmCC"); height: 24px; line-height: 24px; padding-left: 30px; } #sidebar .labels { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUxJREFUeNpiNDY23s9AAMycOfM7UF05kHkZmzwTMkdSUhKrIcXFxZy3bt3qBjIN8RrS09PDsHnzZjCNDr58+cKQlpbGDjSoHcg1w2oIyAUODg5gARCNzUVIBrUCuVYYhjx//pzhwIEDYAEQDeJjA1CDWIAGNQK59jBxRuSABbkAlwHIgIeHh2HWrFn/1NTU2oDcvSgBS4wBSC5iArqoCsj1YGIgEyAZVMoEchqlBjEB/cZAiUHg2AEGznpKDAImxOeM////B4VLKtBvEUCngZ1ILKivr3/u6+ubBzJAGZQ9gC5aQoqLgAY8BhkAZL4BuQQkxgXE34A4BuiiZEIuAhrwEGhAEZD5DpzYoIaA2UAM4kQADUrHZRDUgAIg8wO2XAwzbQXQa5OweQ1owB10AyA6gS7BgX1u3ry5397eHow3bdo0EyjGi00tQIABANPgyAH1q1eaAAAAAElFTkSuQmCC"); height: 20px; line-height: 20px; padding-left: 30px; } #sidebar .rss a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAX5JREFUeNqsVDGSgkAQHL2rIiIikohIc/EBRkbwAIwuwgfwAXiAD9AHSI7kEkECRCb6AIyINDLx7K0aa6kT7uq0q7YYtnZ7umdnt7darXbr9Zpegeu61DNNc0dvwCcH4/GYJpMJnc9nOhwOVJbl/4hAAokMECZJQtvt9k+kH7qufyEYDAakqqqYxFdRFBqNRmTbNg2HQ0rTlK7XayvR0xqBdDqdkuM4dE/0ULhYLOh4PHYrknG5XGi/31MYhuL/nkwonM1mlGUZ1XXdrsiyLGEDhY7juJEZ1u5tIixDGdYhmYw+B7CAzPP5nDabjdgIAgCksMX1832/3drtdqPT6SQWapomiGEFNkDEdpDMMAzK81ys/7XYy+XyoQgq2WoURSIJ2iIIgp/WZCCTvFm2wgeAU31aI3Q2GhIDMeB53qPYPIcm5VrxXIOIOxsDMStjVawAc1VViRgN22lNBiuQN3GR+SY07hpOoStmFQAKXRRFY93bnpG+fONfedi+BRgAbkS8Fxp7QQIAAAAASUVORK5CYII="); } #sidebar .subscription a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); } #sidebar-bottom { background: #f5f5f5; border-top:1px solid #eee; } #sidebar-bottom .widget { border-bottom: 1px solid #e0e0e0; padding: 15px 0; /*text-align: center;*/ } #sidebar-bottom > div:last-child { border-bottom: 0; } #sidebar-bottom .text { line-height: 20px; } /* Home, forward, and backward pagination. */ .blog-pager { border-top : 1px #e0e0e0 solid; padding-top: 10px; margin-top: 15px; text-align: right !important; } #blog-pager { margin-botom: 0; margin-top: -14px; padding: 16px 0 0 0; } #blog-pager a { display: inline-block; } .blog-pager i.disabled { opacity: 0.2 !important; } .blog-pager i { color: black; margin-left: 16px; opacity: 0.54; } .blog-pager i:hover, .blog-pager i:active { opacity: 0.87; } #blog-pager-older-link, #blog-pager-newer-link { float: none; } .gplus-profile { background-color: #fafafa; border: 1px solid #eee; overflow: hidden; width: 212px; } .gplus-profile-inner { margin-left: -1px; margin-top: -1px; } /* Sidebar follow buttons. */ .followgooglewrapper { padding: 12px 0 0 0; } .loading { visibility: hidden; } .detail-page .post-footer .cmt_iframe_holder { padding-top: 40px !important; } /** Desktop **/ @media (max-width: 900px) { .col-right { display: none; } .col-main { margin-right: 0; min-width: initial; } .footer-outer { display: none; } .cols-wrapper { min-width: initial; } .google-footer-outer { background-color: #f5f5f5; } } /** Tablet **/ @media (max-width: 712px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 40px; } } /* An extra breakpoint accommodating for long blog titles. */ @media (max-width: 600px) { .header-left { height: 100%; top: inherit; margin-top: 0; -webkit-transform: initial; transform: initial; } .header-title { margin-top: 18px; } .header-inner .google-logo { height: 40px; margin-top: 3px; } .header-inner .google-logo img { height: 42px; } .header-title h2 { font-size: 32px; line-height: 40px; } .header-desc { bottom: 24px; position: absolute; } } /** Mobile/small desktop window; also landscape. **/ @media (max-width: 480px), (max-height: 480px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 16px; } .cols-wrapper { margin-top: 0; } .post-header .publishdate, .post .post-content { font-size: 16px; } .post .post-content { line-height: 28px; margin-bottom: 30px; } .post { margin-top: 30px; } .byline-author { display: block; font-size: 12px; line-height: 24px; margin-top: 6px; } #main .post .title a { font-weight: 500; color: #4c4c4c; color: rgba(0,0,0,.70); } #main .post .post-header { padding-bottom: 12px; } #main .post .post-header .published { margin-bottom: -8px; margin-top: 3px; } .post .read-more { display: block; margin-top: 14px; } .post .tr-caption { font-size: 12px; } #main .post .title a { font-size: 20px; line-height: 30px; } .post-content iframe { /* iframe won't keep aspect ratio when scaled down. */ max-height: 240px; } .post-content .separator img, .post-content .tr-caption-container img, .post-content iframe { margin-left: -16px; max-width: inherit; width: calc(100% + 32px); } .post-content table, .post-content td { width: 100%; } #blog-pager { margin: 0; padding: 16px 0; } /** List page tweaks. **/ .list-page .post-original { display: none; } .list-page .post-summary { display: block; } .list-page .comment-container { display: none; } .list-page #blog-pager { padding-top: 0; border: 0; margin-top: -8px; } .list-page .label-footer { display: none; } .list-page #main .post .post-footer { border-bottom: 1px solid #eee; margin: -16px 0 0 0; padding: 0 0 20px 0; } .list-page .post .share { display: none; } /** Detail page tweaks. **/ .detail-page .post-footer .cmt_iframe_holder { padding-top: 32px !important; } .detail-page .label-footer { margin-bottom: 0; } .detail-page #main .post .post-footer { padding-bottom: 0; } .detail-page #comments { display: none; } } [data-about-pullquote], [data-is-preview], [data-about-syndication] { display: none; } </style> <noscript> <style> .loading { visibility: visible }</style> </noscript> <!-- Google tag (gtag.js) --> <script async='true' src='https://www.googletagmanager.com/gtag/js?id=G-E4MSGF2SF9'></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-E4MSGF2SF9'); </script> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=7815614485808579332&zx=991641b5-0ef3-4614-b0ba-0ba3d648a368' media='none' onload='if(media!='all')media='all'' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=7815614485808579332&zx=991641b5-0ef3-4614-b0ba-0ba3d648a368' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> </head> <body> <script type='text/javascript'> //<![CDATA[ var axel = Math.random() + ""; var a = axel * 10000000000000; document.write('<iframe src="https://2542116.fls.doubleclick.net/activityi;src=2542116;type=gblog;cat=googl0;ord=ord=' + a + '?" width="1" height="1" frameborder="0" style="display:none"></iframe>'); //]]> </script> <noscript> <img alt='' height='1' src='https://ad.doubleclick.net/ddm/activity/src=2542116;type=gblog;cat=googl0;ord=1?' width='1'/> </noscript> <!-- Header --> <div class='header-outer'> <div class='header-inner'> <div class='section' id='header'><div class='widget Header' data-version='1' id='Header1'> <div class='header-left'> <div class='header-title'> <a class='google-logo' href='http://ads-developers.googleblog.com/'> <img height='50' src='https://www.gstatic.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png'/> </a> <a href='/.'> <h2> Ads Developer Blog </h2> </a> </div> <div class='header-desc'> The official blog for information about the Google Ads, Google Ad Manager, Google Mobile Ads SDKs for AdMob and IMA SDKs, and other Google Advertising Platform developer tools. </div> </div> </div></div> </div> </div> <!-- all content wrapper start --> <div class='cols-wrapper loading'> <div class='col-main-wrapper'> <div class='col-main'> <div class='section' id='main'><div class='widget Blog' data-version='1' id='Blog1'> <div class='post' data-id='6932387779722649852' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2025/02/announcing-ios-google-mobile-ads-sdk.html' itemprop='url' title='Announcing iOS Google Mobile Ads SDK Version 12.0.0'> Announcing iOS Google Mobile Ads SDK Version 12.0.0 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, February 7, 2025 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> Version 12.0.0 of the Google Mobile Ads SDK is now available. We recommend upgrading as soon as possible to get our latest features and performance improvements. </p> <h3>Updated Swift APIs</h3> <p> We’ve updated the Google Mobile Ads SDK to define an <code>NS_SWIFT_NAME</code> for every API to follow the naming conventions from Apple’s Swift <a href="https://www.swift.org/documentation/api-design-guidelines/">API Design Guidelines</a>. For example, we have: </p><ul> <li>Removed the <code>GAD</code> prefix across names for all types. <li>Renamed the <code>GAM</code> prefix to <code>AdManager</code>. <li>Renamed the <code>GADM</code> prefix to <code>Mediation</code>.</li></ul> <p> For the full list of Swift API name changes, see <a href="https://developers.google.com/admob/ios/migration#swift_naming_support">Swift naming support</a>. </p> <h3>Swift 6 Concurrency</h3> <p> <a href="https://developer.apple.com/documentation/swift/adoptingswift6">Swift 6 concurrency</a> support is being rolled out incrementally, starting this release with added support for our ad format delegate methods. Future SDK versions will include further improvements. </p> <h3>Changes to Xcode requirements</h3> <p> The minimum supported Xcode version has been bumped to 16.0. </p> <p> For the full list of changes, check the <a href="https://developers.google.com/admob/ios/rel-notes">release notes</a>. Check our <a href="https://developers.google.com/admob/ios/migration">migration guide</a> to ensure your mobile apps are ready to upgrade. </p> <h3>SDK Deprecation Reminder</h3> <p> Per the <a href="https://developers.google.com/admob/ios/deprecation">deprecation schedule</a>, the release of version 12.0.0 means that: </p><ul> <li>iOS Google Mobile Ads SDK versions 10.x.x are officially deprecated, and will sunset in Q2 2026. <li><strong>Versions 9.x.x and below will <a href="https://developers.google.com/admob/ios/deprecation#differences">sunset</a> on June 30, 2025</strong>. <ul> <li>While there are currently no plans to disable ad serving on version 9.x.x, we strongly recommend updating to a supported SDK version to avoid being impacted in the future.</li> </ul> </li> </ul> <p> As always, if you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> Version 12.0.0 of the Google Mobile Ads SDK is now available. We recommend upgrading as soon as possible to get our latest features and performance improvements. </p> <h3>Updated Swift APIs</h3> <p> We’ve updated the Google Mobile Ads SDK to define an <code>NS_SWIFT_NAME</code> for every API to follow the naming conventions from Apple’s Swift <a href="https://www.swift.org/documentation/api-design-guidelines/">API Design Guidelines</a>. For example, we have: </p><ul> <li>Removed the <code>GAD</code> prefix across names for all types. <li>Renamed the <code>GAM</code> prefix to <code>AdManager</code>. <li>Renamed the <code>GADM</code> prefix to <code>Mediation</code>.</li></ul> <p> For the full list of Swift API name changes, see <a href="https://developers.google.com/admob/ios/migration#swift_naming_support">Swift naming support</a>. </p> <h3>Swift 6 Concurrency</h3> <p> <a href="https://developer.apple.com/documentation/swift/adoptingswift6">Swift 6 concurrency</a> support is being rolled out incrementally, starting this release with added support for our ad format delegate methods. Future SDK versions will include further improvements. </p> <h3>Changes to Xcode requirements</h3> <p> The minimum supported Xcode version has been bumped to 16.0. </p> <p> For the full list of changes, check the <a href="https://developers.google.com/admob/ios/rel-notes">release notes</a>. Check our <a href="https://developers.google.com/admob/ios/migration">migration guide</a> to ensure your mobile apps are ready to upgrade. </p> <h3>SDK Deprecation Reminder</h3> <p> Per the <a href="https://developers.google.com/admob/ios/deprecation">deprecation schedule</a>, the release of version 12.0.0 means that: </p><ul> <li>iOS Google Mobile Ads SDK versions 10.x.x are officially deprecated, and will sunset in Q2 2026. <li><strong>Versions 9.x.x and below will <a href="https://developers.google.com/admob/ios/deprecation#differences">sunset</a> on June 30, 2025</strong>. <ul> <li>While there are currently no plans to disable ad serving on version 9.x.x, we strongly recommend updating to a supported SDK version to avoid being impacted in the future.</li> </ul> </li> </ul> <p> As always, if you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Announcing iOS Google Mobile Ads SDK Version 12.0.0&url=http://ads-developers.googleblog.com/2025/02/announcing-ios-google-mobile-ads-sdk.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2025/02/announcing-ios-google-mobile-ads-sdk.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2025/02/announcing-ios-google-mobile-ads-sdk.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/release' rel='tag'> release </a> </span> </div> </div> </div> <div class='post' data-id='7743511290382676804' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2024/12/use-ad-inspector-to-debug-your-mobile.html' itemprop='url' title='Use ad inspector to debug your mobile applications'> Use ad inspector to debug your mobile applications </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, December 20, 2024 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> Ad inspector is an in-app overlay that enables authorized devices to perform real-time analysis of Google Mobile Ads SDK test ad requests directly within your mobile app. It is included with the Google Mobile Ads SDK and you can enable it with no coding required. </p> <center> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoUsrxSjZZxmWX8P5VikMOCZkwX8iZ3rg6Jd2hxlmtM0e0FneRIJaI0JOIRK8T5Ya246XFGxDEa2LQgsWH4JsXQ_Ul3vypkqFZZEeSvw-VWubFRckXFErXO9CzuVW5U7-DrODYpQiXxeKw9DzbKQI65r7E4JYtShwi4fnjptarAVNY9lAE8myWjYo39ws/s1650/ad_inspector.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1540" data-original-width="1650" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoUsrxSjZZxmWX8P5VikMOCZkwX8iZ3rg6Jd2hxlmtM0e0FneRIJaI0JOIRK8T5Ya246XFGxDEa2LQgsWH4JsXQ_Ul3vypkqFZZEeSvw-VWubFRckXFErXO9CzuVW5U7-DrODYpQiXxeKw9DzbKQI65r7E4JYtShwi4fnjptarAVNY9lAE8myWjYo39ws/s1650/ad_inspector.png" width="600"/></a></div> </center> <p> Ad inspector empowers you to thoroughly test all your ad sources before releasing those changes to your users so you can verify everything is working properly. To help you understand and utilize ad inspector effectively, we published a 7-part <a href="https://www.youtube.com/playlist?list=PLcJhXDSkclw0hBD3ZJovduayMBipPqJlY">ad inspector video series</a> on our Google AdMob YouTube channel. </p> <p> Each video focuses on a specific challenge in testing your ad integration, offering in-depth tutorials and demonstrations on how to: </p><ul> <li><a href="https://youtu.be/seWbUbptcUI">Launch ad inspector</a> <li><a href="https://youtu.be/ajkifYNBuBI">Debug ad requests</a> <li><a href="https://youtu.be/-19mGZ6hOj8">Inspect your third-party adapters</a> <li><a href="https://youtu.be/gqxfJ9El6s4">View mediation details</a> <li><a href="https://youtu.be/f_--pZHrvIw">View bidding details</a> <li><a href="https://youtu.be/Gmgu4zJ8Ivo">Inspect privacy signals</a> <li><a href="https://youtu.be/GIqcR25PoOg">Export ad data to support teams</a></li></ul> <p> Check out our ad inspector documentation (<a href="https://developers.google.com/admob/android/ad-inspector">Android</a>, <a href="https://developers.google.com/admob/ios/ad-inspector">iOS</a>, <a href="https://developers.google.com/admob/unity/ad-inspector">Unity</a>, <a href="https://developers.google.com/admob/flutter/ad-inspector">Flutter</a>) to learn more. If you have questions, comments, or general feedback about ad inspector, contact us in the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. And remember to subscribe to our <a href="https://www.youtube.com/@AdMob">Google AdMob YouTube channel</a> for more technical content. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> Ad inspector is an in-app overlay that enables authorized devices to perform real-time analysis of Google Mobile Ads SDK test ad requests directly within your mobile app. It is included with the Google Mobile Ads SDK and you can enable it with no coding required. </p> <center> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoUsrxSjZZxmWX8P5VikMOCZkwX8iZ3rg6Jd2hxlmtM0e0FneRIJaI0JOIRK8T5Ya246XFGxDEa2LQgsWH4JsXQ_Ul3vypkqFZZEeSvw-VWubFRckXFErXO9CzuVW5U7-DrODYpQiXxeKw9DzbKQI65r7E4JYtShwi4fnjptarAVNY9lAE8myWjYo39ws/s1650/ad_inspector.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1540" data-original-width="1650" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoUsrxSjZZxmWX8P5VikMOCZkwX8iZ3rg6Jd2hxlmtM0e0FneRIJaI0JOIRK8T5Ya246XFGxDEa2LQgsWH4JsXQ_Ul3vypkqFZZEeSvw-VWubFRckXFErXO9CzuVW5U7-DrODYpQiXxeKw9DzbKQI65r7E4JYtShwi4fnjptarAVNY9lAE8myWjYo39ws/s1650/ad_inspector.png" width="600"/></a></div> </center> <p> Ad inspector empowers you to thoroughly test all your ad sources before releasing those changes to your users so you can verify everything is working properly. To help you understand and utilize ad inspector effectively, we published a 7-part <a href="https://www.youtube.com/playlist?list=PLcJhXDSkclw0hBD3ZJovduayMBipPqJlY">ad inspector video series</a> on our Google AdMob YouTube channel. </p> <p> Each video focuses on a specific challenge in testing your ad integration, offering in-depth tutorials and demonstrations on how to: </p><ul> <li><a href="https://youtu.be/seWbUbptcUI">Launch ad inspector</a> <li><a href="https://youtu.be/ajkifYNBuBI">Debug ad requests</a> <li><a href="https://youtu.be/-19mGZ6hOj8">Inspect your third-party adapters</a> <li><a href="https://youtu.be/gqxfJ9El6s4">View mediation details</a> <li><a href="https://youtu.be/f_--pZHrvIw">View bidding details</a> <li><a href="https://youtu.be/Gmgu4zJ8Ivo">Inspect privacy signals</a> <li><a href="https://youtu.be/GIqcR25PoOg">Export ad data to support teams</a></li></ul> <p> Check out our ad inspector documentation (<a href="https://developers.google.com/admob/android/ad-inspector">Android</a>, <a href="https://developers.google.com/admob/ios/ad-inspector">iOS</a>, <a href="https://developers.google.com/admob/unity/ad-inspector">Unity</a>, <a href="https://developers.google.com/admob/flutter/ad-inspector">Flutter</a>) to learn more. If you have questions, comments, or general feedback about ad inspector, contact us in the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. And remember to subscribe to our <a href="https://www.youtube.com/@AdMob">Google AdMob YouTube channel</a> for more technical content. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Use ad inspector to debug your mobile applications&url=http://ads-developers.googleblog.com/2024/12/use-ad-inspector-to-debug-your-mobile.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2024/12/use-ad-inspector-to-debug-your-mobile.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2024/12/use-ad-inspector-to-debug-your-mobile.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_inspector' rel='tag'> ad_inspector </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/flutter' rel='tag'> flutter </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/unity' rel='tag'> unity </a> </span> </div> </div> </div> <div class='post' data-id='1837215627838759779' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2024/07/reduce-anrs-when-implementing-mobile-ads.html' itemprop='url' title='Reduce ANRs when implementing mobile ads'> Reduce ANRs when implementing mobile ads </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, July 10, 2024 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> We heard your feedback via <a href="https://support.google.com/googleplay/android-developer/answer/9859174">Play Console crash reports</a> regarding <a href="https://developer.android.com/topic/performance/vitals/anr">Application Not Responding (ANRs)</a> errors related to the Google Mobile Ads SDK. After analyzing these reports, we updated our SDK implementation best practices to reduce ANR rates. The recommended best practices are as follows: </p> <ol> <li>Initialize the Mobile Ads SDK on a background thread <li>Enable optimization flag for ad loading</li> </ol> <p> <strong>1. Initialize the Mobile Ads SDK on a background thread</strong> </p> <p> Our previous best practice was to specify the <code><a href="https://developers.google.com/admob/android/optimize-initialization#update_your_manifest_file">OPTIMIZE_INITIALIZATION</a></code> manifest flag. However, some work on the calling thread is still required to prepare <code>MobileAds</code> to handle other method calls synchronously. <p> We now recommend calling <code><a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#initialize(android.content.Context,%20com.google.android.gms.ads.initialization.OnInitializationCompleteListener)">MobileAds.initialize()</a></code> on a background thread, enabling the work required on the calling thread to happen in the background. <pre class="prettyprint">import com.google.android.gms.ads.MobileAds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) <strong>CoroutineScope(Dispatchers.IO).launch { // Initialize the Google Mobile Ads SDK on a background thread. MobileAds.initialize(this@MainActivity) {} runOnUiThread { // Load an ad on the main thread. loadAd() } }</strong> } } </pre> <p> Note: When calling <code>MobileAds.initialize()</code> on a background thread, the <code>OPTIMIZE_INITIALIZATION </code>manifest flag is no longer required. </p> <p> <strong>2. Enable optimization flag for ad loading</strong> </p> <p> By enabling the <code><a href="https://developers.google.com/admob/android/optimize-initialization#update_your_manifest_file">OPTIMIZE_AD_LOADING</a></code> manifest flag, you can offload most ad loading tasks to a background thread. We recommend enabling this flag in your app's <code>AndroidManifest.xml</code> file to reduce the occurrence of ad loading causing ANRs. </p> <pre class="prettyprint"><manifest> ... <application> ... <strong><meta-data android:name="com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING" android:value="true"/></strong> </application> </manifest> </pre> <p> We’ve updated all of our <a href="https://github.com/googleads/googleads-mobile-android-examples">Android example apps</a> to implement these best practices. For more details on initialization and optimization flags, see <a href="https://developers.google.com/admob/android/quick-start#initialize_the_mobile_ads_sdk">Get started</a> and <a href="https://developers.google.com/admob/android/optimize-initialization">Optimize initialization and ad loading</a>. <a href="https://developers.google.com/admob/support">Contact us</a> if you have any questions or need additional help. </p> <span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a/ACg8ocKISGPasHSsoY62e-mi7sHCO_fg7CcJLfTQwSzCQ0SNiMhrZ00=s519-c-no" style="vertical-align:middle; border:none;" width="40"> - Joshua Hui, Mobile Ads Developer Relations</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> We heard your feedback via <a href="https://support.google.com/googleplay/android-developer/answer/9859174">Play Console crash reports</a> regarding <a href="https://developer.android.com/topic/performance/vitals/anr">Application Not Responding (ANRs)</a> errors related to the Google Mobile Ads SDK. After analyzing these reports, we updated our SDK implementation best practices to reduce ANR rates. The recommended best practices are as follows: </p> <ol> <li>Initialize the Mobile Ads SDK on a background thread <li>Enable optimization flag for ad loading</li> </ol> <p> <strong>1. Initialize the Mobile Ads SDK on a background thread</strong> </p> <p> Our previous best practice was to specify the <code><a href="https://developers.google.com/admob/android/optimize-initialization#update_your_manifest_file">OPTIMIZE_INITIALIZATION</a></code> manifest flag. However, some work on the calling thread is still required to prepare <code>MobileAds</code> to handle other method calls synchronously. <p> We now recommend calling <code><a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#initialize(android.content.Context,%20com.google.android.gms.ads.initialization.OnInitializationCompleteListener)">MobileAds.initialize()</a></code> on a background thread, enabling the work required on the calling thread to happen in the background. <pre class="prettyprint">import com.google.android.gms.ads.MobileAds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) <strong>CoroutineScope(Dispatchers.IO).launch { // Initialize the Google Mobile Ads SDK on a background thread. MobileAds.initialize(this@MainActivity) {} runOnUiThread { // Load an ad on the main thread. loadAd() } }</strong> } } </pre> <p> Note: When calling <code>MobileAds.initialize()</code> on a background thread, the <code>OPTIMIZE_INITIALIZATION </code>manifest flag is no longer required. </p> <p> <strong>2. Enable optimization flag for ad loading</strong> </p> <p> By enabling the <code><a href="https://developers.google.com/admob/android/optimize-initialization#update_your_manifest_file">OPTIMIZE_AD_LOADING</a></code> manifest flag, you can offload most ad loading tasks to a background thread. We recommend enabling this flag in your app's <code>AndroidManifest.xml</code> file to reduce the occurrence of ad loading causing ANRs. </p> <pre class="prettyprint"><manifest> ... <application> ... <strong><meta-data android:name="com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING" android:value="true"/></strong> </application> </manifest> </pre> <p> We’ve updated all of our <a href="https://github.com/googleads/googleads-mobile-android-examples">Android example apps</a> to implement these best practices. For more details on initialization and optimization flags, see <a href="https://developers.google.com/admob/android/quick-start#initialize_the_mobile_ads_sdk">Get started</a> and <a href="https://developers.google.com/admob/android/optimize-initialization">Optimize initialization and ad loading</a>. <a href="https://developers.google.com/admob/support">Contact us</a> if you have any questions or need additional help. </p> <span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a/ACg8ocKISGPasHSsoY62e-mi7sHCO_fg7CcJLfTQwSzCQ0SNiMhrZ00=s519-c-no" style="vertical-align:middle; border:none;" width="40"> - Joshua Hui, Mobile Ads Developer Relations</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Reduce ANRs when implementing mobile ads&url=http://ads-developers.googleblog.com/2024/07/reduce-anrs-when-implementing-mobile-ads.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2024/07/reduce-anrs-when-implementing-mobile-ads.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2024/07/reduce-anrs-when-implementing-mobile-ads.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='post' data-id='6976849160030046391' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2024/03/announcing-android-google-mobile-ads.html' itemprop='url' title='Announcing Android Google Mobile Ads SDK Version 23.0.0'> Announcing Android Google Mobile Ads SDK Version 23.0.0 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, March 15, 2024 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> Version 23.0.0 of the Android Google Mobile Ads SDK is now available. We recommend upgrading as soon as possible to get our latest features and performance improvements. </p> <h3>The minimum Android API level is 21</h3> <p> Starting in version 23.0.0, the Google Mobile Ads SDK requires all apps to be on a minimum Android API level 21 to run. To adjust the API level, change the value of <code>minSdk</code> in your app-level <code>build.gradle</code> file to 21 or higher. </p> <h3>Ad Manager builder methods can now be chained</h3> <p> In version 23.0.0, <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/admanager/AdManagerAdRequest.Builder">AdManagerAdRequest.Builder</a> methods inherited from its parent can be chained together to build an <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/admanager/AdManagerAdRequest">AdManagerAdRequest</a> using a single call: </p> <pre class="prettyprint">var newRequest = AdManagerAdRequest.Builder() .addCustomTargeting("age", "25") // AdManagerAdRequest.Builder method. .setContentUrl("https://www.example.com") // Method inherited from parent. .build() // Builds an AdManagerAdRequest.</pre> <p> A side effect of this change is <code>AdManagerAdRequest.Builder</code> no longer inherits from <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/AdRequest.Builder">AdRequest.Builder</a>. </p> <h3>SDK deprecation and sunset timelines activated </h3> <p> With this Android major version 23 launch and the <a href="https://ads-developers.googleblog.com/2024/02/announcing-ios-google-mobile-ads-sdk.html">iOS major version 11 launch </a> last month, we are announcing new deprecation and sunset dates for older major releases. Specifically: </p><ul> <li>Android Google Mobile Ads SDK versions 21.x.x are officially deprecated, and will sunset in Q2 2025. <li><strong>Android versions 20.x.x and iOS versions 8.x.x will <a href="https://developers.google.com/admob/android/deprecation#differences">sunset</a> on June 30, 2024</strong>. <ul> <li>While there are currently no plans to disable ad serving on Android versions 20.x.x and iOS versions 8.x.x, we strongly recommend updating to a supported SDK version to avoid being impacted in the future.</li> </ul> </li> </ul> <p> For the full list of changes in v23.0.0, check the <a href="https://developers.google.com/admob/android/rel-notes">release notes</a>. Check our <a href="https://developers.google.com/admob/android/migration">migration guide</a> to ensure your mobile apps are ready to upgrade. As always, if you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a/ACg8ocL5K1gwgo5Yng334LFkt_SM4fMqjvEyCXTG-cYDduruqA=s212-p" style="vertical-align:middle; border:none;" width="40"> - Jill Song, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> Version 23.0.0 of the Android Google Mobile Ads SDK is now available. We recommend upgrading as soon as possible to get our latest features and performance improvements. </p> <h3>The minimum Android API level is 21</h3> <p> Starting in version 23.0.0, the Google Mobile Ads SDK requires all apps to be on a minimum Android API level 21 to run. To adjust the API level, change the value of <code>minSdk</code> in your app-level <code>build.gradle</code> file to 21 or higher. </p> <h3>Ad Manager builder methods can now be chained</h3> <p> In version 23.0.0, <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/admanager/AdManagerAdRequest.Builder">AdManagerAdRequest.Builder</a> methods inherited from its parent can be chained together to build an <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/admanager/AdManagerAdRequest">AdManagerAdRequest</a> using a single call: </p> <pre class="prettyprint">var newRequest = AdManagerAdRequest.Builder() .addCustomTargeting("age", "25") // AdManagerAdRequest.Builder method. .setContentUrl("https://www.example.com") // Method inherited from parent. .build() // Builds an AdManagerAdRequest.</pre> <p> A side effect of this change is <code>AdManagerAdRequest.Builder</code> no longer inherits from <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/AdRequest.Builder">AdRequest.Builder</a>. </p> <h3>SDK deprecation and sunset timelines activated </h3> <p> With this Android major version 23 launch and the <a href="https://ads-developers.googleblog.com/2024/02/announcing-ios-google-mobile-ads-sdk.html">iOS major version 11 launch </a> last month, we are announcing new deprecation and sunset dates for older major releases. Specifically: </p><ul> <li>Android Google Mobile Ads SDK versions 21.x.x are officially deprecated, and will sunset in Q2 2025. <li><strong>Android versions 20.x.x and iOS versions 8.x.x will <a href="https://developers.google.com/admob/android/deprecation#differences">sunset</a> on June 30, 2024</strong>. <ul> <li>While there are currently no plans to disable ad serving on Android versions 20.x.x and iOS versions 8.x.x, we strongly recommend updating to a supported SDK version to avoid being impacted in the future.</li> </ul> </li> </ul> <p> For the full list of changes in v23.0.0, check the <a href="https://developers.google.com/admob/android/rel-notes">release notes</a>. Check our <a href="https://developers.google.com/admob/android/migration">migration guide</a> to ensure your mobile apps are ready to upgrade. As always, if you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a/ACg8ocL5K1gwgo5Yng334LFkt_SM4fMqjvEyCXTG-cYDduruqA=s212-p" style="vertical-align:middle; border:none;" width="40"> - Jill Song, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Announcing Android Google Mobile Ads SDK Version 23.0.0&url=http://ads-developers.googleblog.com/2024/03/announcing-android-google-mobile-ads.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2024/03/announcing-android-google-mobile-ads.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2024/03/announcing-android-google-mobile-ads.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/deprecation' rel='tag'> deprecation </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/release' rel='tag'> release </a> </span> </div> </div> </div> <div class='post' data-id='4355002074247154102' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2024/02/announcing-ios-google-mobile-ads-sdk.html' itemprop='url' title='Announcing iOS Google Mobile Ads SDK Version 11.0.0'> Announcing iOS Google Mobile Ads SDK Version 11.0.0 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, February 6, 2024 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> Today, we are announcing that version 11.0.0 of the Google Mobile Ads SDK is now available. We recommend upgrading as soon as possible to get our latest features and performance improvements. </p> <h3>Simplified SwiftUI development</h3> <p> Version 11.0.0 no longer requires publishers to declare a view controller to present full-screen ads. As a result, SwiftUI Publishers can now present full-screen ads without the need for UIKit or <code>UIViewControllerRepresentable</code> workarounds. See our <a href="https://developers.google.com/admob/ios/swiftui">SwiftUI guide</a> for more information. </p> <pre class="prettyprint">struct ContentView: View { private let adCoordinator = AdCoordinator() var body: some View { ... Button("Watch an ad") { adCoordinator.showAd() } } } private class InterstitialAdCoordinator: NSObject, GADFullScreenContentDelegate { private var interstitial: GADInterstitialAd? ... func showAd() { guard let interstitial = interstitial else { return print("Ad wasn't ready") } // The SDK uses the app's main window to look up view controllers // automatically when one is not provided. interstitial.present(fromRootViewController: nil) } }</pre> <h3>Continue collecting user metrics in AdMob</h3> <p> The Google Mobile Ads SDK dependency on <a href="https://github.com/google/GoogleAppMeasurement">GoogleAppMeasurement</a> has been removed. This dependency that powered the user metrics toggle in AdMob will be <a href="https://support.google.com/admob/answer/13973847">discontinued</a> in early 2024. To continue collecting user metrics in AdMob, <a href="https://support.google.com/admob/answer/6383165">link your AdMob app to Firebase</a> and integrate the <a href="https://firebase.google.com/docs/analytics">Google Analytics for Firebase</a> SDK into your app. </p> <h3>Changes to minimum OS and Xcode requirements</h3> <ul> <li>The minimum OS version to load ads has been bumped from 12 to 13. Applications can still be built for iOS 12, but the SDK will only load ads on iOS 13 and higher. <li>The minimum supported Xcode version has been bumped to 15.1.</li></ul> <p> For the full list of changes, check the <a href="https://developers.google.com/admob/ios/rel-notes">release notes</a>. Check our <a href="https://developers.google.com/admob/ios/migration">migration guide</a> to ensure your mobile apps are ready to upgrade. </p> <h3>SDK Deprecation Reminder</h3> <p> Per the <a href="https://developers.google.com/admob/ios/deprecation">deprecation schedule</a>, the release of version 11.0.0 means that: </p><ul> <li>iOS Google Mobile Ads SDK versions 9.x.x are officially deprecated, and will sunset in Q2 2025. <li><strong>Versions 8.x.x and below will <a href="https://developers.google.com/admob/ios/deprecation#differences">sunset</a> in Q2 2024</strong>, approximately 60 days following the release of Android Google Mobile Ads SDK major version 23.0.0. <ul> <li>While there are currently no plans to disable ad serving on version 8.x.x, we strongly recommend updating to a supported SDK version to avoid being impacted in the future.</li> </ul> </li> </ul> <p> As always, if you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> Today, we are announcing that version 11.0.0 of the Google Mobile Ads SDK is now available. We recommend upgrading as soon as possible to get our latest features and performance improvements. </p> <h3>Simplified SwiftUI development</h3> <p> Version 11.0.0 no longer requires publishers to declare a view controller to present full-screen ads. As a result, SwiftUI Publishers can now present full-screen ads without the need for UIKit or <code>UIViewControllerRepresentable</code> workarounds. See our <a href="https://developers.google.com/admob/ios/swiftui">SwiftUI guide</a> for more information. </p> <pre class="prettyprint">struct ContentView: View { private let adCoordinator = AdCoordinator() var body: some View { ... Button("Watch an ad") { adCoordinator.showAd() } } } private class InterstitialAdCoordinator: NSObject, GADFullScreenContentDelegate { private var interstitial: GADInterstitialAd? ... func showAd() { guard let interstitial = interstitial else { return print("Ad wasn't ready") } // The SDK uses the app's main window to look up view controllers // automatically when one is not provided. interstitial.present(fromRootViewController: nil) } }</pre> <h3>Continue collecting user metrics in AdMob</h3> <p> The Google Mobile Ads SDK dependency on <a href="https://github.com/google/GoogleAppMeasurement">GoogleAppMeasurement</a> has been removed. This dependency that powered the user metrics toggle in AdMob will be <a href="https://support.google.com/admob/answer/13973847">discontinued</a> in early 2024. To continue collecting user metrics in AdMob, <a href="https://support.google.com/admob/answer/6383165">link your AdMob app to Firebase</a> and integrate the <a href="https://firebase.google.com/docs/analytics">Google Analytics for Firebase</a> SDK into your app. </p> <h3>Changes to minimum OS and Xcode requirements</h3> <ul> <li>The minimum OS version to load ads has been bumped from 12 to 13. Applications can still be built for iOS 12, but the SDK will only load ads on iOS 13 and higher. <li>The minimum supported Xcode version has been bumped to 15.1.</li></ul> <p> For the full list of changes, check the <a href="https://developers.google.com/admob/ios/rel-notes">release notes</a>. Check our <a href="https://developers.google.com/admob/ios/migration">migration guide</a> to ensure your mobile apps are ready to upgrade. </p> <h3>SDK Deprecation Reminder</h3> <p> Per the <a href="https://developers.google.com/admob/ios/deprecation">deprecation schedule</a>, the release of version 11.0.0 means that: </p><ul> <li>iOS Google Mobile Ads SDK versions 9.x.x are officially deprecated, and will sunset in Q2 2025. <li><strong>Versions 8.x.x and below will <a href="https://developers.google.com/admob/ios/deprecation#differences">sunset</a> in Q2 2024</strong>, approximately 60 days following the release of Android Google Mobile Ads SDK major version 23.0.0. <ul> <li>While there are currently no plans to disable ad serving on version 8.x.x, we strongly recommend updating to a supported SDK version to avoid being impacted in the future.</li> </ul> </li> </ul> <p> As always, if you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Announcing iOS Google Mobile Ads SDK Version 11.0.0&url=http://ads-developers.googleblog.com/2024/02/announcing-ios-google-mobile-ads-sdk.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2024/02/announcing-ios-google-mobile-ads-sdk.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2024/02/announcing-ios-google-mobile-ads-sdk.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/release' rel='tag'> release </a> </span> </div> </div> </div> <div class='post' data-id='3451727778751666706' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2023/08/weve-made-updates-to-user-messaging.html' itemprop='url' title='We’ve Made Updates to the User Messaging Platform SDK APIs'> We’ve Made Updates to the User Messaging Platform SDK APIs </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, August 7, 2023 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> In case you missed it, we announced <a href="https://support.google.com/admob/answer/13554116">new consent management platform requirements for serving ads in the EEA and UK</a>. Beginning January 16, 2024, Google will require all publishers to use a Google-certified consent management platform (CMP) when serving ads to users in the European Economic Area or the UK. </p> <p> In addition to growing our list of <a href="https://support.google.com/admob/answer/13554116?hl=en#google-certified-cmps&zippy=%2Cgoogle-certified-cmps">certified CMPs</a>, we explored how to improve the User Messaging Platform (UMP) SDK developer experience for those who choose to use Google’s consent management solution. We are excited to share several updates in the latest iOS and Android versions that we think will streamline your integration. </p> <h2>Loading and presenting a consent form</h2> <p> The latest UMP SDK release introduces a new API, <a href="https://developers.google.com/admob/ios/privacy/api/reference/Classes/UMPConsentForm#+loadandpresentifrequiredfromviewcontroller:completionhandler:">loadAndPresentIfRequired()</a>, that consolidates the existing individual load and present consent form methods into a single method. The new API loads a consent form and if consent is required, automatically presents the consent form. This method is intended to be used at the beginning of a new app session. </p> <p> Here is a code example of how to use the new API on iOS: </p> <pre class="prettyprint">class ViewController: UIViewController { private var isMobileAdsStartCalled = false override func viewDidLoad() { super.viewDidLoad() UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(with: parameters) { [weak self] requestConsentError in guard let self else { return } // Call the helper method once consent information has been updated. UMPConsentForm.loadAndPresentIfRequired(from: self) { [weak self] loadAndPresentError in guard let self else { return } if UMPConsentInformation.sharedInstance.canRequestAds { self.startGoogleMobileAdsSDK() } } } // canRequestAds will be true if consent was gathered in the previous session. if UMPConsentInformation.sharedInstance.canRequestAds { startGoogleMobileAdsSDK() } } private func startGoogleMobileAdsSDK() { DispatchQueue.main.async { guard !self.isMobileAdsStartCalled else { return } self.isMobileAdsStartCalled = true // Initialize the Google Mobile Ads SDK. GADMobileAds.sharedInstance().start() // Request an ad. GADInterstitialAd.load(...) } } }</pre> <h2>Checking when to request ads</h2> <p> We added a new boolean property <a href="https://developers.google.com/admob/ios/privacy/api/reference/Classes/UMPConsentInformation#canrequestads">canRequestAds</a> to use as a check before initializing the Google Mobile Ads SDK and requesting ads. <code>canRequestAds</code> returns true when the consent status is either <a href="https://developers.google.com/admob/ios/privacy/api/reference/Enums/UMPConsentStatus#umpconsentstatusobtained">OBTAINED</a> or <a href="https://developers.google.com/admob/ios/privacy/api/reference/Enums/UMPConsentStatus#umpconsentstatusnotrequired">NOT_REQUIRED</a>; as a result you don’t need to implement any enum checking yourself. </p> <p> You should use the <code>canRequestAds</code> API in two places (as seen in the code snippet above): </p><ol> <li>Once consent has been gathered in the current session. <li>Immediately after you have called <code>requestConsentInfoUpdate.</code> It is possible consent has been gathered in the previous session in which case it is not necessary to wait for the callback to finish.</li> </ol> <h2>Checking privacy options requirement status</h2> <p> GDPR requires that publishers allow users to withdraw their consent choices at any time. It should be as easy to withdraw consent as it is to gather consent. To simplify this process, we have added two new APIs: </p><ol> <li><a href="https://developers.google.com/admob/ios/privacy/api/reference/Classes/UMPConsentInformation#privacyoptionsrequirementstatus">privacyOptionsRequirementStatus</a> to determine whether you should include a UI element that can re-present the consent form, such as a button in your application’s settings page. <li><a href="https://developers.google.com/admob/ios/privacy/api/reference/Classes/UMPConsentForm#-presentfromviewcontroller:completionhandler:">presentPrivacyOptionsForm()</a> to show the form so the user can update their consent status at any time.</li></ol> <p> Here is a code example of how to use the new APIs on iOS: </p> <pre class="prettyprint">// Show a privacy options button if required. private var isPrivacySettingsButtonEnabled: Bool { return UMPConsentInformation.shared.privacyOptionsRequirementStatus == .required } // Present the privacy options form when a user interacts with your app. @IBAction func privacySettingsTapped(_ sender: UIBarButtonItem) { UMPConsentForm.presentPrivacyOptionsForm(from: self) { [weak self] formError in guard let self, let formError else { return } // Handle the error. } }</pre> <h2>Developer resources</h2> <p> We updated our AdMob banner samples applications for <a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/main">iOS</a> and <a href="https://github.com/googleads/googleads-mobile-android-examples">Android</a> to showcase integrating the UMP SDK. Keep an eye out as we add UMP SDK support to the rest of our samples soon. </p> <p> Also take a look at our <a href="https://developers.google.com/admob/ios/privacy">iOS</a> and <a href="https://developers.google.com/admob/android/privacy">Android</a> developer documentation for instructions on how to implement the UMP SDK. </p> <p> If you have any questions or need additional help integrating the UMP SDK, please contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> In case you missed it, we announced <a href="https://support.google.com/admob/answer/13554116">new consent management platform requirements for serving ads in the EEA and UK</a>. Beginning January 16, 2024, Google will require all publishers to use a Google-certified consent management platform (CMP) when serving ads to users in the European Economic Area or the UK. </p> <p> In addition to growing our list of <a href="https://support.google.com/admob/answer/13554116?hl=en#google-certified-cmps&zippy=%2Cgoogle-certified-cmps">certified CMPs</a>, we explored how to improve the User Messaging Platform (UMP) SDK developer experience for those who choose to use Google’s consent management solution. We are excited to share several updates in the latest iOS and Android versions that we think will streamline your integration. </p> <h2>Loading and presenting a consent form</h2> <p> The latest UMP SDK release introduces a new API, <a href="https://developers.google.com/admob/ios/privacy/api/reference/Classes/UMPConsentForm#+loadandpresentifrequiredfromviewcontroller:completionhandler:">loadAndPresentIfRequired()</a>, that consolidates the existing individual load and present consent form methods into a single method. The new API loads a consent form and if consent is required, automatically presents the consent form. This method is intended to be used at the beginning of a new app session. </p> <p> Here is a code example of how to use the new API on iOS: </p> <pre class="prettyprint">class ViewController: UIViewController { private var isMobileAdsStartCalled = false override func viewDidLoad() { super.viewDidLoad() UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(with: parameters) { [weak self] requestConsentError in guard let self else { return } // Call the helper method once consent information has been updated. UMPConsentForm.loadAndPresentIfRequired(from: self) { [weak self] loadAndPresentError in guard let self else { return } if UMPConsentInformation.sharedInstance.canRequestAds { self.startGoogleMobileAdsSDK() } } } // canRequestAds will be true if consent was gathered in the previous session. if UMPConsentInformation.sharedInstance.canRequestAds { startGoogleMobileAdsSDK() } } private func startGoogleMobileAdsSDK() { DispatchQueue.main.async { guard !self.isMobileAdsStartCalled else { return } self.isMobileAdsStartCalled = true // Initialize the Google Mobile Ads SDK. GADMobileAds.sharedInstance().start() // Request an ad. GADInterstitialAd.load(...) } } }</pre> <h2>Checking when to request ads</h2> <p> We added a new boolean property <a href="https://developers.google.com/admob/ios/privacy/api/reference/Classes/UMPConsentInformation#canrequestads">canRequestAds</a> to use as a check before initializing the Google Mobile Ads SDK and requesting ads. <code>canRequestAds</code> returns true when the consent status is either <a href="https://developers.google.com/admob/ios/privacy/api/reference/Enums/UMPConsentStatus#umpconsentstatusobtained">OBTAINED</a> or <a href="https://developers.google.com/admob/ios/privacy/api/reference/Enums/UMPConsentStatus#umpconsentstatusnotrequired">NOT_REQUIRED</a>; as a result you don’t need to implement any enum checking yourself. </p> <p> You should use the <code>canRequestAds</code> API in two places (as seen in the code snippet above): </p><ol> <li>Once consent has been gathered in the current session. <li>Immediately after you have called <code>requestConsentInfoUpdate.</code> It is possible consent has been gathered in the previous session in which case it is not necessary to wait for the callback to finish.</li> </ol> <h2>Checking privacy options requirement status</h2> <p> GDPR requires that publishers allow users to withdraw their consent choices at any time. It should be as easy to withdraw consent as it is to gather consent. To simplify this process, we have added two new APIs: </p><ol> <li><a href="https://developers.google.com/admob/ios/privacy/api/reference/Classes/UMPConsentInformation#privacyoptionsrequirementstatus">privacyOptionsRequirementStatus</a> to determine whether you should include a UI element that can re-present the consent form, such as a button in your application’s settings page. <li><a href="https://developers.google.com/admob/ios/privacy/api/reference/Classes/UMPConsentForm#-presentfromviewcontroller:completionhandler:">presentPrivacyOptionsForm()</a> to show the form so the user can update their consent status at any time.</li></ol> <p> Here is a code example of how to use the new APIs on iOS: </p> <pre class="prettyprint">// Show a privacy options button if required. private var isPrivacySettingsButtonEnabled: Bool { return UMPConsentInformation.shared.privacyOptionsRequirementStatus == .required } // Present the privacy options form when a user interacts with your app. @IBAction func privacySettingsTapped(_ sender: UIBarButtonItem) { UMPConsentForm.presentPrivacyOptionsForm(from: self) { [weak self] formError in guard let self, let formError else { return } // Handle the error. } }</pre> <h2>Developer resources</h2> <p> We updated our AdMob banner samples applications for <a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/main">iOS</a> and <a href="https://github.com/googleads/googleads-mobile-android-examples">Android</a> to showcase integrating the UMP SDK. Keep an eye out as we add UMP SDK support to the rest of our samples soon. </p> <p> Also take a look at our <a href="https://developers.google.com/admob/ios/privacy">iOS</a> and <a href="https://developers.google.com/admob/android/privacy">Android</a> developer documentation for instructions on how to implement the UMP SDK. </p> <p> If you have any questions or need additional help integrating the UMP SDK, please contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:We’ve Made Updates to the User Messaging Platform SDK APIs&url=http://ads-developers.googleblog.com/2023/08/weve-made-updates-to-user-messaging.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2023/08/weve-made-updates-to-user-messaging.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2023/08/weve-made-updates-to-user-messaging.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='post' data-id='5086990204993704740' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2023/04/unity-google-mobile-ads-version-8.html' itemprop='url' title='Unity Google Mobile Ads Version 8 Released'> Unity Google Mobile Ads Version 8 Released </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, April 13, 2023 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> We are excited to announce the <a href="https://github.com/googleads/googleads-mobile-unity/releases">release</a> of Version 8 of the Google Mobile Ads for Unity plugin! This new version contains a number of new features and upgraded APIs. </p> <h3>Minimum Unity version is now 2019.4</h3> <p> The Google Mobile Ads Unity plugin now has a minimum Unity Engine version requirement of 2019.4. This was done to align with <a href="https://unity.com/releases/editor/qa/lts-releases">Unity’s long term support</a>. </p> <h3>Compatibility with Android v22.0.0</h3> <p> This release supports the Android Google Mobile Ads SDK <a href="https://developers.google.com/admob/android/rel-notes">version 22.0.0</a> major version release. </p> <h3>User Messaging Platform (UMP) support</h3> <p> The Google Mobile Ads Unity plugin now includes support for the Google User Messaging Platform (UMP) to help you gather consent from app users. To enable UMP support, see the <a href="https://developers.google.com/admob/unity/privacy">user privacy get started guide</a>. </p> <h3>Plugin now has C# reference documentation</h3> <p> With the release of version 8, we now have launched <a href="https://developers.google.com/admob/unity/reference">C# reference documentation</a>. Moreover, this version added xml-doc summaries to all public fields, properties, methods, and classes. This makes the plugin easier to use and provides full IntelliSense support when developing in Visual Studio. </p> <h3>Migrate ad format events to the new interface</h3> <p> Full-screen ad formats APIs now have a uniform interface and we are removing the old ad event APIs. These changes make the APIs for each ad format more consistent and easier to use. The new interface includes a static <a href="https://developers.google.com/admob/unity/reference/class/google-mobile-ads/api/interstitial-ad#load">Load()</a> method, use of <a href="https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-delegates">generic delegates</a> instead of EventArgs, and consistent ad events names across formats.<br><br>For a full list of changes and steps for upgrading your code, please see the <a href="https://developers.google.com/admob/unity/migration#migrate_from_version_7_to_version_8">version 8 migration guide</a>. </p> <h3>Use RaiseAdEventsOnUnityMainThread() to guarantee thread safety</h3> <p> The Google Mobile Ads Unity plugin now includes an <a href="https://developers.google.com/admob/unity/quick-start#use_RaiseAdEventsOnUnityMainThread">optional support feature for Unity thread safety</a>. This feature means you no longer need to manage threading concerns when handling platform events or callbacks. </p> <p> If you use this feature, the SDK may pause events during full screen ad presentations. This means that you might not get some events, like <a href="https://developers.google.com/admob/unity/reference/class/google-mobile-ads/api/interstitial-ad#onadfullscreencontentopened">OnAdFullScreenContentOpened</a> or <a href="https://developers.google.com/admob/unity/reference/class/google-mobile-ads/api/interstitial-ad#onadimpressionrecorded">OnAdImpressionRecorded</a>, until after the user comes back to the game. If you need to collect this data in real time, this might not be a good option. We recommend you test this feature to see if it works for you. </p> <p> Here's an example of how to use Google Mobile Ads new thread safety support: </p> <h3>Deprecation of Ad Placements</h3> <p> The Google Mobile Ads Unity plugin's <a href="https://developers.google.com/admob/unity/ad-placements">Ad Placements</a> feature is deprecated. There are no plans to move it into public release. </p> <p> If you have any questions or concerns about migrating your project, please reach out on our <a href="https://groups.google.com/g/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img alt="" border="0" data-original-height="212" data-original-width="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6nvCzQ91y_tEGvpoTO-R-pc9ouigbNsl_0ffjTCCeYoE89mn7RWemYGoIhR8Oh-SoZ5etlVjUN-iKQxgz52ahEQZimfj7u8WW4lLHQxtlHnN9b7NuLbU0JCJ2RxHNGTjA6DXr7AYVMTn5Mhlaw4mQGfpG8niclcDCjo6RDFlDMdvs4hoVcvzDdBDK/s200/nventimiglia.jpeg" style="vertical-align:middle; border:none;" width="40"/> - Nicholas Ventimiglia, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> We are excited to announce the <a href="https://github.com/googleads/googleads-mobile-unity/releases">release</a> of Version 8 of the Google Mobile Ads for Unity plugin! This new version contains a number of new features and upgraded APIs. </p> <h3>Minimum Unity version is now 2019.4</h3> <p> The Google Mobile Ads Unity plugin now has a minimum Unity Engine version requirement of 2019.4. This was done to align with <a href="https://unity.com/releases/editor/qa/lts-releases">Unity’s long term support</a>. </p> <h3>Compatibility with Android v22.0.0</h3> <p> This release supports the Android Google Mobile Ads SDK <a href="https://developers.google.com/admob/android/rel-notes">version 22.0.0</a> major version release. </p> <h3>User Messaging Platform (UMP) support</h3> <p> The Google Mobile Ads Unity plugin now includes support for the Google User Messaging Platform (UMP) to help you gather consent from app users. To enable UMP support, see the <a href="https://developers.google.com/admob/unity/privacy">user privacy get started guide</a>. </p> <h3>Plugin now has C# reference documentation</h3> <p> With the release of version 8, we now have launched <a href="https://developers.google.com/admob/unity/reference">C# reference documentation</a>. Moreover, this version added xml-doc summaries to all public fields, properties, methods, and classes. This makes the plugin easier to use and provides full IntelliSense support when developing in Visual Studio. </p> <h3>Migrate ad format events to the new interface</h3> <p> Full-screen ad formats APIs now have a uniform interface and we are removing the old ad event APIs. These changes make the APIs for each ad format more consistent and easier to use. The new interface includes a static <a href="https://developers.google.com/admob/unity/reference/class/google-mobile-ads/api/interstitial-ad#load">Load()</a> method, use of <a href="https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-delegates">generic delegates</a> instead of EventArgs, and consistent ad events names across formats.<br><br>For a full list of changes and steps for upgrading your code, please see the <a href="https://developers.google.com/admob/unity/migration#migrate_from_version_7_to_version_8">version 8 migration guide</a>. </p> <h3>Use RaiseAdEventsOnUnityMainThread() to guarantee thread safety</h3> <p> The Google Mobile Ads Unity plugin now includes an <a href="https://developers.google.com/admob/unity/quick-start#use_RaiseAdEventsOnUnityMainThread">optional support feature for Unity thread safety</a>. This feature means you no longer need to manage threading concerns when handling platform events or callbacks. </p> <p> If you use this feature, the SDK may pause events during full screen ad presentations. This means that you might not get some events, like <a href="https://developers.google.com/admob/unity/reference/class/google-mobile-ads/api/interstitial-ad#onadfullscreencontentopened">OnAdFullScreenContentOpened</a> or <a href="https://developers.google.com/admob/unity/reference/class/google-mobile-ads/api/interstitial-ad#onadimpressionrecorded">OnAdImpressionRecorded</a>, until after the user comes back to the game. If you need to collect this data in real time, this might not be a good option. We recommend you test this feature to see if it works for you. </p> <p> Here's an example of how to use Google Mobile Ads new thread safety support: </p> <h3>Deprecation of Ad Placements</h3> <p> The Google Mobile Ads Unity plugin's <a href="https://developers.google.com/admob/unity/ad-placements">Ad Placements</a> feature is deprecated. There are no plans to move it into public release. </p> <p> If you have any questions or concerns about migrating your project, please reach out on our <a href="https://groups.google.com/g/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img alt="" border="0" data-original-height="212" data-original-width="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6nvCzQ91y_tEGvpoTO-R-pc9ouigbNsl_0ffjTCCeYoE89mn7RWemYGoIhR8Oh-SoZ5etlVjUN-iKQxgz52ahEQZimfj7u8WW4lLHQxtlHnN9b7NuLbU0JCJ2RxHNGTjA6DXr7AYVMTn5Mhlaw4mQGfpG8niclcDCjo6RDFlDMdvs4hoVcvzDdBDK/s200/nventimiglia.jpeg" style="vertical-align:middle; border:none;" width="40"/> - Nicholas Ventimiglia, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Unity Google Mobile Ads Version 8 Released&url=http://ads-developers.googleblog.com/2023/04/unity-google-mobile-ads-version-8.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2023/04/unity-google-mobile-ads-version-8.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2023/04/unity-google-mobile-ads-version-8.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/unity' rel='tag'> unity </a> </span> </div> </div> </div> <div class='post' data-id='9055398323296278478' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2023/04/android-google-mobile-ads-sdk-version.html' itemprop='url' title='Android Google Mobile Ads SDK Version 22.0.0 activates SDK sunset timelines'> Android Google Mobile Ads SDK Version 22.0.0 activates SDK sunset timelines </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, April 3, 2023 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> We are excited to announce the release of our newest version of the Google Mobile Ads SDK. We recommend upgrading as soon as possible to stay up-to-date with our latest features. </p> <h2>Version 22.0.0 Changes</h2> <p> Google Mobile Ads SDK version 22.0.0 introduces a few major changes: </p><ul> <li><code>MobileAds.getVersionString()</code> is removed in version 22.0.0 in favor of <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#public-static-versioninfo-getversion">MobileAds.getVersion()</a>. The new method returns the expected external version number (for example,<code> 22.0.0</code>), helping you more clearly identify your SDK version. For more information about this change, see the <a href="https://ads-developers.googleblog.com/2022/07/use-new-google-mobile-ads-sdk.html">Use the new Google Mobile Ads SDK getVersion() method</a> blog post. <li>In version 21, the Google Mobile Ads SDK provided you the <code>NativeCustomFormatAd.getVideoMediaView()</code> method to get the media asset for an Ad Manager <a href="https://support.google.com/admanager/answer/6366911">native custom ad format</a>. In version 22, <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/nativead/NativeCustomFormatAd">NativeCustomFormatAd</a> provides direct access to <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/nativead/NativeCustomFormatAd#getMediaContent()">getMediaContent()</a> enabling you to define your MediaView in layout files along with the rest of your other views, and simply populate that view with its content once the ad loads.</li></ul> <p> See <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/android/rel-notes">release notes</a> for the full changelog. See our <a href="https://developers.google.com/admob/android/migration">migration guide</a> to help you migrate your apps. </p> <h2>SDK deprecation/sunset activated</h2> <p> Per the deprecated schedule <a href="https://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html">announced last year</a>, the release of <a href="https://ads-developers.googleblog.com/2023/02/announcing-ios-google-mobile-ads-sdk.html">iOS version 10.0.0 in February</a> and this Android version 22.0.0 release activate the sunset period of earlier Android/iOS releases. Specifically: </p><ul> <li>Android Google Mobile Ads SDK version 20.x.x is officially deprecated, meaning that you will be asked to update to at least version 21.0.0 to receive full support from the <a href="https://groups.google.com/g/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>. <li>Android versions 19.x.x and below, as well as iOS versions 7.x.x will<strong> sunset on June 30th, 2023, </strong>meaning that ad serving could be disrupted. See details below.</li></ul> <h2>Updated definition of sunset</h2> <p> We remain committed to regularly disabling old SDK versions balanced with minimizing disruption to ad serving. Aligned with this goal, we are making some changes to the previously <a href="https://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html">announced</a> sunset definition for 2023: </p><ol> <li>We previously communicated that the sunset notice period would be 2 months. For this 2023 sunset, the sunset date is June 30th, approximately 3 months notice. <li>We will leverage the “Outdated” feature on the <a href="https://play.google.com/sdks/details/com-google-android-gms-play-services-ads">Google Play SDK Index</a>, requiring you to move off a sunset SDK version for future releases of your Android apps. See <a href="https://support.google.com/googleplay/android-developer/answer/10358880">Understanding issues with your app’s third-party SDK</a> for more information. <li>Starting June 30th, you may notice some disruptions in your ad serving. While we do not plan to stop ad serving for iOS version 7.x.x and Android versions 19.x.x and earlier at this time, we will regularly review usage of all sunset versions going forward to consider disabling ad serving. The oldest versions with lower usage and higher maintenance costs will be targeted first. Therefore, ad traffic from sunset SDKs versions will be at risk of receiving automatic no fill due to stopped ad serving going forward.</li></ol> <p> To avoid disruptions in ad serving, we highly recommend upgrading to a supported version as soon as possible so your users have a chance to update before June 30th, 2023. </p> <h2>Check if your apps are affected</h2> <p> To help you prepare for these changes, there are several ways you can check if your apps are affected: </p><ul> <li>Use the <a href="https://support.google.com/admob/answer/10979428">Ads Activity report</a> and enable the “GMA SDK” dimension to see iOS app traffic running on iOS 7.x.x or earlier. Currently, only the Google Mobile Ads SDK for iOS is supported. <li>In Android Studio, check your build.gradle file for build warnings, which are thrown when compiling with Android SDK version 19.x.x or earlier. <li>Check your console logs for warning logs when making ad requests.</li></ul> <p> As always, if you have any questions or need additional help, contact us through the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/ogw/AAEL6shSt2kHwRXXS4ZJG0_CZ4fIPoybG9tqGTtIxEkG=s64-c-mo" style="vertical-align:middle; border:none;" width="40"> - Jill Song, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> We are excited to announce the release of our newest version of the Google Mobile Ads SDK. We recommend upgrading as soon as possible to stay up-to-date with our latest features. </p> <h2>Version 22.0.0 Changes</h2> <p> Google Mobile Ads SDK version 22.0.0 introduces a few major changes: </p><ul> <li><code>MobileAds.getVersionString()</code> is removed in version 22.0.0 in favor of <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#public-static-versioninfo-getversion">MobileAds.getVersion()</a>. The new method returns the expected external version number (for example,<code> 22.0.0</code>), helping you more clearly identify your SDK version. For more information about this change, see the <a href="https://ads-developers.googleblog.com/2022/07/use-new-google-mobile-ads-sdk.html">Use the new Google Mobile Ads SDK getVersion() method</a> blog post. <li>In version 21, the Google Mobile Ads SDK provided you the <code>NativeCustomFormatAd.getVideoMediaView()</code> method to get the media asset for an Ad Manager <a href="https://support.google.com/admanager/answer/6366911">native custom ad format</a>. In version 22, <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/nativead/NativeCustomFormatAd">NativeCustomFormatAd</a> provides direct access to <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/nativead/NativeCustomFormatAd#getMediaContent()">getMediaContent()</a> enabling you to define your MediaView in layout files along with the rest of your other views, and simply populate that view with its content once the ad loads.</li></ul> <p> See <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/android/rel-notes">release notes</a> for the full changelog. See our <a href="https://developers.google.com/admob/android/migration">migration guide</a> to help you migrate your apps. </p> <h2>SDK deprecation/sunset activated</h2> <p> Per the deprecated schedule <a href="https://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html">announced last year</a>, the release of <a href="https://ads-developers.googleblog.com/2023/02/announcing-ios-google-mobile-ads-sdk.html">iOS version 10.0.0 in February</a> and this Android version 22.0.0 release activate the sunset period of earlier Android/iOS releases. Specifically: </p><ul> <li>Android Google Mobile Ads SDK version 20.x.x is officially deprecated, meaning that you will be asked to update to at least version 21.0.0 to receive full support from the <a href="https://groups.google.com/g/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>. <li>Android versions 19.x.x and below, as well as iOS versions 7.x.x will<strong> sunset on June 30th, 2023, </strong>meaning that ad serving could be disrupted. See details below.</li></ul> <h2>Updated definition of sunset</h2> <p> We remain committed to regularly disabling old SDK versions balanced with minimizing disruption to ad serving. Aligned with this goal, we are making some changes to the previously <a href="https://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html">announced</a> sunset definition for 2023: </p><ol> <li>We previously communicated that the sunset notice period would be 2 months. For this 2023 sunset, the sunset date is June 30th, approximately 3 months notice. <li>We will leverage the “Outdated” feature on the <a href="https://play.google.com/sdks/details/com-google-android-gms-play-services-ads">Google Play SDK Index</a>, requiring you to move off a sunset SDK version for future releases of your Android apps. See <a href="https://support.google.com/googleplay/android-developer/answer/10358880">Understanding issues with your app’s third-party SDK</a> for more information. <li>Starting June 30th, you may notice some disruptions in your ad serving. While we do not plan to stop ad serving for iOS version 7.x.x and Android versions 19.x.x and earlier at this time, we will regularly review usage of all sunset versions going forward to consider disabling ad serving. The oldest versions with lower usage and higher maintenance costs will be targeted first. Therefore, ad traffic from sunset SDKs versions will be at risk of receiving automatic no fill due to stopped ad serving going forward.</li></ol> <p> To avoid disruptions in ad serving, we highly recommend upgrading to a supported version as soon as possible so your users have a chance to update before June 30th, 2023. </p> <h2>Check if your apps are affected</h2> <p> To help you prepare for these changes, there are several ways you can check if your apps are affected: </p><ul> <li>Use the <a href="https://support.google.com/admob/answer/10979428">Ads Activity report</a> and enable the “GMA SDK” dimension to see iOS app traffic running on iOS 7.x.x or earlier. Currently, only the Google Mobile Ads SDK for iOS is supported. <li>In Android Studio, check your build.gradle file for build warnings, which are thrown when compiling with Android SDK version 19.x.x or earlier. <li>Check your console logs for warning logs when making ad requests.</li></ul> <p> As always, if you have any questions or need additional help, contact us through the <a href="https://groups.google.com/group/google-admob-ads-sdk">developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/ogw/AAEL6shSt2kHwRXXS4ZJG0_CZ4fIPoybG9tqGTtIxEkG=s64-c-mo" style="vertical-align:middle; border:none;" width="40"> - Jill Song, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Android Google Mobile Ads SDK Version 22.0.0 activates SDK sunset timelines&url=http://ads-developers.googleblog.com/2023/04/android-google-mobile-ads-sdk-version.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2023/04/android-google-mobile-ads-sdk-version.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2023/04/android-google-mobile-ads-sdk-version.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='post' data-id='2773199378579576228' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2023/03/take-2023-google-mobile-ads-sdk.html' itemprop='url' title=' Take the 2023 Google Mobile Ads SDK developer survey'> Take the 2023 Google Mobile Ads SDK developer survey </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, March 24, 2023 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>Today, we’re excited to announce the launch of our 2023 Google Mobile Ads SDK Developer Survey. As part of our efforts to continue updating the AdMob and Ad Manager products, we’d like to hear from you about where we should focus our efforts. This includes product feedback as well as feedback on our guides, code samples and other resources. Your feedback will help shape our future product and resource roadmap.<p> <center><h1> <a href="https://google.qualtrics.com/jfe/form/SV_7PXOuNLXmOA3FQi">Take the survey</a> </h1></center> <p>This anonymous survey should only take about 15 minutes to complete and will provide our team with your valuable feedback as we plan for the months ahead. Whether you’re an engineer, Ad Ops personnel, or a PM, your feedback on AdMob, Ad Manager, and the Google Mobile Ads SDK is valuable to us. We appreciate you taking the time to help improve our developer experience!</p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/ACB-R5RbmAcV8rX8R7rQrc0Z23xZQjeZ2632HH8JI6D_=s64-p-k-rw-no?sz=40" style="vertical-align:middle; border:none;" width="40"> - Chris Giglio, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>Today, we’re excited to announce the launch of our 2023 Google Mobile Ads SDK Developer Survey. As part of our efforts to continue updating the AdMob and Ad Manager products, we’d like to hear from you about where we should focus our efforts. This includes product feedback as well as feedback on our guides, code samples and other resources. Your feedback will help shape our future product and resource roadmap.<p> <center><h1> <a href="https://google.qualtrics.com/jfe/form/SV_7PXOuNLXmOA3FQi">Take the survey</a> </h1></center> <p>This anonymous survey should only take about 15 minutes to complete and will provide our team with your valuable feedback as we plan for the months ahead. Whether you’re an engineer, Ad Ops personnel, or a PM, your feedback on AdMob, Ad Manager, and the Google Mobile Ads SDK is valuable to us. We appreciate you taking the time to help improve our developer experience!</p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/ACB-R5RbmAcV8rX8R7rQrc0Z23xZQjeZ2632HH8JI6D_=s64-p-k-rw-no?sz=40" style="vertical-align:middle; border:none;" width="40"> - Chris Giglio, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog: Take the 2023 Google Mobile Ads SDK developer survey&url=http://ads-developers.googleblog.com/2023/03/take-2023-google-mobile-ads-sdk.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2023/03/take-2023-google-mobile-ads-sdk.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2023/03/take-2023-google-mobile-ads-sdk.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/unity' rel='tag'> unity </a> </span> </div> </div> </div> <div class='post' data-id='6401711394663655279' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2023/02/use-mobile-ads-sdk-volume-apis.html' itemprop='url' title='Use Mobile Ads SDK Volume APIs Correctly to Maximize Video Ad Revenue'> Use Mobile Ads SDK Volume APIs Correctly to Maximize Video Ad Revenue </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, February 9, 2023 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <style> table, th, td { border: 1px solid black; border-collapse: collapse; padding:10px; } </style> <p> The volume control APIs provided by the Google Mobile Ads SDK are intended to mirror your app’s own <em>custom volume controls</em>. Utilizing these APIs ensures that the user receives video ads with the expected audio volume. </p> <p> We’ll talk about some best practices implementing the volume control APIs in your <a href="https://developers.google.com/admob/ios/global-settings#video_ad_volume_control">iOS</a>, <a href="https://developers.google.com/admob/android/global-settings#video_ad_volume_control">Android</a> or <a href="https://developers.google.com/admob/unity/global-settings#video_ad_volume_control">Unity</a> project. </p> <h2>Why are we mentioning this?</h2> <p> Publishers can lose revenue when using these APIs to lower or mute the volume of the Google Mobile Ads SDK. Two issues we have commonly seen: </p><ol> <li>Apps are using their own custom volume controls not sending the app’s accurate volume to the Google Mobile Ads SDK, but always sending zero <li>App are just muting the SDK</li></ol> <p> Some apps have close to a 100% mute rate which doesn’t sound correct (pun intended). Setting application volume to zero or muting the application reduces video ad eligibility, which as a result may reduce your app’s ad revenue. </p> <h2>Volume control APIs</h2> <p> The Google Mobile Ads SDK offers two <a href="https://developers.google.com/admob/ios/global-settings">volume control APIs</a>: setting the volume and toggling mute. These APIs are applicable to App Open, Banner, Interstitial, Rewarded and Rewarded Interstitial ad formats. For Native ads, use <code><a href="https://developers.google.com/admob/ios/api/reference/Classes/GADVideoOptions">GADVideoOptions</a></code>. <h4>Setting application volume on each platform</h4> <table> <tr> <td>iOS </td> <td><code>GADMobileAds.sharedInstance().applicationVolume = 1.0</code> </td> </tr> <tr> <td>Android </td> <td><code>MobileAds.setAppVolume(1.0f)</code> </td> </tr> <tr> <td>Unity </td> <td><code>MobileAds.SetApplicationVolume(1.0f)</code> </td> </tr> </table> <p> Use <code>applicationVolume</code> to set your custom volume <em>relative</em> to the device volume. The range can be from 0.0 (silent) to 1.0 (current device volume). For example, if the device volume level was at half level and the user set your app’s custom volume to max level, set the <code>applicationVolume</code> to <code>1.0</code> and the user will receive an ad with the volume at half level. </p> <h4>Setting application mute on each platform </h4> <table> <tr> <td>iOS </td> <td><code>GADMobileAds.sharedInstance().applicationMuted = true</code> </td> </tr> <tr> <td>Android </td> <td><code>MobileAds.setAppMuted(true)</code> </td> </tr> <tr> <td>Unity </td> <td><code>MobileAds.SetApplicationMuted(true)</code> </td> </tr> </table> <p> Use <code>applicationMuted</code> if your custom volume controls include a mute button. Only toggle <code>applicationMuted</code> if the user selects your custom mute button. For example, if the user adjusts your custom volume to 0 you do not need to call <code>applicationMuted</code>; just call <code>applicationVolume = 0.0</code>. </p> <h4>Setting mute for native ads on each platform</h4> <table> <tr> <td>iOS </td> <td> <pre class="prettyprint">let videoOptions = GADVideoOptions() videoOptions.startMuted = true adLoader = GADAdLoader( adUnitID: "AD_UNIT_ID", rootViewController: self, adTypes: [ ... ad type constants ... ], options: [videoOptions])</pre> </td> </tr> <tr> <td>Android </td> <td> <pre class="prettyprint">val videoOptions = VideoOptions.Builder() .setStartMuted(false) .build() val adOptions = NativeAdOptions.Builder() .setVideoOptions(videoOptions) .build() val adLoader = AdLoader.Builder(this, "AD_UNIT_ID") .forNativeAd( ... ) .withNativeAdOptions(adOptions) .build()</pre> </td> </tr> <tr> <td>Unity </td> <td><code>N/A - Native video ads are not supported in Unity.</code> </td> </tr> </table> <p> Use <code>startMuted</code> if your custom volume controls include a mute button. Only toggle <code>startMuted</code> if the user selects your custom mute button. </p> <h2>Best Practices</h2> <p> To use our APIs as intended: </p><ol> <li><code>applicationVolume</code> should be called only when your custom volume control settings are set to reflect the new volume <li><code>applicationMuted</code> or <code>startMuted</code> should only be toggled to <code>true</code> if the user has muted your custom volume</li></ol> <p> As a rule of thumb, if your app does not have custom volume controls then you should not use these APIs. </p> <h2>What should you do?</h2> <p> To verify that your mobile applications are using these APIs correctly, we recommend that you <a href="https://developers.google.com/admob/android/test-ads">enable test ads</a> and <a href="https://developers.google.com/admob/android/test-creative-types">force load a video test ad</a> in your application. If your app has custom volume controls, the ad’s volume should be at the same level as the custom volume. Otherwise, the ad’s volume should match the device volume. </p> <p> If you have any questions or need additional help, please contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <style> table, th, td { border: 1px solid black; border-collapse: collapse; padding:10px; } </style> <p> The volume control APIs provided by the Google Mobile Ads SDK are intended to mirror your app’s own <em>custom volume controls</em>. Utilizing these APIs ensures that the user receives video ads with the expected audio volume. </p> <p> We’ll talk about some best practices implementing the volume control APIs in your <a href="https://developers.google.com/admob/ios/global-settings#video_ad_volume_control">iOS</a>, <a href="https://developers.google.com/admob/android/global-settings#video_ad_volume_control">Android</a> or <a href="https://developers.google.com/admob/unity/global-settings#video_ad_volume_control">Unity</a> project. </p> <h2>Why are we mentioning this?</h2> <p> Publishers can lose revenue when using these APIs to lower or mute the volume of the Google Mobile Ads SDK. Two issues we have commonly seen: </p><ol> <li>Apps are using their own custom volume controls not sending the app’s accurate volume to the Google Mobile Ads SDK, but always sending zero <li>App are just muting the SDK</li></ol> <p> Some apps have close to a 100% mute rate which doesn’t sound correct (pun intended). Setting application volume to zero or muting the application reduces video ad eligibility, which as a result may reduce your app’s ad revenue. </p> <h2>Volume control APIs</h2> <p> The Google Mobile Ads SDK offers two <a href="https://developers.google.com/admob/ios/global-settings">volume control APIs</a>: setting the volume and toggling mute. These APIs are applicable to App Open, Banner, Interstitial, Rewarded and Rewarded Interstitial ad formats. For Native ads, use <code><a href="https://developers.google.com/admob/ios/api/reference/Classes/GADVideoOptions">GADVideoOptions</a></code>. <h4>Setting application volume on each platform</h4> <table> <tr> <td>iOS </td> <td><code>GADMobileAds.sharedInstance().applicationVolume = 1.0</code> </td> </tr> <tr> <td>Android </td> <td><code>MobileAds.setAppVolume(1.0f)</code> </td> </tr> <tr> <td>Unity </td> <td><code>MobileAds.SetApplicationVolume(1.0f)</code> </td> </tr> </table> <p> Use <code>applicationVolume</code> to set your custom volume <em>relative</em> to the device volume. The range can be from 0.0 (silent) to 1.0 (current device volume). For example, if the device volume level was at half level and the user set your app’s custom volume to max level, set the <code>applicationVolume</code> to <code>1.0</code> and the user will receive an ad with the volume at half level. </p> <h4>Setting application mute on each platform </h4> <table> <tr> <td>iOS </td> <td><code>GADMobileAds.sharedInstance().applicationMuted = true</code> </td> </tr> <tr> <td>Android </td> <td><code>MobileAds.setAppMuted(true)</code> </td> </tr> <tr> <td>Unity </td> <td><code>MobileAds.SetApplicationMuted(true)</code> </td> </tr> </table> <p> Use <code>applicationMuted</code> if your custom volume controls include a mute button. Only toggle <code>applicationMuted</code> if the user selects your custom mute button. For example, if the user adjusts your custom volume to 0 you do not need to call <code>applicationMuted</code>; just call <code>applicationVolume = 0.0</code>. </p> <h4>Setting mute for native ads on each platform</h4> <table> <tr> <td>iOS </td> <td> <pre class="prettyprint">let videoOptions = GADVideoOptions() videoOptions.startMuted = true adLoader = GADAdLoader( adUnitID: "AD_UNIT_ID", rootViewController: self, adTypes: [ ... ad type constants ... ], options: [videoOptions])</pre> </td> </tr> <tr> <td>Android </td> <td> <pre class="prettyprint">val videoOptions = VideoOptions.Builder() .setStartMuted(false) .build() val adOptions = NativeAdOptions.Builder() .setVideoOptions(videoOptions) .build() val adLoader = AdLoader.Builder(this, "AD_UNIT_ID") .forNativeAd( ... ) .withNativeAdOptions(adOptions) .build()</pre> </td> </tr> <tr> <td>Unity </td> <td><code>N/A - Native video ads are not supported in Unity.</code> </td> </tr> </table> <p> Use <code>startMuted</code> if your custom volume controls include a mute button. Only toggle <code>startMuted</code> if the user selects your custom mute button. </p> <h2>Best Practices</h2> <p> To use our APIs as intended: </p><ol> <li><code>applicationVolume</code> should be called only when your custom volume control settings are set to reflect the new volume <li><code>applicationMuted</code> or <code>startMuted</code> should only be toggled to <code>true</code> if the user has muted your custom volume</li></ol> <p> As a rule of thumb, if your app does not have custom volume controls then you should not use these APIs. </p> <h2>What should you do?</h2> <p> To verify that your mobile applications are using these APIs correctly, we recommend that you <a href="https://developers.google.com/admob/android/test-ads">enable test ads</a> and <a href="https://developers.google.com/admob/android/test-creative-types">force load a video test ad</a> in your application. If your app has custom volume controls, the ad’s volume should be at the same level as the custom volume. Otherwise, the ad’s volume should match the device volume. </p> <p> If you have any questions or need additional help, please contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Use Mobile Ads SDK Volume APIs Correctly to Maximize Video Ad Revenue&url=http://ads-developers.googleblog.com/2023/02/use-mobile-ads-sdk-volume-apis.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2023/02/use-mobile-ads-sdk-volume-apis.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2023/02/use-mobile-ads-sdk-volume-apis.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/unity' rel='tag'> unity </a> </span> </div> </div> </div> <div class='post' data-id='6329679135378902818' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2023/02/announcing-ios-google-mobile-ads-sdk.html' itemprop='url' title='Announcing iOS Google Mobile Ads SDK Version 10.0.0'> Announcing iOS Google Mobile Ads SDK Version 10.0.0 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, February 2, 2023 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> We are excited to announce the release of our newest version of the Google Mobile Ads SDK. We recommend upgrading as soon as possible to stay up-to-date with our latest features. </p> <h2>Version 10.0.0 Changes</h2> <p> Google Mobile Ads SDK version 10.0.0 introduces a few major changes: </p> <ul> <li>The minimum OS version has been bumped from 11 to 12. Given the high adoption rate of iOS 16, we are continuing the trend of incrementing the minimum support level. Applications can still be built for iOS 11, however, the SDK will not load any ads on iOS 11. <li>Since <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes#Deprecations">bitcode is deprecated in Xcode 14</a>, we have disabled bitcode in the SDK. As a result, this has decreased the download size of our SDK by ~35MB. What this means for you is to integrate with SDK version 10.0.0, you also have to disable bitcode (if you haven’t already) in the build settings of your Xcode project. <li>Ad Manager applications require an app ID upon initialization of the SDK. This also means the key <code>GADIsAppManagerApp</code> will no longer bypass this check. App IDs are added to the <code>Info.plist </code>with a key of <code>GADApplicationIdentifier</code>. See <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start#update_your_infoplist">Update your Info.plist</a> for more details. <li>Ad Manager applications require GoogleAppMeasurement.xcframework as a dependency. If you install the Google Mobile Ads SDK through <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start#cocoapods">CocoaPods</a> or <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start#spm">Swift Package Manager</a>, no additional action is required. If you install frameworks manually, see <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start#manual_download">Manual Download</a> for more details. <li>We also have removed deprecated APIs of various properties and classes. </li> </ul> <p> For the full list of changes, check the <a href="https://developers.google.com/admob/ios/rel-notes">release notes</a>. Check our <a href="https://developers.google.com/admob/ios/migration">migration guide</a> to ensure your mobile apps are ready to upgrade. </p> <h2>SDK Deprecation Reminder</h2> <p> Per the <a href="https://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html">deprecation schedule</a> announced last year, the release of version 10.0.0 means that: </p><ul> <li>iOS Google Mobile Ads SDK versions 8.x.x is officially deprecated, and will sunset in Q2 2024. <li><b style="color: red">Versions 7.x.x and below will sunset sometime in Q2 2023</b>, approximately 60 days following the release of Android Google Mobile Ads SDK major version 22.0.0. </li></ul> <p> As always, if you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> We are excited to announce the release of our newest version of the Google Mobile Ads SDK. We recommend upgrading as soon as possible to stay up-to-date with our latest features. </p> <h2>Version 10.0.0 Changes</h2> <p> Google Mobile Ads SDK version 10.0.0 introduces a few major changes: </p> <ul> <li>The minimum OS version has been bumped from 11 to 12. Given the high adoption rate of iOS 16, we are continuing the trend of incrementing the minimum support level. Applications can still be built for iOS 11, however, the SDK will not load any ads on iOS 11. <li>Since <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes#Deprecations">bitcode is deprecated in Xcode 14</a>, we have disabled bitcode in the SDK. As a result, this has decreased the download size of our SDK by ~35MB. What this means for you is to integrate with SDK version 10.0.0, you also have to disable bitcode (if you haven’t already) in the build settings of your Xcode project. <li>Ad Manager applications require an app ID upon initialization of the SDK. This also means the key <code>GADIsAppManagerApp</code> will no longer bypass this check. App IDs are added to the <code>Info.plist </code>with a key of <code>GADApplicationIdentifier</code>. See <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start#update_your_infoplist">Update your Info.plist</a> for more details. <li>Ad Manager applications require GoogleAppMeasurement.xcframework as a dependency. If you install the Google Mobile Ads SDK through <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start#cocoapods">CocoaPods</a> or <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start#spm">Swift Package Manager</a>, no additional action is required. If you install frameworks manually, see <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start#manual_download">Manual Download</a> for more details. <li>We also have removed deprecated APIs of various properties and classes. </li> </ul> <p> For the full list of changes, check the <a href="https://developers.google.com/admob/ios/rel-notes">release notes</a>. Check our <a href="https://developers.google.com/admob/ios/migration">migration guide</a> to ensure your mobile apps are ready to upgrade. </p> <h2>SDK Deprecation Reminder</h2> <p> Per the <a href="https://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html">deprecation schedule</a> announced last year, the release of version 10.0.0 means that: </p><ul> <li>iOS Google Mobile Ads SDK versions 8.x.x is officially deprecated, and will sunset in Q2 2024. <li><b style="color: red">Versions 7.x.x and below will sunset sometime in Q2 2023</b>, approximately 60 days following the release of Android Google Mobile Ads SDK major version 22.0.0. </li></ul> <p> As always, if you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Announcing iOS Google Mobile Ads SDK Version 10.0.0&url=http://ads-developers.googleblog.com/2023/02/announcing-ios-google-mobile-ads-sdk.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2023/02/announcing-ios-google-mobile-ads-sdk.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2023/02/announcing-ios-google-mobile-ads-sdk.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/deprecation' rel='tag'> deprecation </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='post' data-id='1183503935891998754' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2022/11/swiftui-case-study-presenting-from-view.html' itemprop='url' title='SwiftUI Case Study: Presenting from View Controllers'> SwiftUI Case Study: Presenting from View Controllers </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, November 9, 2022 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> We are happy to announce the release of an iOS <a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/main/Swift/advanced/SwiftUIDemo">sample application</a> that demonstrates how to integrate the Google Mobile Ads SDK into a SwiftUI-based app. This post covers how we implemented full screen ad formats (interstitial, rewarded, rewarded interstitial) in SwiftUI. </p> <p> The Google Mobile Ads SDK relies heavily on the UIKit Framework, depending on UIView or UIViewController for each ad format. For example, the SDK currently presents full screen ads using the following method: </p> <pre class="prettyprint">present(fromRootViewController rootViewController: UIViewController)</pre> <p> In UIKit, ads are typically implemented in a <code>UIViewController</code>, so it is rather trivial to pass in a <code>rootViewController</code> value by simply invoking <code>self</code>. SwiftUI requires us to diverge from this approach, however, because <code>UIViewController</code> cannot be directly referenced in SwiftUI. Since we can’t just pass in <code>self</code> as the root view controller, we needed to achieve a similar result using a SwiftUI-native approach. </p> <h1>Our solution</h1> <p> We created an implementation of the <code><a href="https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable">UIViewControllerRepresentable</a></code> protocol with a <code>UIViewController</code> property. Its one job is to provide access to the <code>UIViewController</code> reference in SwiftUI. <pre class="prettyprint">private struct AdViewControllerRepresentable: UIViewControllerRepresentable { let viewController = UIViewController() func makeUIViewController(context: Context) -> some UIViewController { return viewController } func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {} }</pre> <p> <code>AdViewControllerRepresentable</code> needs to be included as part of the view hierarchy even though it holds no significance to the content on screen. This is because <code><a href="https://developers.google.com/admob/ios/api/reference/Classes/GADInterstitialAd#-canpresentfromrootviewcontroller:error:">canPresent(fromRootViewController:)</a></code> requires the presenting view controller’s <code>window</code> value to not be nil. <pre class="prettyprint">private let adViewControllerRepresentable = AdViewControllerRepresentable() var body: some View { Text("hello, friend.") .font(.largeTitle) // Add the adViewControllerRepresentable to the background so it // does not influence the placement of other views in the view hierarchy. .background { adViewControllerRepresentable .frame(width: .zero, height: .zero) } }</pre> <p> To present the full screen ads in our sample app, we leveraged action events in SwiftUI. </p> <pre class="prettyprint">Button("Watch an ad!") { coordinator.presentAd(from: adViewControllerRepresentable.viewController) }</pre> <p> And our <code>AdCoordinator</code> class does the honor of presenting it from our view controller. </p> <pre class="prettyprint">private class AdCoordinator: NSObject { private var ad: GADInterstitialAd? ... func presentAd(from viewController: UIViewController) { guard let ad = ad else { return print("Ad wasn't ready") } ad.present(fromRootViewController: viewController) } }</pre> <p> And voila! </p> <h1>An alternative option</h1> <p> Instead of creating a <code>UIViewControllerRepresentable</code>, there was always the option to query the <code>rootViewController</code> property from <code>UIWindow</code>. </p> <pre class="prettyprint">UIApplication.shared.windows.first?.rootViewController</pre> <p> We decided against this option for the following reasons: </p><ol> <li>There is the inherent nullability risk to querying an optional array index. <li>The default value of <code>rootViewController</code> is nil. <li>If your app utilizes more than one window, the <code>windows</code> array will have multiple elements and therefore, makes querying the “first” window object unreliable. <li><code>windows</code> on the <code>UIApplication</code> object is deprecated in iOS 15 and <code>UIWindowScene</code> now holds the reference to this property.</li></ol> <h1>Conclusion</h1> <p> We know there is more than one way to cook an egg when it comes to writing code in SwiftUI. For our use case, we chose the most low-code friendly option. If you have any questions, reach out to our <a href="https://groups.google.com/g/google-admob-ads-sdk">developer forum</a>. </p> <p> <a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/main/Swift/advanced/SwiftUIDemo/SwiftUIDemo">Try it out!</a> </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> We are happy to announce the release of an iOS <a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/main/Swift/advanced/SwiftUIDemo">sample application</a> that demonstrates how to integrate the Google Mobile Ads SDK into a SwiftUI-based app. This post covers how we implemented full screen ad formats (interstitial, rewarded, rewarded interstitial) in SwiftUI. </p> <p> The Google Mobile Ads SDK relies heavily on the UIKit Framework, depending on UIView or UIViewController for each ad format. For example, the SDK currently presents full screen ads using the following method: </p> <pre class="prettyprint">present(fromRootViewController rootViewController: UIViewController)</pre> <p> In UIKit, ads are typically implemented in a <code>UIViewController</code>, so it is rather trivial to pass in a <code>rootViewController</code> value by simply invoking <code>self</code>. SwiftUI requires us to diverge from this approach, however, because <code>UIViewController</code> cannot be directly referenced in SwiftUI. Since we can’t just pass in <code>self</code> as the root view controller, we needed to achieve a similar result using a SwiftUI-native approach. </p> <h1>Our solution</h1> <p> We created an implementation of the <code><a href="https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable">UIViewControllerRepresentable</a></code> protocol with a <code>UIViewController</code> property. Its one job is to provide access to the <code>UIViewController</code> reference in SwiftUI. <pre class="prettyprint">private struct AdViewControllerRepresentable: UIViewControllerRepresentable { let viewController = UIViewController() func makeUIViewController(context: Context) -> some UIViewController { return viewController } func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {} }</pre> <p> <code>AdViewControllerRepresentable</code> needs to be included as part of the view hierarchy even though it holds no significance to the content on screen. This is because <code><a href="https://developers.google.com/admob/ios/api/reference/Classes/GADInterstitialAd#-canpresentfromrootviewcontroller:error:">canPresent(fromRootViewController:)</a></code> requires the presenting view controller’s <code>window</code> value to not be nil. <pre class="prettyprint">private let adViewControllerRepresentable = AdViewControllerRepresentable() var body: some View { Text("hello, friend.") .font(.largeTitle) // Add the adViewControllerRepresentable to the background so it // does not influence the placement of other views in the view hierarchy. .background { adViewControllerRepresentable .frame(width: .zero, height: .zero) } }</pre> <p> To present the full screen ads in our sample app, we leveraged action events in SwiftUI. </p> <pre class="prettyprint">Button("Watch an ad!") { coordinator.presentAd(from: adViewControllerRepresentable.viewController) }</pre> <p> And our <code>AdCoordinator</code> class does the honor of presenting it from our view controller. </p> <pre class="prettyprint">private class AdCoordinator: NSObject { private var ad: GADInterstitialAd? ... func presentAd(from viewController: UIViewController) { guard let ad = ad else { return print("Ad wasn't ready") } ad.present(fromRootViewController: viewController) } }</pre> <p> And voila! </p> <h1>An alternative option</h1> <p> Instead of creating a <code>UIViewControllerRepresentable</code>, there was always the option to query the <code>rootViewController</code> property from <code>UIWindow</code>. </p> <pre class="prettyprint">UIApplication.shared.windows.first?.rootViewController</pre> <p> We decided against this option for the following reasons: </p><ol> <li>There is the inherent nullability risk to querying an optional array index. <li>The default value of <code>rootViewController</code> is nil. <li>If your app utilizes more than one window, the <code>windows</code> array will have multiple elements and therefore, makes querying the “first” window object unreliable. <li><code>windows</code> on the <code>UIApplication</code> object is deprecated in iOS 15 and <code>UIWindowScene</code> now holds the reference to this property.</li></ol> <h1>Conclusion</h1> <p> We know there is more than one way to cook an egg when it comes to writing code in SwiftUI. For our use case, we chose the most low-code friendly option. If you have any questions, reach out to our <a href="https://groups.google.com/g/google-admob-ads-sdk">developer forum</a>. </p> <p> <a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/main/Swift/advanced/SwiftUIDemo/SwiftUIDemo">Try it out!</a> </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:SwiftUI Case Study: Presenting from View Controllers&url=http://ads-developers.googleblog.com/2022/11/swiftui-case-study-presenting-from-view.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2022/11/swiftui-case-study-presenting-from-view.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2022/11/swiftui-case-study-presenting-from-view.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/swiftui' rel='tag'> swiftui </a> </span> </div> </div> </div> <div class='post' data-id='96132182073337487' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html' itemprop='url' title='Announcing a deprecation schedule for the Google Mobile Ads SDK'> Announcing a deprecation schedule for the Google Mobile Ads SDK </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, October 5, 2022 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> To provide Google Mobile Ads SDK developers for <a href="https://developers.google.com/admob/">AdMob</a> and <a href="https://developers.google.com/ad-manager/mobile-ads-sdk">Ad Manager</a> more transparency and predictability on the expected lifetime of an SDK version, we are introducing a <a href="https://developers.google.com/admob/android/deprecation">deprecation schedule</a> for the Google Mobile Ads SDKs for Android and iOS. </p> <h2 style="font-size:24px">Benefits</h2> <p> Introducing a predictable deprecation schedule offers the following benefits for app developers and publishers: </p> <ol> <li>Ability to predict and plan for SDK updates with a year of lead time. <li>Legacy SDK code that only exists to support old versions can be deleted, thereby decreasing SDK size and lowering the risk of bugs. <li>Engineering resources are freed up to focus more on support for newer SDKs and innovation of new SDK features.</li> </ol> <h2 style="font-size:24px">Glossary</h2> <p> To understand the deprecation schedule, let’s first align the terms used to describe the state of a Google Mobile Ads SDK version: </p> <table style="border-collapse: collapse; border: none; width=100%;"> <tr style="background-color: #6199df; border-bottom: solid #4d90fe 1px; border-left: solid #4d90fe 1px; border-right: solid #4d90fe 1px; border-top: solid #4d90fe 1px; height: 0px; vertical-align: top;"> <th style="border-bottom: solid #4d90fe 1px; border-left: solid #4d90fe 1px; border-right: solid #4d90fe 1px; border-top: solid #4d90fe 1px; padding: 7px 7px 7px 7px; width: 20%"><span style="color: white; ">SDK State</span></th> <th style="border-bottom: solid #4d90fe 1px; border-left: solid #4d90fe 1px; border-right: solid #4d90fe 1px; border-top: solid #4d90fe 1px; padding: 7px 7px 7px 7px;"><span style="color: white;">Impact</span></th> </tr> <tr> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;">Supported </td> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;"><ul> <li>Ads serve to this SDK. <li>Technical SDK support questions are welcomed on the <a href="https://groups.google.com/g/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>.</li></ul> </td> </tr> <tr> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;">Deprecated </td> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;"><ul> <li>Ads will still serve to this SDK. <li>Support questions specific to this SDK version are no longer answered on the <a href="https://groups.google.com/g/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>. Users will be asked to validate the issue in a supported SDK version to receive full support.</li></ul> </td> </tr> <tr> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;">Sunset </td> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;"><ul> <li>Ads will not serve to this SDK. <li>Ad requests return a no fill with an error indicating that this version is sunset.</li></ul> </td> </tr> </table> <p></p> <h2 style="font-size:24px">Timelines</h2> <p> The deprecation and sunset timelines will revolve around major SDK version releases. We plan to do a major version release annually, in the first quarter of each year. The release of a new major version on both Android and iOS will trigger changes in SDK state for older major versions on both platforms. </p> <p> Once we release a new major version N for both Android and iOS: </p> <ul> <li>All SDK versions with major version N-2 on their respective platforms are considered deprecated immediately. Questions specific to these versions will no longer receive support. <li>All SDKs versions with major version N-3 on their respective platforms will sunset after 2 months. <ul> <li>We will publish subsequent blog posts communicating specific sunset dates to activate this two-month sunset period. The first sunset announcement is expected in Q1 2023 with a sunset date in Q2 2023.</li> </ul> </li> </ul> <p> With this schedule, a new major version will live in the supported state for about 2 years, and in the deprecated state for an additional year before moving to the sunset state. </p> <p> The graphic below helps visualize the schedule: </p> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-R_xhrnPHrsSzLm5zoEdwUD1k9OxMYZVFaeJub9FWDdbfYptY-Sj9bhmzBoyJaPyjdb1b52qtfmjEEYKHm7BZOBKzSSOCTAA-aH8UNEHMta6KvgTRJvMAZY7Ig2U5EbsjXm-aA-b2OPmpja0PKlwCXeI4MDyG15yDE7CcsMXAdbdswhMPvF-vIz2b/s2988/deprecation_theory.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="710" data-original-width="2988" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-R_xhrnPHrsSzLm5zoEdwUD1k9OxMYZVFaeJub9FWDdbfYptY-Sj9bhmzBoyJaPyjdb1b52qtfmjEEYKHm7BZOBKzSSOCTAA-aH8UNEHMta6KvgTRJvMAZY7Ig2U5EbsjXm-aA-b2OPmpja0PKlwCXeI4MDyG15yDE7CcsMXAdbdswhMPvF-vIz2b/s600/deprecation_theory.png" width="600"/></a></div> <h2 style="font-size:24px">How does the change apply to existing versions?</h2> <p> <strong>Effective today, Android v19 and iOS v7 versions are considered deprecated. </strong>In accordance with the schedule above,<strong> we plan to sunset Android v19 and iOS v7 versions in Q2 2023</strong> following the releases of Android v22 and iOS v9 planned for Q1 2023. We will provide more specific sunset dates following the releases of Android v22 and iOS v9. </p> <p> The graphic below helps visualize the state of existing Google Mobile Ads SDK versions for Android and iOS with today’s announcement. </p> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZw_7h8prGjcOqQDEjZKgACVuMOSHP9PT3F3WAgeumQgBNz-P3-kRFceTjgJU-wnlCYmAn1uaJU1gUu1-RcgNpiUHjgLJ8XIexaSV4UNFb6xjtLOb4oIY7BrhCNCa5aoDqrgmuj_foBrtYAZs1WlL5eYWpVNnkrougoXdBlMl0Y5R_35FMAtPRUImo/s3062/deprecation_old_versions.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1278" data-original-width="3062" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZw_7h8prGjcOqQDEjZKgACVuMOSHP9PT3F3WAgeumQgBNz-P3-kRFceTjgJU-wnlCYmAn1uaJU1gUu1-RcgNpiUHjgLJ8XIexaSV4UNFb6xjtLOb4oIY7BrhCNCa5aoDqrgmuj_foBrtYAZs1WlL5eYWpVNnkrougoXdBlMl0Y5R_35FMAtPRUImo/s600/deprecation_old_versions.png" style="margin:0" width="600"/></a></div> <span> <em>Note: Versions 6.x.x and below for both Android and iOS have been sunset since 2018.</em> </span> <p></p> <h2 style="font-size:24px">Exceptions</h2> <p> The deprecation schedule provides a framework for predictable lifetimes for an SDK version. However, there may be exceptions in the future. This schedule does not preclude us from sunsetting an SDK version at an earlier date, but we are committed to providing proactive communication with ample lead time for any future changes. </p> <h2 style="font-size:24px">Next Steps</h2> <ol> <li>Refer to the deprecation developer pages (<a href="https://developers.google.com/admob/android/deprecation">Android</a> | <a href="https://developers.google.com/admob/ios/deprecation">iOS</a>) for the latest updates to the deprecation schedule. If you are on a deprecated version, see the <a href="https://developers.google.com/admob/android/migration">Android migration guide</a> or <a href="https://developers.google.com/admob/ios/migration">iOS migration guide</a> for more information on how to update. <li>Stay tuned for future updates to this blog, where more specific sunset dates will be communicated once new major Google Mobile Ads SDK versions are released.</li> </ol> <p> If you have any questions about this announcement, please reach out to us on the <a href="https://groups.google.com/group/google-admob-ads-sdk">Google Mobile Ads SDK Developer Forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=40" style="vertical-align:middle; border:none;" width="40"> - Eric Leichtenschlag, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> To provide Google Mobile Ads SDK developers for <a href="https://developers.google.com/admob/">AdMob</a> and <a href="https://developers.google.com/ad-manager/mobile-ads-sdk">Ad Manager</a> more transparency and predictability on the expected lifetime of an SDK version, we are introducing a <a href="https://developers.google.com/admob/android/deprecation">deprecation schedule</a> for the Google Mobile Ads SDKs for Android and iOS. </p> <h2 style="font-size:24px">Benefits</h2> <p> Introducing a predictable deprecation schedule offers the following benefits for app developers and publishers: </p> <ol> <li>Ability to predict and plan for SDK updates with a year of lead time. <li>Legacy SDK code that only exists to support old versions can be deleted, thereby decreasing SDK size and lowering the risk of bugs. <li>Engineering resources are freed up to focus more on support for newer SDKs and innovation of new SDK features.</li> </ol> <h2 style="font-size:24px">Glossary</h2> <p> To understand the deprecation schedule, let’s first align the terms used to describe the state of a Google Mobile Ads SDK version: </p> <table style="border-collapse: collapse; border: none; width=100%;"> <tr style="background-color: #6199df; border-bottom: solid #4d90fe 1px; border-left: solid #4d90fe 1px; border-right: solid #4d90fe 1px; border-top: solid #4d90fe 1px; height: 0px; vertical-align: top;"> <th style="border-bottom: solid #4d90fe 1px; border-left: solid #4d90fe 1px; border-right: solid #4d90fe 1px; border-top: solid #4d90fe 1px; padding: 7px 7px 7px 7px; width: 20%"><span style="color: white; ">SDK State</span></th> <th style="border-bottom: solid #4d90fe 1px; border-left: solid #4d90fe 1px; border-right: solid #4d90fe 1px; border-top: solid #4d90fe 1px; padding: 7px 7px 7px 7px;"><span style="color: white;">Impact</span></th> </tr> <tr> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;">Supported </td> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;"><ul> <li>Ads serve to this SDK. <li>Technical SDK support questions are welcomed on the <a href="https://groups.google.com/g/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>.</li></ul> </td> </tr> <tr> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;">Deprecated </td> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;"><ul> <li>Ads will still serve to this SDK. <li>Support questions specific to this SDK version are no longer answered on the <a href="https://groups.google.com/g/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>. Users will be asked to validate the issue in a supported SDK version to receive full support.</li></ul> </td> </tr> <tr> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;">Sunset </td> <td style="border-bottom: solid #bbbbbb 1px; border-left: solid #bbbbbb 1px; border-right: solid #bbbbbb 1px; border-top: solid #bbbbbb 1px; padding: 7px 7px 7px 7px; vertical-align: middle;"><ul> <li>Ads will not serve to this SDK. <li>Ad requests return a no fill with an error indicating that this version is sunset.</li></ul> </td> </tr> </table> <p></p> <h2 style="font-size:24px">Timelines</h2> <p> The deprecation and sunset timelines will revolve around major SDK version releases. We plan to do a major version release annually, in the first quarter of each year. The release of a new major version on both Android and iOS will trigger changes in SDK state for older major versions on both platforms. </p> <p> Once we release a new major version N for both Android and iOS: </p> <ul> <li>All SDK versions with major version N-2 on their respective platforms are considered deprecated immediately. Questions specific to these versions will no longer receive support. <li>All SDKs versions with major version N-3 on their respective platforms will sunset after 2 months. <ul> <li>We will publish subsequent blog posts communicating specific sunset dates to activate this two-month sunset period. The first sunset announcement is expected in Q1 2023 with a sunset date in Q2 2023.</li> </ul> </li> </ul> <p> With this schedule, a new major version will live in the supported state for about 2 years, and in the deprecated state for an additional year before moving to the sunset state. </p> <p> The graphic below helps visualize the schedule: </p> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-R_xhrnPHrsSzLm5zoEdwUD1k9OxMYZVFaeJub9FWDdbfYptY-Sj9bhmzBoyJaPyjdb1b52qtfmjEEYKHm7BZOBKzSSOCTAA-aH8UNEHMta6KvgTRJvMAZY7Ig2U5EbsjXm-aA-b2OPmpja0PKlwCXeI4MDyG15yDE7CcsMXAdbdswhMPvF-vIz2b/s2988/deprecation_theory.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="710" data-original-width="2988" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-R_xhrnPHrsSzLm5zoEdwUD1k9OxMYZVFaeJub9FWDdbfYptY-Sj9bhmzBoyJaPyjdb1b52qtfmjEEYKHm7BZOBKzSSOCTAA-aH8UNEHMta6KvgTRJvMAZY7Ig2U5EbsjXm-aA-b2OPmpja0PKlwCXeI4MDyG15yDE7CcsMXAdbdswhMPvF-vIz2b/s600/deprecation_theory.png" width="600"/></a></div> <h2 style="font-size:24px">How does the change apply to existing versions?</h2> <p> <strong>Effective today, Android v19 and iOS v7 versions are considered deprecated. </strong>In accordance with the schedule above,<strong> we plan to sunset Android v19 and iOS v7 versions in Q2 2023</strong> following the releases of Android v22 and iOS v9 planned for Q1 2023. We will provide more specific sunset dates following the releases of Android v22 and iOS v9. </p> <p> The graphic below helps visualize the state of existing Google Mobile Ads SDK versions for Android and iOS with today’s announcement. </p> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZw_7h8prGjcOqQDEjZKgACVuMOSHP9PT3F3WAgeumQgBNz-P3-kRFceTjgJU-wnlCYmAn1uaJU1gUu1-RcgNpiUHjgLJ8XIexaSV4UNFb6xjtLOb4oIY7BrhCNCa5aoDqrgmuj_foBrtYAZs1WlL5eYWpVNnkrougoXdBlMl0Y5R_35FMAtPRUImo/s3062/deprecation_old_versions.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1278" data-original-width="3062" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZw_7h8prGjcOqQDEjZKgACVuMOSHP9PT3F3WAgeumQgBNz-P3-kRFceTjgJU-wnlCYmAn1uaJU1gUu1-RcgNpiUHjgLJ8XIexaSV4UNFb6xjtLOb4oIY7BrhCNCa5aoDqrgmuj_foBrtYAZs1WlL5eYWpVNnkrougoXdBlMl0Y5R_35FMAtPRUImo/s600/deprecation_old_versions.png" style="margin:0" width="600"/></a></div> <span> <em>Note: Versions 6.x.x and below for both Android and iOS have been sunset since 2018.</em> </span> <p></p> <h2 style="font-size:24px">Exceptions</h2> <p> The deprecation schedule provides a framework for predictable lifetimes for an SDK version. However, there may be exceptions in the future. This schedule does not preclude us from sunsetting an SDK version at an earlier date, but we are committed to providing proactive communication with ample lead time for any future changes. </p> <h2 style="font-size:24px">Next Steps</h2> <ol> <li>Refer to the deprecation developer pages (<a href="https://developers.google.com/admob/android/deprecation">Android</a> | <a href="https://developers.google.com/admob/ios/deprecation">iOS</a>) for the latest updates to the deprecation schedule. If you are on a deprecated version, see the <a href="https://developers.google.com/admob/android/migration">Android migration guide</a> or <a href="https://developers.google.com/admob/ios/migration">iOS migration guide</a> for more information on how to update. <li>Stay tuned for future updates to this blog, where more specific sunset dates will be communicated once new major Google Mobile Ads SDK versions are released.</li> </ol> <p> If you have any questions about this announcement, please reach out to us on the <a href="https://groups.google.com/group/google-admob-ads-sdk">Google Mobile Ads SDK Developer Forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=40" style="vertical-align:middle; border:none;" width="40"> - Eric Leichtenschlag, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Announcing a deprecation schedule for the Google Mobile Ads SDK&url=http://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2022/10/announcing-deprecation-schedule-for.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/deprecation' rel='tag'> deprecation </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/iOS' rel='tag'> iOS </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/sunset' rel='tag'> sunset </a> </span> </div> </div> </div> <div class='post' data-id='6021819802112141583' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2022/07/use-new-google-mobile-ads-sdk.html' itemprop='url' title='Use the new Google Mobile Ads SDK getVersion() method'> Use the new Google Mobile Ads SDK getVersion() method </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, July 18, 2022 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> We heard your feedback that <code>MobileAds.getVersionString()</code> was confusing as it didn’t match the external version. We addressed it by adding a new method - <code><a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#getVersion()">MobileAds.getVersion()</a></code>. In doing so, we have deprecated <code>MobileAds.getVersionString(). </code> </p> <p> <strong> Distinctions between <em>getVersionString()</em> and <em>getVersion() </em></strong> </p> <style> td { text-align: center; } </style> <table border=1 style="width:100%"> <tr> <th> </th> <th>getVersionString() [deprecated] </th> <th>getVersion() </th> </tr> <tr> <td><strong>Sample return value</strong> </td> <td><code>afma-sdk-a-v214106000.214106000.0</code> </td> <td><code>21.0.0</code> </td> </tr> <tr> <td><strong>Requires calling <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#initialize(android.content.Context,%20com.google.android.gms.ads.initialization.OnInitializationCompleteListener)">initialize()</a> first?</strong> </td> <td>Yes </td> <td>No </td> </tr> </table> </center> <p> Calling <code>MobileAds.getVersionString()</code> returns an internal version number. The <code>MobileAds.getVersion()</code> method outputs a simplified, external version number that matches the version in the <a href="https://www.google.com/url?q=https://developers.google.com/admob/android/rel-notes&sa=D&source=docs&ust=1656450071938158&usg=AOvVaw0FrY709N3AQ6MyzpAnTMFh">release notes</a>. For example, <code>21.0.0</code>. </p> <p> Also as part of the v21.0.0 release, you can call <code>MobileAds.getVersion()</code> before calling <code><a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#initialize(android.content.Context,%20com.google.android.gms.ads.initialization.OnInitializationCompleteListener)">MobileAds.initialize()</a></code>. Previously, you had to initialize the SDK to query the SDK version number, or else the app would crash. <p> Querying the SDK version number can be accomplished in your Android apps with the following code snippet: </p> <pre class="prettyprint">// Log the Mobile Ads SDK Version. Log.d("MyApp", MobileAds.getVersion()); // "21.0.0" // Initialize the SDK. MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus status) {} });</pre> <p> For the full list of changes in the v21.0.0 release, check the <a href="https://developers.google.com/admob/android/rel-notes#21.0.0">release notes</a>. If you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> We heard your feedback that <code>MobileAds.getVersionString()</code> was confusing as it didn’t match the external version. We addressed it by adding a new method - <code><a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#getVersion()">MobileAds.getVersion()</a></code>. In doing so, we have deprecated <code>MobileAds.getVersionString(). </code> </p> <p> <strong> Distinctions between <em>getVersionString()</em> and <em>getVersion() </em></strong> </p> <style> td { text-align: center; } </style> <table border=1 style="width:100%"> <tr> <th> </th> <th>getVersionString() [deprecated] </th> <th>getVersion() </th> </tr> <tr> <td><strong>Sample return value</strong> </td> <td><code>afma-sdk-a-v214106000.214106000.0</code> </td> <td><code>21.0.0</code> </td> </tr> <tr> <td><strong>Requires calling <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#initialize(android.content.Context,%20com.google.android.gms.ads.initialization.OnInitializationCompleteListener)">initialize()</a> first?</strong> </td> <td>Yes </td> <td>No </td> </tr> </table> </center> <p> Calling <code>MobileAds.getVersionString()</code> returns an internal version number. The <code>MobileAds.getVersion()</code> method outputs a simplified, external version number that matches the version in the <a href="https://www.google.com/url?q=https://developers.google.com/admob/android/rel-notes&sa=D&source=docs&ust=1656450071938158&usg=AOvVaw0FrY709N3AQ6MyzpAnTMFh">release notes</a>. For example, <code>21.0.0</code>. </p> <p> Also as part of the v21.0.0 release, you can call <code>MobileAds.getVersion()</code> before calling <code><a href="https://developers.google.com/android/reference/com/google/android/gms/ads/MobileAds#initialize(android.content.Context,%20com.google.android.gms.ads.initialization.OnInitializationCompleteListener)">MobileAds.initialize()</a></code>. Previously, you had to initialize the SDK to query the SDK version number, or else the app would crash. <p> Querying the SDK version number can be accomplished in your Android apps with the following code snippet: </p> <pre class="prettyprint">// Log the Mobile Ads SDK Version. Log.d("MyApp", MobileAds.getVersion()); // "21.0.0" // Initialize the SDK. MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus status) {} });</pre> <p> For the full list of changes in the v21.0.0 release, check the <a href="https://developers.google.com/admob/android/rel-notes#21.0.0">release notes</a>. If you have any questions or need additional help, contact us via the <a href="https://groups.google.com/group/google-admob-ads-sdk">forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AOh14GjtsQZdIExmcjrR581d0QKQR_WB3m0ETlK1hUK5=s88-w88-h88-c-k?sz=40" style="vertical-align:middle; border:none;" width="40"> - Justin Malandruccolo, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Use the new Google Mobile Ads SDK getVersion() method&url=http://ads-developers.googleblog.com/2022/07/use-new-google-mobile-ads-sdk.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2022/07/use-new-google-mobile-ads-sdk.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2022/07/use-new-google-mobile-ads-sdk.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='post' data-id='6942401793737082826' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2020/10/introducing-ad-placements-for-google.html' itemprop='url' title='Introducing Ad Placements for the Google Mobile Ads Unity plugin'> Introducing Ad Placements for the Google Mobile Ads Unity plugin </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, October 6, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> We’re excited to announce a new feature for app developers who use Unity: <strong>Ad Placements.</strong> It is now available in <a href="https://developers.google.com/admob/unity/ad-placements">Open Beta</a>. </p> <p> <strong>What are Ad Placements?</strong> </p> <p> Ad Placements provide a cleaner and more intuitive way to place ad units from Google AdMob in your games. Ad Placements allow developers to add ad units with a Unity Editor interface, making the specification of ad units for your game centralized, re-usable, and decoupled from your scripts. </p> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPYjYEmvSn3MoR_IjNk9Prbw1SEgqcPeYuZJi78vEtDFBQroiPYJN-oIMOYWKgG16SuKpXQyQdbyP8fg07lD0OcWT-o3-zIKtSdTh5H5KKHj6oNfXsIhoWNrDDLk5afcwv7HNc9IqeNHI/s1462/placements_editor.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1462" data-original-width="676" height="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPYjYEmvSn3MoR_IjNk9Prbw1SEgqcPeYuZJi78vEtDFBQroiPYJN-oIMOYWKgG16SuKpXQyQdbyP8fg07lD0OcWT-o3-zIKtSdTh5H5KKHj6oNfXsIhoWNrDDLk5afcwv7HNc9IqeNHI/s600/placements_editor.png"/></a></div> <p> You can then create Ad GameObjects that reference these Ad Placements entirely from the Unity Editor, which means no need for additional scripts! </p> <p> Developers don’t need to <a href="https://developers.google.com/admob/unity/banner/adaptive#code_example">write code</a> to manage the ad unit. Callback functions and ad unit creation are all managed directly in the Unity UI. </p> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj77P491tUn7izER7in7OU93G_mOmDSZmtgiwNE4pCDBWvZorzZWnQ0t3KaDHsYpCcMZYmEjLYuJvaGynbn9rKQMgYHYbjDYskZMOoaUfxbVwfMECApvYNEhY4gxoqdteGxwJgAGNNirY/s1462/banner_editor.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1462" data-original-width="676" height="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj77P491tUn7izER7in7OU93G_mOmDSZmtgiwNE4pCDBWvZorzZWnQ0t3KaDHsYpCcMZYmEjLYuJvaGynbn9rKQMgYHYbjDYskZMOoaUfxbVwfMECApvYNEhY4gxoqdteGxwJgAGNNirY/s600/banner_editor.png"/></a></div> <p> <strong>Why use Ad Placements?</strong> </p> <p> We’ve developed Ad Placements to help address the feedback that many of you have shared, which is integrating the Google Mobile Ads Unity plugin APIs requires too much scripting. Now with Ad Placements and their associated Ad GameObjects, implementing Google Mobile Ads into your Unity games should be a lot easier and more intuitive. You can add placements, load ads and show them all from easy-to-use Unity Editor integrations. With this new UI-driven approach, we can help you insert ad placements into your game with almost no additional code. </p> <p> <strong>How do I get started?</strong> </p> <p> See the <a href="https://developers.google.com/admob/unity/ad-placements">Ad Placement documentation</a> for a download link to the early access build and instructions to help you get started. </p> <p> As always, please reach out on our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">developer forum</a> if you have any questions. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AAuE7mDYk-xi7aUv1XR9jrXS5ysT32Ll4zfahlOO_qZlGA=s120-p-rw-no?sz=40" style="vertical-align:middle; border:none;" width="40"> - Samuel Stow, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> We’re excited to announce a new feature for app developers who use Unity: <strong>Ad Placements.</strong> It is now available in <a href="https://developers.google.com/admob/unity/ad-placements">Open Beta</a>. </p> <p> <strong>What are Ad Placements?</strong> </p> <p> Ad Placements provide a cleaner and more intuitive way to place ad units from Google AdMob in your games. Ad Placements allow developers to add ad units with a Unity Editor interface, making the specification of ad units for your game centralized, re-usable, and decoupled from your scripts. </p> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPYjYEmvSn3MoR_IjNk9Prbw1SEgqcPeYuZJi78vEtDFBQroiPYJN-oIMOYWKgG16SuKpXQyQdbyP8fg07lD0OcWT-o3-zIKtSdTh5H5KKHj6oNfXsIhoWNrDDLk5afcwv7HNc9IqeNHI/s1462/placements_editor.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1462" data-original-width="676" height="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPYjYEmvSn3MoR_IjNk9Prbw1SEgqcPeYuZJi78vEtDFBQroiPYJN-oIMOYWKgG16SuKpXQyQdbyP8fg07lD0OcWT-o3-zIKtSdTh5H5KKHj6oNfXsIhoWNrDDLk5afcwv7HNc9IqeNHI/s600/placements_editor.png"/></a></div> <p> You can then create Ad GameObjects that reference these Ad Placements entirely from the Unity Editor, which means no need for additional scripts! </p> <p> Developers don’t need to <a href="https://developers.google.com/admob/unity/banner/adaptive#code_example">write code</a> to manage the ad unit. Callback functions and ad unit creation are all managed directly in the Unity UI. </p> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj77P491tUn7izER7in7OU93G_mOmDSZmtgiwNE4pCDBWvZorzZWnQ0t3KaDHsYpCcMZYmEjLYuJvaGynbn9rKQMgYHYbjDYskZMOoaUfxbVwfMECApvYNEhY4gxoqdteGxwJgAGNNirY/s1462/banner_editor.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1462" data-original-width="676" height="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj77P491tUn7izER7in7OU93G_mOmDSZmtgiwNE4pCDBWvZorzZWnQ0t3KaDHsYpCcMZYmEjLYuJvaGynbn9rKQMgYHYbjDYskZMOoaUfxbVwfMECApvYNEhY4gxoqdteGxwJgAGNNirY/s600/banner_editor.png"/></a></div> <p> <strong>Why use Ad Placements?</strong> </p> <p> We’ve developed Ad Placements to help address the feedback that many of you have shared, which is integrating the Google Mobile Ads Unity plugin APIs requires too much scripting. Now with Ad Placements and their associated Ad GameObjects, implementing Google Mobile Ads into your Unity games should be a lot easier and more intuitive. You can add placements, load ads and show them all from easy-to-use Unity Editor integrations. With this new UI-driven approach, we can help you insert ad placements into your game with almost no additional code. </p> <p> <strong>How do I get started?</strong> </p> <p> See the <a href="https://developers.google.com/admob/unity/ad-placements">Ad Placement documentation</a> for a download link to the early access build and instructions to help you get started. </p> <p> As always, please reach out on our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">developer forum</a> if you have any questions. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AAuE7mDYk-xi7aUv1XR9jrXS5ysT32Ll4zfahlOO_qZlGA=s120-p-rw-no?sz=40" style="vertical-align:middle; border:none;" width="40"> - Samuel Stow, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Introducing Ad Placements for the Google Mobile Ads Unity plugin&url=http://ads-developers.googleblog.com/2020/10/introducing-ad-placements-for-google.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2020/10/introducing-ad-placements-for-google.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2020/10/introducing-ad-placements-for-google.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/unity' rel='tag'> unity </a> </span> </div> </div> </div> <div class='post' data-id='7372360342690454107' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2020/05/reviewing-ad-issues-in-mobile-apps-with.html' itemprop='url' title='Reviewing ad issues in mobile apps with the Google Mobile Ads SDK'> Reviewing ad issues in mobile apps with the Google Mobile Ads SDK </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, May 19, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> In order to help mobile app publishers review ad issues (e.g., out-of-memory caused by graphic intense creatives, violations of <a href="https://support.google.com/admanager/answer/9158227?hl=en">Ad Manager policies</a>, or <a href="https://support.google.com/admob/answer/6128543?hl=en">AdMob policies and restrictions</a>) in production apps, we have recently added an ad response ID to the <code><a href="https://developers.google.com/admob/android/response-info">ResponseInfo</a></code> and <code><a href="https://developers.google.com/admob/ios/response-info">GADResponseInfo</a></code> objects in the Google Mobile Ads Android SDK (v. 19.0.0) and iOS SDK (v. 7.49.0). An ad response ID is a unique string for each ad response from the AdMob or Ad Manager server, regardless of ad formats. If the same ad is returned more than once, the ad response ID will differ each time. <p> You can look up an ad response ID in the Ad Review Center (<a href="https://support.google.com/admob/answer/3500252?hl=en&ref_topic=3052991">AdMob</a>, <a href="https://support.google.com/admanager/answer/173120?hl=en&ref_topic=4581206">Ad Manager</a>) to find and block the offending ad. You can also report problematic ads to Google using the ad response ID, especially when it is difficult to <a href="https://support.google.com/admanager/answer/6161675?hl=en">capture a mobile ad's click string</a>. </p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhavrCqkL5_BxZgrBgqae3lY8lY7SSpEV1WpN3iBS3bkvHeMojXCsG5VI0ubrBq2mmAR0_oB5mlu3HjLdoOwHBwiz1BCbcefO-K3eCVO7M2XysGP1WNZAJ3I_AqoHaryHmUyFI572hI0mU/s1600/blog_ss.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1017" data-original-width="1600" height="407" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhavrCqkL5_BxZgrBgqae3lY8lY7SSpEV1WpN3iBS3bkvHeMojXCsG5VI0ubrBq2mmAR0_oB5mlu3HjLdoOwHBwiz1BCbcefO-K3eCVO7M2XysGP1WNZAJ3I_AqoHaryHmUyFI572hI0mU/s640/blog_ss.png" width="640" /></a></div> <p> The screenshot above shows an ad response ID in Android Studio logcat. </p> <p> If you use Firebase, you can refer to the Firebase Crashlytics Android (<a href="https://developers.google.com/admob/android/crashlytics">AdMob</a>, <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/android/crashlytics">Ad Manager</a>) or iOS (<a href="https://developers.google.com/admob/ios/crashlytics">AdMob</a>, <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/crashlytics">Ad Manager</a>) guide for logging the ad response ID. This technique can be useful for debugging production app crashes as you would have both the SDK symbols and the ad response ID data in the same log. </p> <p> We hope this new feature makes it easier to troubleshoot ad issues. </p> <p> If you would like to give us feedback on this feature, please post your comments and questions on our Google Mobile Ads SDK <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">Technical Forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/pw/ACtC-3enpQHjn8Y-5o9TXXmx8fbrjAOGhzk7s8c2lZGJGOydaRRSqTTLWN1FW6JeV9s6zUiYLNsJp9wU147hzNYwDIneUZyiz9BqkTZTA69QY_2YuIDRf_t6H79tn4csik8Cqm1XwvnYJdol4h6EH-PTFOvBJA=s600-no?authuser=0" style="vertical-align:middle; border:none;" width="40"> - Thang Duong, Mobile Ads Developer Relation</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> In order to help mobile app publishers review ad issues (e.g., out-of-memory caused by graphic intense creatives, violations of <a href="https://support.google.com/admanager/answer/9158227?hl=en">Ad Manager policies</a>, or <a href="https://support.google.com/admob/answer/6128543?hl=en">AdMob policies and restrictions</a>) in production apps, we have recently added an ad response ID to the <code><a href="https://developers.google.com/admob/android/response-info">ResponseInfo</a></code> and <code><a href="https://developers.google.com/admob/ios/response-info">GADResponseInfo</a></code> objects in the Google Mobile Ads Android SDK (v. 19.0.0) and iOS SDK (v. 7.49.0). An ad response ID is a unique string for each ad response from the AdMob or Ad Manager server, regardless of ad formats. If the same ad is returned more than once, the ad response ID will differ each time. <p> You can look up an ad response ID in the Ad Review Center (<a href="https://support.google.com/admob/answer/3500252?hl=en&ref_topic=3052991">AdMob</a>, <a href="https://support.google.com/admanager/answer/173120?hl=en&ref_topic=4581206">Ad Manager</a>) to find and block the offending ad. You can also report problematic ads to Google using the ad response ID, especially when it is difficult to <a href="https://support.google.com/admanager/answer/6161675?hl=en">capture a mobile ad's click string</a>. </p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhavrCqkL5_BxZgrBgqae3lY8lY7SSpEV1WpN3iBS3bkvHeMojXCsG5VI0ubrBq2mmAR0_oB5mlu3HjLdoOwHBwiz1BCbcefO-K3eCVO7M2XysGP1WNZAJ3I_AqoHaryHmUyFI572hI0mU/s1600/blog_ss.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1017" data-original-width="1600" height="407" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhavrCqkL5_BxZgrBgqae3lY8lY7SSpEV1WpN3iBS3bkvHeMojXCsG5VI0ubrBq2mmAR0_oB5mlu3HjLdoOwHBwiz1BCbcefO-K3eCVO7M2XysGP1WNZAJ3I_AqoHaryHmUyFI572hI0mU/s640/blog_ss.png" width="640" /></a></div> <p> The screenshot above shows an ad response ID in Android Studio logcat. </p> <p> If you use Firebase, you can refer to the Firebase Crashlytics Android (<a href="https://developers.google.com/admob/android/crashlytics">AdMob</a>, <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/android/crashlytics">Ad Manager</a>) or iOS (<a href="https://developers.google.com/admob/ios/crashlytics">AdMob</a>, <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/crashlytics">Ad Manager</a>) guide for logging the ad response ID. This technique can be useful for debugging production app crashes as you would have both the SDK symbols and the ad response ID data in the same log. </p> <p> We hope this new feature makes it easier to troubleshoot ad issues. </p> <p> If you would like to give us feedback on this feature, please post your comments and questions on our Google Mobile Ads SDK <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">Technical Forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/pw/ACtC-3enpQHjn8Y-5o9TXXmx8fbrjAOGhzk7s8c2lZGJGOydaRRSqTTLWN1FW6JeV9s6zUiYLNsJp9wU147hzNYwDIneUZyiz9BqkTZTA69QY_2YuIDRf_t6H79tn4csik8Cqm1XwvnYJdol4h6EH-PTFOvBJA=s600-no?authuser=0" style="vertical-align:middle; border:none;" width="40"> - Thang Duong, Mobile Ads Developer Relation</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Reviewing ad issues in mobile apps with the Google Mobile Ads SDK&url=http://ads-developers.googleblog.com/2020/05/reviewing-ad-issues-in-mobile-apps-with.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2020/05/reviewing-ad-issues-in-mobile-apps-with.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2020/05/reviewing-ad-issues-in-mobile-apps-with.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/firebase' rel='tag'> firebase </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='post' data-id='9189706348145824973' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2019/11/introducing-adaptive-anchor-banners.html' itemprop='url' title='Introducing adaptive anchor banners'> Introducing adaptive anchor banners </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, November 13, 2019 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> In today’s mobile-first world, app publishers who use banner ads must serve them across a greater variety of screen sizes and layouts than ever before. Existing responsive banner ad formats often produce ads that are too small and not optimally tailored to the specifications of each device. </p> <p> To address this, we’ve created a new banner type called adaptive anchor banners. These banners dynamically adjust creative size to deliver an ad that is ideally sized across all of your user’s devices, without the need to write any custom code. </p> <p> These banners are designed to replace standard 320x50 and leaderboard banner sizes, as well as smart banners. Here is a comparison of the 3 formats on a standard mobile device: </p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfOhBv_rRk5ZjSIPaAUAOgkuRWGCBCUSrIEneZjYvGpdplRQZidiPNSIsireWVhXz5GVNOQjAZMOvqej6cpuV83yIGuWRkSzox13gb7BNj1ahyphenhyphen7r5LSEUVNxr8ifzUVgL9yljAmINm0Dc/s1600/adaptive_banner_new_mock.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="897" data-original-width="1600" height="359" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfOhBv_rRk5ZjSIPaAUAOgkuRWGCBCUSrIEneZjYvGpdplRQZidiPNSIsireWVhXz5GVNOQjAZMOvqej6cpuV83yIGuWRkSzox13gb7BNj1ahyphenhyphen7r5LSEUVNxr8ifzUVgL9yljAmINm0Dc/s640/adaptive_banner_new_mock.png" width="640" /></a></div> <div style="text-align: center"><em><span>Standard banner vs. smart banner vs. AdMob’s adaptive anchor banner</span></em></div> <br> <br> <h2>Migrating your banner implementation to adaptive</h2> <p> Here are a few simple steps to update your banner implementation to use adaptive banners: </p> <ol><li>Ensure your UI supports a variable height banner. Depending on what constraints or layout mechanism you are using to position your banner, you may need to remove height constraints such that the layout accepts variable content size. <ul> <li>For Android this can be done using <code>WRAP_CONTENT</code>.</li> <li>For iOS constrain your banner in terms of X and Y positions, you may also give it a width constraint, but ensure any height constraint or content size is placeholder only.</li> </ul> <p>Note that the max height is 15% of the device height or 90px, whichever is smaller.</p> </li> <li>Use the adaptive banner ad size APIs to get an adaptive ad size. The adaptive ad size APIs are available for different orientations. <p>Android: <br> <code>AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, width)</code><br> <code>AdSize.getPortraitAnchoredAdaptiveBannerAdSize(context, width)</code><br> <code>AdSize.getLandscapeAnchoredAdaptiveBannerAdSize(context, width)</code><br> </p> <p>iOS: <br> <code>GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> <code>GADPortraitAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> <code>GADLandscapeAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> </p> <p>Unity: <br> <code>AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> <code>AdSize.GetPortraitAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> <code>AdSize.GetLandscapeAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> </p> <p>Which one you use depends on your use case. If you want to preload ads for a given orientation, use the API for that orientation. If you only need a banner for the current orientation of the device, use the current orientation API. </p> <p>Once you have an ad size, set that on your banner view as usual before loading an ad. The banner will resize to the adaptive ad size as long as you have laid it out without any conflicting constraints. </p> </li> <li>Update your mediation adapters. If you use mediation, update your mediation adapters to the latest version. All open source mediation adapters that support banners have been updated to support the adaptive banner ad size requests. Note that adapters will still only return ad sizes supported by their corresponding ad network SDK, and those ads will be centered in your adaptive banner view. </li> </ol> <h2>Review our developer resources</h2> <p> For further information including detailed implementation guidance, review our developer resources: </p><ul> <li>Adaptive banner guide (<a href="https://developers.google.com/admob/ios/banner/adaptive">AdMob iOS</a> | <a href="https://developers.google.com/admob/android/banner/adaptive">AdMob Android</a> | <a href="https://developers.google.com/admob/unity/banner/adaptive">AdMob Unity</a> | <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner/adaptive">Ad Manager iOS</a> | <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner/adaptive">Ad Manager Android</a>) <li>Adaptive banner sample app (<a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/master/Swift/admob/AdaptiveBannerExample">AdMob iOS</a> | <a href="https://github.com/googleads/googleads-mobile-android-examples/tree/master/java/admob/AdaptiveBannerExample">AdMob Android</a> | <a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/master/Swift/admanager/AdaptiveBannerExample">Ad Manager iOS</a> | <a href="https://github.com/googleads/googleads-mobile-android-examples/tree/master/java/admanager/AdaptiveBannerExample">Ad Manager Android</a>)</li></ul> <p> As always, please reach out on our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">developer forum</a> if you have any questions. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AAuE7mDYk-xi7aUv1XR9jrXS5ysT32Ll4zfahlOO_qZlGA=s120-p-rw-no?sz=40" style="vertical-align:middle; border:none;" width="40"> - Samuel Stow, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> In today’s mobile-first world, app publishers who use banner ads must serve them across a greater variety of screen sizes and layouts than ever before. Existing responsive banner ad formats often produce ads that are too small and not optimally tailored to the specifications of each device. </p> <p> To address this, we’ve created a new banner type called adaptive anchor banners. These banners dynamically adjust creative size to deliver an ad that is ideally sized across all of your user’s devices, without the need to write any custom code. </p> <p> These banners are designed to replace standard 320x50 and leaderboard banner sizes, as well as smart banners. Here is a comparison of the 3 formats on a standard mobile device: </p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfOhBv_rRk5ZjSIPaAUAOgkuRWGCBCUSrIEneZjYvGpdplRQZidiPNSIsireWVhXz5GVNOQjAZMOvqej6cpuV83yIGuWRkSzox13gb7BNj1ahyphenhyphen7r5LSEUVNxr8ifzUVgL9yljAmINm0Dc/s1600/adaptive_banner_new_mock.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="897" data-original-width="1600" height="359" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfOhBv_rRk5ZjSIPaAUAOgkuRWGCBCUSrIEneZjYvGpdplRQZidiPNSIsireWVhXz5GVNOQjAZMOvqej6cpuV83yIGuWRkSzox13gb7BNj1ahyphenhyphen7r5LSEUVNxr8ifzUVgL9yljAmINm0Dc/s640/adaptive_banner_new_mock.png" width="640" /></a></div> <div style="text-align: center"><em><span>Standard banner vs. smart banner vs. AdMob’s adaptive anchor banner</span></em></div> <br> <br> <h2>Migrating your banner implementation to adaptive</h2> <p> Here are a few simple steps to update your banner implementation to use adaptive banners: </p> <ol><li>Ensure your UI supports a variable height banner. Depending on what constraints or layout mechanism you are using to position your banner, you may need to remove height constraints such that the layout accepts variable content size. <ul> <li>For Android this can be done using <code>WRAP_CONTENT</code>.</li> <li>For iOS constrain your banner in terms of X and Y positions, you may also give it a width constraint, but ensure any height constraint or content size is placeholder only.</li> </ul> <p>Note that the max height is 15% of the device height or 90px, whichever is smaller.</p> </li> <li>Use the adaptive banner ad size APIs to get an adaptive ad size. The adaptive ad size APIs are available for different orientations. <p>Android: <br> <code>AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, width)</code><br> <code>AdSize.getPortraitAnchoredAdaptiveBannerAdSize(context, width)</code><br> <code>AdSize.getLandscapeAnchoredAdaptiveBannerAdSize(context, width)</code><br> </p> <p>iOS: <br> <code>GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> <code>GADPortraitAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> <code>GADLandscapeAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> </p> <p>Unity: <br> <code>AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> <code>AdSize.GetPortraitAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> <code>AdSize.GetLandscapeAnchoredAdaptiveBannerAdSizeWithWidth(width)</code><br> </p> <p>Which one you use depends on your use case. If you want to preload ads for a given orientation, use the API for that orientation. If you only need a banner for the current orientation of the device, use the current orientation API. </p> <p>Once you have an ad size, set that on your banner view as usual before loading an ad. The banner will resize to the adaptive ad size as long as you have laid it out without any conflicting constraints. </p> </li> <li>Update your mediation adapters. If you use mediation, update your mediation adapters to the latest version. All open source mediation adapters that support banners have been updated to support the adaptive banner ad size requests. Note that adapters will still only return ad sizes supported by their corresponding ad network SDK, and those ads will be centered in your adaptive banner view. </li> </ol> <h2>Review our developer resources</h2> <p> For further information including detailed implementation guidance, review our developer resources: </p><ul> <li>Adaptive banner guide (<a href="https://developers.google.com/admob/ios/banner/adaptive">AdMob iOS</a> | <a href="https://developers.google.com/admob/android/banner/adaptive">AdMob Android</a> | <a href="https://developers.google.com/admob/unity/banner/adaptive">AdMob Unity</a> | <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner/adaptive">Ad Manager iOS</a> | <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner/adaptive">Ad Manager Android</a>) <li>Adaptive banner sample app (<a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/master/Swift/admob/AdaptiveBannerExample">AdMob iOS</a> | <a href="https://github.com/googleads/googleads-mobile-android-examples/tree/master/java/admob/AdaptiveBannerExample">AdMob Android</a> | <a href="https://github.com/googleads/googleads-mobile-ios-examples/tree/master/Swift/admanager/AdaptiveBannerExample">Ad Manager iOS</a> | <a href="https://github.com/googleads/googleads-mobile-android-examples/tree/master/java/admanager/AdaptiveBannerExample">Ad Manager Android</a>)</li></ul> <p> As always, please reach out on our <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">developer forum</a> if you have any questions. </p> <p><span class="byline-author"><img height="40" src="https://lh3.googleusercontent.com/a-/AAuE7mDYk-xi7aUv1XR9jrXS5ysT32Ll4zfahlOO_qZlGA=s120-p-rw-no?sz=40" style="vertical-align:middle; border:none;" width="40"> - Samuel Stow, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Introducing adaptive anchor banners&url=http://ads-developers.googleblog.com/2019/11/introducing-adaptive-anchor-banners.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2019/11/introducing-adaptive-anchor-banners.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2019/11/introducing-adaptive-anchor-banners.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='post' data-id='2706485330701282509' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2019/09/share-your-feedback-about-admob-and-ad.html' itemprop='url' title='Share your feedback about AdMob and Ad Manager mobile app integration'> Share your feedback about AdMob and Ad Manager mobile app integration </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, September 4, 2019 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> We’re continuously improving our guides, code samples, and other developer resources for the Google Mobile Ads SDK to help you integrate AdMob and Ad Manager into your mobile apps. </p> <p> To learn more about what's working well and what could be improved, we're announcing our second annual developer feedback survey for the Google Mobile Ads SDK. We'd like to hear from you about where we should focus our efforts. </p> <p> <center><a href="https://google.qualtrics.com/jfe/form/SV_084Z1a6aYoHjqSN?Source=blog">SHARE YOUR FEEDBACK</a></center> </p> <p> Your answers will be completely anonymous. The survey should take about 15 minutes to complete and will close on September 30, 2019. </p> <p> Your feedback is truly important to us. Here are a few highlights of the changes we made based on feedback from last year’s survey: </p><ol> <li>Continuous translations of the <a href="https://developers.google.com/admob/">developer docs</a> in several languages <li>Continuous build integration of <a href="https://github.com/googleads/googleads-mobile-android-examples">sample applications</a> via Travis CI <li>Launched a <a href="https://www.youtube.com/playlist?list=PLcJhXDSkclw3N1Mtmz8k-nWBxdffa9xBg">Developer tutorials</a> playlist on the <a href="https://www.youtube.com/channel/UCLHibHBWfeKWJwqQpJfCEuA">Google AdMob YouTube channel</a> <li>Launched the <a href="https://www.blog.google/products/admob/introducing-new-app-policy-center/">App Policy Center</a> to help publishers handle policy violations</li></ol> <p> Please let us know what you’d like us to focus on next. Thank you in advance for helping us continue to improve the developer experience for everyone. </p> <p> <p><span class="byline-author"><img height="40" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=40" style="vertical-align:middle; border:none;" width="40"> Eric Leichtenschlag, Mobile Ads Developer Relations</span></p> </p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> We’re continuously improving our guides, code samples, and other developer resources for the Google Mobile Ads SDK to help you integrate AdMob and Ad Manager into your mobile apps. </p> <p> To learn more about what's working well and what could be improved, we're announcing our second annual developer feedback survey for the Google Mobile Ads SDK. We'd like to hear from you about where we should focus our efforts. </p> <p> <center><a href="https://google.qualtrics.com/jfe/form/SV_084Z1a6aYoHjqSN?Source=blog">SHARE YOUR FEEDBACK</a></center> </p> <p> Your answers will be completely anonymous. The survey should take about 15 minutes to complete and will close on September 30, 2019. </p> <p> Your feedback is truly important to us. Here are a few highlights of the changes we made based on feedback from last year’s survey: </p><ol> <li>Continuous translations of the <a href="https://developers.google.com/admob/">developer docs</a> in several languages <li>Continuous build integration of <a href="https://github.com/googleads/googleads-mobile-android-examples">sample applications</a> via Travis CI <li>Launched a <a href="https://www.youtube.com/playlist?list=PLcJhXDSkclw3N1Mtmz8k-nWBxdffa9xBg">Developer tutorials</a> playlist on the <a href="https://www.youtube.com/channel/UCLHibHBWfeKWJwqQpJfCEuA">Google AdMob YouTube channel</a> <li>Launched the <a href="https://www.blog.google/products/admob/introducing-new-app-policy-center/">App Policy Center</a> to help publishers handle policy violations</li></ol> <p> Please let us know what you’d like us to focus on next. Thank you in advance for helping us continue to improve the developer experience for everyone. </p> <p> <p><span class="byline-author"><img height="40" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=40" style="vertical-align:middle; border:none;" width="40"> Eric Leichtenschlag, Mobile Ads Developer Relations</span></p> </p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Share your feedback about AdMob and Ad Manager mobile app integration&url=http://ads-developers.googleblog.com/2019/09/share-your-feedback-about-admob-and-ad.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2019/09/share-your-feedback-about-admob-and-ad.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2019/09/share-your-feedback-about-admob-and-ad.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='post' data-id='1174056256705334942' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2019/06/google-mobile-ads-sdk-for-android-how.html' itemprop='url' title='Google Mobile Ads SDK for Android: How to migrate to v18.0.0'> Google Mobile Ads SDK for Android: How to migrate to v18.0.0 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, June 21, 2019 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p> Earlier this week, Google Play services <a href="https://developers.google.com/android/guides/releases#june_17_2019">released a major update</a> to many of its libraries to migrate all Android support library dependencies to <a href="https://developer.android.com/jetpack">Jetpack</a> (using <code>androidx.*</code> packages). This includes the <code>play-services-ads</code> library from the Google Mobile Ads SDK, which has been updated to 18.0.0. </p> <p> While the Google Mobile Ads SDK itself hasn’t changed between version 17.2.1 and 18.0.0, you’ll need to migrate your own app and all of your dependencies to AndroidX in order to pick up <code>play-services-ads</code> 18.0.0 or any future versions. This is particularly important if you use <a href="https://developers.google.com/admob/android/mediate">AdMob mediation</a>, as several mediation partners have dependencies on Android support libraries that aren’t compatible with AndroidX. </p> <p> To make the migration process as smooth as possible for you, Android Studio offers an easy way to convert your project and its dependencies to AndroidX using the <a href="https://developer.android.com/jetpack/androidx/migrate">Migrate to AndroidX</a> option. </p> <h2>Migrate to AndroidX </h2> <p> Android Studio 3.2 or higher includes a <strong>Refactor > Migrate to AndroidX </strong>menu option to convert your project to use AndroidX. We’ll demonstrate what happens when converting our <a href="https://github.com/googleads/googleads-mobile-android-examples/tree/master/java/admob/BannerExample">BannerExample</a> to AndroidX. </p><ol> <li>Change the project’s <code>compileSdkVersion</code> to <strong>28</strong>. This is a prerequisite for migrating to AndroidX. <li>Right click the app module, and select <strong>Refactor > Migrate to AndroidX</strong>. You’ll be given an option to save your project as a zip file before Android Studio converts it. <li>Select <strong>Do Refactor</strong> to complete the migration.</li></ol> <p> </p> <h2>What changed?</h2> <p> Here is the project before the migration: </p> <p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSgbrLoqK8vWqabA_sipCOJrJX5LixORGuPJk-wthdUmFHTQhWP9Sz0BEfCGRfD6V6cwYwV7W7YYN-xZYCgkH3IDMK26YsA2y7urxNXLSB-Y4duGXfes6U8gsSQ6Y47cT3D5TRqXmiIGI/s1600/before.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1166" data-original-width="1600" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSgbrLoqK8vWqabA_sipCOJrJX5LixORGuPJk-wthdUmFHTQhWP9Sz0BEfCGRfD6V6cwYwV7W7YYN-xZYCgkH3IDMK26YsA2y7urxNXLSB-Y4duGXfes6U8gsSQ6Y47cT3D5TRqXmiIGI/s640/before.png" width="640" /></a></div> </p> <p> And here is the project afterwards: </p> <p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUjGbaU81oxmpvhnm7OzO3ck8hEKgFytXCX7cQ7_u2RSUgQ2b_wg0FC6452TzrggRmVNfSx2bj7zUTHzRF36tMouGMisR1qgIckCUZaNf5Uxo8PIw-cU6AJwPMjvcRlSfn4v2VA1vdZ3o/s1600/after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="887" data-original-width="1600" height="355" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUjGbaU81oxmpvhnm7OzO3ck8hEKgFytXCX7cQ7_u2RSUgQ2b_wg0FC6452TzrggRmVNfSx2bj7zUTHzRF36tMouGMisR1qgIckCUZaNf5Uxo8PIw-cU6AJwPMjvcRlSfn4v2VA1vdZ3o/s640/after.png" width="640" /></a></div> </p> <p> First, you’ll notice that the package name for <code>AppCompatActivity</code> has changed to <code>androidx.appcompat.app</code>. The refactor has changed this project’s <code>com.android.support:appcompat-v7:26.1.0</code> dependency to <code>androidx.appcompat:appcompat:1.0.0 </code>and fixed the associated imports. </p> <p> Second, this migration added a gradle.properties file with these two lines: </p> <pre class="prettyprint">android.useAndroidX=true android.enableJetifier=true </pre> <p> These properties ensure your project and its dependencies use AndroidX, by rewriting any binaries that are using an Android support library. See <a href="https://developer.android.com/jetpack/androidx#using_androidx">Using AndroidX</a> for more details on these flags. </p> <p> Now that your project is converted to AndroidX, you can safely update your play-services-ads dependency to <strong>18.0.0</strong> in your project-level build.gradle file: </p> <pre class="prettyprint">dependencies { implementation 'androidx.appcompat:appcompat:1.0.0' <strong>implementation 'com.google.android.gms:play-services-ads:18.0.0'</strong> } </pre> <p> As always, you can follow the <a href="https://developers.google.com/admob/android/rel-notes">release notes</a> to learn what’s changed in the Google Mobile Ads SDK. We’d also love to hear about how your migration went! If you have any questions about the release or have trouble migrating, please reach out to us on the <a href="https://groups.google.com/group/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=40" style="vertical-align:middle; border:none;" width="40"> - Eric Leichtenschlag, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p> Earlier this week, Google Play services <a href="https://developers.google.com/android/guides/releases#june_17_2019">released a major update</a> to many of its libraries to migrate all Android support library dependencies to <a href="https://developer.android.com/jetpack">Jetpack</a> (using <code>androidx.*</code> packages). This includes the <code>play-services-ads</code> library from the Google Mobile Ads SDK, which has been updated to 18.0.0. </p> <p> While the Google Mobile Ads SDK itself hasn’t changed between version 17.2.1 and 18.0.0, you’ll need to migrate your own app and all of your dependencies to AndroidX in order to pick up <code>play-services-ads</code> 18.0.0 or any future versions. This is particularly important if you use <a href="https://developers.google.com/admob/android/mediate">AdMob mediation</a>, as several mediation partners have dependencies on Android support libraries that aren’t compatible with AndroidX. </p> <p> To make the migration process as smooth as possible for you, Android Studio offers an easy way to convert your project and its dependencies to AndroidX using the <a href="https://developer.android.com/jetpack/androidx/migrate">Migrate to AndroidX</a> option. </p> <h2>Migrate to AndroidX </h2> <p> Android Studio 3.2 or higher includes a <strong>Refactor > Migrate to AndroidX </strong>menu option to convert your project to use AndroidX. We’ll demonstrate what happens when converting our <a href="https://github.com/googleads/googleads-mobile-android-examples/tree/master/java/admob/BannerExample">BannerExample</a> to AndroidX. </p><ol> <li>Change the project’s <code>compileSdkVersion</code> to <strong>28</strong>. This is a prerequisite for migrating to AndroidX. <li>Right click the app module, and select <strong>Refactor > Migrate to AndroidX</strong>. You’ll be given an option to save your project as a zip file before Android Studio converts it. <li>Select <strong>Do Refactor</strong> to complete the migration.</li></ol> <p> </p> <h2>What changed?</h2> <p> Here is the project before the migration: </p> <p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSgbrLoqK8vWqabA_sipCOJrJX5LixORGuPJk-wthdUmFHTQhWP9Sz0BEfCGRfD6V6cwYwV7W7YYN-xZYCgkH3IDMK26YsA2y7urxNXLSB-Y4duGXfes6U8gsSQ6Y47cT3D5TRqXmiIGI/s1600/before.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1166" data-original-width="1600" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSgbrLoqK8vWqabA_sipCOJrJX5LixORGuPJk-wthdUmFHTQhWP9Sz0BEfCGRfD6V6cwYwV7W7YYN-xZYCgkH3IDMK26YsA2y7urxNXLSB-Y4duGXfes6U8gsSQ6Y47cT3D5TRqXmiIGI/s640/before.png" width="640" /></a></div> </p> <p> And here is the project afterwards: </p> <p> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUjGbaU81oxmpvhnm7OzO3ck8hEKgFytXCX7cQ7_u2RSUgQ2b_wg0FC6452TzrggRmVNfSx2bj7zUTHzRF36tMouGMisR1qgIckCUZaNf5Uxo8PIw-cU6AJwPMjvcRlSfn4v2VA1vdZ3o/s1600/after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="887" data-original-width="1600" height="355" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUjGbaU81oxmpvhnm7OzO3ck8hEKgFytXCX7cQ7_u2RSUgQ2b_wg0FC6452TzrggRmVNfSx2bj7zUTHzRF36tMouGMisR1qgIckCUZaNf5Uxo8PIw-cU6AJwPMjvcRlSfn4v2VA1vdZ3o/s640/after.png" width="640" /></a></div> </p> <p> First, you’ll notice that the package name for <code>AppCompatActivity</code> has changed to <code>androidx.appcompat.app</code>. The refactor has changed this project’s <code>com.android.support:appcompat-v7:26.1.0</code> dependency to <code>androidx.appcompat:appcompat:1.0.0 </code>and fixed the associated imports. </p> <p> Second, this migration added a gradle.properties file with these two lines: </p> <pre class="prettyprint">android.useAndroidX=true android.enableJetifier=true </pre> <p> These properties ensure your project and its dependencies use AndroidX, by rewriting any binaries that are using an Android support library. See <a href="https://developer.android.com/jetpack/androidx#using_androidx">Using AndroidX</a> for more details on these flags. </p> <p> Now that your project is converted to AndroidX, you can safely update your play-services-ads dependency to <strong>18.0.0</strong> in your project-level build.gradle file: </p> <pre class="prettyprint">dependencies { implementation 'androidx.appcompat:appcompat:1.0.0' <strong>implementation 'com.google.android.gms:play-services-ads:18.0.0'</strong> } </pre> <p> As always, you can follow the <a href="https://developers.google.com/admob/android/rel-notes">release notes</a> to learn what’s changed in the Google Mobile Ads SDK. We’d also love to hear about how your migration went! If you have any questions about the release or have trouble migrating, please reach out to us on the <a href="https://groups.google.com/group/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>. </p> <p><span class="byline-author"><img height="40" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=40" style="vertical-align:middle; border:none;" width="40"> - Eric Leichtenschlag, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Google Mobile Ads SDK for Android: How to migrate to v18.0.0&url=http://ads-developers.googleblog.com/2019/06/google-mobile-ads-sdk-for-android-how.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2019/06/google-mobile-ads-sdk-for-android-how.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2019/06/google-mobile-ads-sdk-for-android-how.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='post' data-id='6687126392048603351' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='http://ads-developers.googleblog.com/2018/10/announcing-v1700-of-android-google.html' itemprop='url' title='Announcing v17.0.0 of the Android Google Mobile Ads SDK'> Announcing v17.0.0 of the Android Google Mobile Ads SDK </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, October 8, 2018 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <em>Updated on 10/9/2018 to fix the format of the AdMob application ID. The format of an AdMob app ID is ca-app-pub-################~##########.</em> <p> Google Mobile Ads SDK v17.0.0 for Android has just been released, and it comes with two important changes that you should be aware of: </p><ol> <li>A <code><meta-data></code> tag is now required in AndroidManifest.xml. <li><a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/NativeAppInstallAd">NativeAppInstallAd</a> and <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/NativeContentAd">NativeContentAd</a> APIs are deprecated in favor of <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/UnifiedNativeAd">UnifiedNativeAd</a>.</li></ol> <h2>Required AndroidManifest.xml changes</h2> <p> Starting in version 17.0.0, if you are an AdMob publisher you are now <strong><span style="color:#ff0000;">required</span></strong> to add your AdMob app ID in your <code>AndroidManifest.xml</code> file. Once you <a href="https://support.google.com/admob/answer/7356431">find your AdMob app ID</a> in the AdMob UI, add it to your manifest adding the following <code><meta-data></code> tag: </p> <pre class="prettyprint"><manifest> <application> <!-- TODO: Replace with your real AdMob app ID --> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-################~##########"/> </application> </manifest> </pre> <p> Failure to add this tag will result in the app crashing at app launch with a message starting with <em>"The Google Mobile Ads SDK was initialized incorrectly."</em> </p> <h3>What if I'm using Google Ad Manager instead of AdMob?</h3> <p> Publishers using Google Ad Manager will need to declare themselves as an Ad Manager app with a different <code><meta-data></code> tag to avoid the same crash: </p> <pre class="prettyprint"><manifest> <application> <meta-data android:name="com.google.android.gms.ads.AD_MANAGER_APP" android:value="true"/> </application> </manifest> </pre> <p> See the getting started guide (<a href="https://developers.google.com/admob/android/quick-start#update_your_androidmanifestxml">AdMob</a> | <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/android/quick-start#update_your_androidmanifestxml">Ad Manager</a>) for additional details on how to make this change. </p> <h2>NativeAppInstallAd and NativeContentAd APIs are deprecated</h2> <p> This release also officially deprecates the <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/NativeAppInstallAd">NativeAppInstallAd</a> and <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/NativeContentAd">NativeContentAd</a> APIs in favor of the previously released <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/UnifiedNativeAd">UnifiedNativeAd</a> API. The <code>UnifiedNativeAd</code> APIs offer a consolidated way to render any type of native ad, reducing the number of lines of code needed to integrate native ads by up to 50%. </p> <p> The following example shows how to load both app install and content ads using the new unified API: </p> <pre class="prettyprint">AdLoader adLoader = new AdLoader.Builder(context, "ca-app-pub-3940256099942544/2247696110") .forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() { @Override public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) { // Show the ad. } }) .build(); adLoader.loadAd(new AdRequest.Builder().build()); </pre> <p> Check out the <a href="https://developers.google.com/admob/android/native-unified">native ads guide</a> to get started with the unified API. </p> <h2>What else changed?</h2> <p> See the <a href="https://developers.google.com/admob/android/rel-notes">release notes</a> for a full list of changes. If you have any questions about the release, please reach out to us on the <a href="https://groups.google.com/group/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>. </p> <p><span class="byline-author"><a href="https://plus.google.com/112870803958713211515/"><img height="40" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=40" style="vertical-align:middle; border:none;" width="40"></a> - <a href="https://plus.google.com/112870803958713211515/" rel="author">Eric Leichtenschlag</a>, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <em>Updated on 10/9/2018 to fix the format of the AdMob application ID. The format of an AdMob app ID is ca-app-pub-################~##########.</em> <p> Google Mobile Ads SDK v17.0.0 for Android has just been released, and it comes with two important changes that you should be aware of: </p><ol> <li>A <code><meta-data></code> tag is now required in AndroidManifest.xml. <li><a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/NativeAppInstallAd">NativeAppInstallAd</a> and <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/NativeContentAd">NativeContentAd</a> APIs are deprecated in favor of <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/UnifiedNativeAd">UnifiedNativeAd</a>.</li></ol> <h2>Required AndroidManifest.xml changes</h2> <p> Starting in version 17.0.0, if you are an AdMob publisher you are now <strong><span style="color:#ff0000;">required</span></strong> to add your AdMob app ID in your <code>AndroidManifest.xml</code> file. Once you <a href="https://support.google.com/admob/answer/7356431">find your AdMob app ID</a> in the AdMob UI, add it to your manifest adding the following <code><meta-data></code> tag: </p> <pre class="prettyprint"><manifest> <application> <!-- TODO: Replace with your real AdMob app ID --> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-################~##########"/> </application> </manifest> </pre> <p> Failure to add this tag will result in the app crashing at app launch with a message starting with <em>"The Google Mobile Ads SDK was initialized incorrectly."</em> </p> <h3>What if I'm using Google Ad Manager instead of AdMob?</h3> <p> Publishers using Google Ad Manager will need to declare themselves as an Ad Manager app with a different <code><meta-data></code> tag to avoid the same crash: </p> <pre class="prettyprint"><manifest> <application> <meta-data android:name="com.google.android.gms.ads.AD_MANAGER_APP" android:value="true"/> </application> </manifest> </pre> <p> See the getting started guide (<a href="https://developers.google.com/admob/android/quick-start#update_your_androidmanifestxml">AdMob</a> | <a href="https://developers.google.com/ad-manager/mobile-ads-sdk/android/quick-start#update_your_androidmanifestxml">Ad Manager</a>) for additional details on how to make this change. </p> <h2>NativeAppInstallAd and NativeContentAd APIs are deprecated</h2> <p> This release also officially deprecates the <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/NativeAppInstallAd">NativeAppInstallAd</a> and <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/NativeContentAd">NativeContentAd</a> APIs in favor of the previously released <a href="https://developers.google.com/android/reference/com/google/android/gms/ads/formats/UnifiedNativeAd">UnifiedNativeAd</a> API. The <code>UnifiedNativeAd</code> APIs offer a consolidated way to render any type of native ad, reducing the number of lines of code needed to integrate native ads by up to 50%. </p> <p> The following example shows how to load both app install and content ads using the new unified API: </p> <pre class="prettyprint">AdLoader adLoader = new AdLoader.Builder(context, "ca-app-pub-3940256099942544/2247696110") .forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() { @Override public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) { // Show the ad. } }) .build(); adLoader.loadAd(new AdRequest.Builder().build()); </pre> <p> Check out the <a href="https://developers.google.com/admob/android/native-unified">native ads guide</a> to get started with the unified API. </p> <h2>What else changed?</h2> <p> See the <a href="https://developers.google.com/admob/android/rel-notes">release notes</a> for a full list of changes. If you have any questions about the release, please reach out to us on the <a href="https://groups.google.com/group/google-admob-ads-sdk">Google Mobile Ads SDK developer forum</a>. </p> <p><span class="byline-author"><a href="https://plus.google.com/112870803958713211515/"><img height="40" src="https://lh4.googleusercontent.com/-VjOdMVF5_qc/AAAAAAAAAAI/AAAAAAAAAB8/aYikCy7pZmw/photo.jpg?sz=40" style="vertical-align:middle; border:none;" width="40"></a> - <a href="https://plus.google.com/112870803958713211515/" rel="author">Eric Leichtenschlag</a>, Mobile Ads Developer Relations</span></p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Google Ads Developer Blog:Announcing v17.0.0 of the Android Google Mobile Ads SDK&url=http://ads-developers.googleblog.com/2018/10/announcing-v1700-of-android-google.html&via=google'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=http://ads-developers.googleblog.com/2018/10/announcing-v1700-of-android-google.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='http://ads-developers.googleblog.com/2018/10/announcing-v1700-of-android-google.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='http://ads-developers.googleblog.com/search/label/ad_manager' rel='tag'> ad_manager </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/admob' rel='tag'> admob </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/android' rel='tag'> android </a> , <a class='label' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk' rel='tag'> mobile_ads_sdk </a> </span> </div> </div> </div> <div class='blog-pager' id='blog-pager'> <a class='home-link' href='http://ads-developers.googleblog.com/'> <i class='material-icons'>  </i> </a> <i class='material-icons disabled'>  </i> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href='http://ads-developers.googleblog.com/search/label/mobile_ads_sdk?updated-max=2018-10-08T02:37:00-07:00&max-results=20&start=20&by-date=false' id='Blog1_blog-pager-older-link' title='Older Posts'> <i class='material-icons'>  </i> </a> </span> </div> <div class='clear'></div> </div></div> </div> </div> <div class='col-right'> <div class='section' id='sidebar-top'><div class='widget HTML' data-version='1' id='HTML8'> <div class='widget-content'> <div class='searchBox'> <input type='text' title='Search This Blog' placeholder='Search blog ...' /> </div> </div> <div class='clear'></div> </div></div> <div id='aside'> <div class='section' id='sidebar'><div class='widget Label' data-version='1' id='Label1'> <div class='tab'> <img class='sidebar-icon' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYpJREFUeNrs2aFuwzAQBmAvKRkMKRjZA4QMDJaWFgyMjuzFRg37DIUlA3uFkoGQSaWzJU+tpri5O9+l/zSfdFJlpe59yTmyVedq1PjfcZMZ70NuQnaF8w8htyE/rABtpviXkLcK88c5HhLkMBfgVan43zfFBNGMjHVGT/s55KP2pAvidbGHd+nzKt1RKSLG3rKF1iPFv6UWiPke8i7kEqGdGsI1O+LYVdqJAjgirwkKYD0ytkJBUNbAMvX8V3q9PhUsYvU1sWD8SO/sQvx2ahxOiNoJCSBCoAHYCEQAC4EKICOQASQEOmAS8RcAFxFN5hiIiugpgC3wk9hQAHH/70EBHXUN7IER5EWMiBgo2+nzOKQv9SCAeEM/OQAkhE/ncccFICB87qzQMia5FsJfOui0zMnmRvipU1ormHQuxGTxUsAcCFLxJQBLBLn4UoAFglW8BkATwS5eC6CBEBWvCShBiIvXBkgQRcVbADiI4uKtABSESvGWgB9EzHt3+tNwyO0qa9SoIYtvAQYAqDJhaWWeMecAAAAASUVORK5CYII='/> <h2> Labels </h2> <i class='material-icons arrow'>  </i> </div> <div class='widget-content list-label-widget-content'> <ul> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/account_management'> account_management </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_clicks'> ad_clicks </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_customizers'> ad_customizers </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange'> ad_exchange </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_buyer'> ad_exchange_buyer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_optimization-series'> ad_exchange_optimization-series </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_rest'> ad_exchange_rest </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_rtb'> ad_exchange_rtb </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_seller'> ad_exchange_seller </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_exchange_soap'> ad_exchange_soap </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_extensions'> ad_extensions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_inspector'> ad_inspector </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager'> ad_manager </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api'> ad_manager_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201805'> ad_manager_api_v201805 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201808'> ad_manager_api_v201808 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201811'> ad_manager_api_v201811 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201902'> ad_manager_api_v201902 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201905'> ad_manager_api_v201905 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201908'> ad_manager_api_v201908 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v201911'> ad_manager_api_v201911 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202002'> ad_manager_api_v202002 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202005'> ad_manager_api_v202005 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202008'> ad_manager_api_v202008 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202011'> ad_manager_api_v202011 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202102'> ad_manager_api_v202102 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202105'> ad_manager_api_v202105 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202108'> ad_manager_api_v202108 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202111'> ad_manager_api_v202111 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202202'> ad_manager_api_v202202 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202205'> ad_manager_api_v202205 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202208'> ad_manager_api_v202208 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202211'> ad_manager_api_v202211 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202302'> ad_manager_api_v202302 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202305'> ad_manager_api_v202305 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202308'> ad_manager_api_v202308 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202311'> ad_manager_api_v202311 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202402'> ad_manager_api_v202402 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202405'> ad_manager_api_v202405 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202408'> ad_manager_api_v202408 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_manager_api_v202411'> ad_manager_api_v202411 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_param'> ad_param </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ad_speed'> ad_speed </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adexchangebuyer'> adexchangebuyer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/AdGroup'> AdGroup </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/AdGroupAd'> AdGroupAd </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admanager_api'> admanager_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob'> admob </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_api'> admob_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_api_v1'> admob_api_v1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_mediation'> admob_mediation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_sdk'> admob_sdk </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_v4.3.1'> admob_v4.3.1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_v5.0.5'> admob_v5.0.5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/admob_v6.0.1'> admob_v6.0.1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ads'> ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense'> adsense </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_api'> adsense_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_host_api'> adsense_host_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_host_api_v3'> adsense_host_api_v3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api'> adsense_management_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1'> adsense_management_api_v1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1.1'> adsense_management_api_v1.1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1.2'> adsense_management_api_v1.2 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1.3'> adsense_management_api_v1.3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adsense_management_api_v1.4'> adsense_management_api_v1.4 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/advanced_apis'> advanced_apis </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwhirl'> adwhirl </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwhirl_v3.1.1'> adwhirl_v3.1.1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords'> adwords </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/AdWords%20Scripts'> AdWords Scripts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_AdGroupCriterionService'> adwords_AdGroupCriterionService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api'> adwords_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201302'> adwords_api_v201302 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201306'> adwords_api_v201306 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201309'> adwords_api_v201309 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201402'> adwords_api_v201402 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201406'> adwords_api_v201406 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201409'> adwords_api_v201409 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201502'> adwords_api_v201502 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201506'> adwords_api_v201506 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201509'> adwords_api_v201509 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201601'> adwords_api_v201601 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201603'> adwords_api_v201603 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201605'> adwords_api_v201605 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201607'> adwords_api_v201607 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201609'> adwords_api_v201609 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201702'> adwords_api_v201702 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201705'> adwords_api_v201705 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201708'> adwords_api_v201708 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201710'> adwords_api_v201710 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201802'> adwords_api_v201802 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201806'> adwords_api_v201806 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_v201809'> adwords_api_v201809 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_api_workshops'> adwords_api_workshops </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_BatchJobService'> adwords_BatchJobService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_CampaignService'> adwords_CampaignService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_CreateAccountService'> adwords_CreateAccountService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_for_video'> adwords_for_video </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_ManagedCustomerService'> adwords_ManagedCustomerService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_MutateJobService'> adwords_MutateJobService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_ReportDefinitionService'> adwords_ReportDefinitionService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_scripts'> adwords_scripts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201109'> adwords_v201109 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201206'> adwords_v201206 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201209'> adwords_v201209 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201302'> adwords_v201302 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201306'> adwords_v201306 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201309'> adwords_v201309 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201601'> adwords_v201601 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201605'> adwords_v201605 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201607'> adwords_v201607 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201609'> adwords_v201609 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201702'> adwords_v201702 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201802'> adwords_v201802 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201806'> adwords_v201806 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/adwords_v201809'> adwords_v201809 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/alerting'> alerting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/amp'> amp </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/analytics'> analytics </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/analyticsapi'> analyticsapi </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/android'> android </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/android_layout'> android_layout </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/animation'> animation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/announcement'> announcement </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/annual%20developer%20survey'> annual developer survey </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/api'> api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/app_engine'> app_engine </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/asset_group'> asset_group </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/asset_group_listing_group_filter'> asset_group_listing_group_filter </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/asset_group_signal'> asset_group_signal </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/assets'> assets </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/attribution_reporting_api'> attribution_reporting_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/audiences'> audiences </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/authentication'> authentication </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/authorization'> authorization </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/authorized_buyer'> authorized_buyer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/authorized_buyers'> authorized_buyers </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/aw_reporting'> aw_reporting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/awql'> awql </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/batch_processing'> batch_processing </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/beacon_api'> beacon_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/best_practices'> best_practices </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/beta'> beta </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/bid_manager_api'> bid_manager_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/bid_modifiers'> bid_modifiers </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/bidding'> bidding </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/billing'> billing </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/brand%20guidelines'> brand guidelines </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/brand_guidelines'> brand_guidelines </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/budget_order_service'> budget_order_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/budgets'> budgets </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/builders'> builders </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/bulk_upload'> bulk_upload </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/c%23'> c# </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/caf_sdk'> caf_sdk </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call_extensions'> call_extensions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call_metrics'> call_metrics </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call_only'> call_only </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call_tracking'> call_tracking </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/call-only'> call-only </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/callout_extensions'> callout_extensions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/campaign'> campaign </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/CampaignCriterion'> CampaignCriterion </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/case_study'> case_study </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/cast'> cast </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/certificates'> certificates </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/certification'> certification </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/chart_tools'> chart_tools </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/chrome'> chrome </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/chromecast'> chromecast </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/click'> click </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/click_tracking'> click_tracking </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/click_type'> click_type </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/click-to-download'> click-to-download </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/clicks'> clicks </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/client_libraries'> client_libraries </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/client_library'> client_library </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/cm360'> cm360 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/code_examples'> code_examples </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/common_questions'> common_questions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/conference'> conference </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/content'> content </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/content_api'> content_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/conversion'> conversion </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/conversions'> conversions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ConversionTrackerService'> ConversionTrackerService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/converted_clicks'> converted_clicks </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/creative_platforms'> creative_platforms </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/creatives'> creatives </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/custom_fields'> custom_fields </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/customer_match'> customer_match </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/DAI'> DAI </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dart'> dart </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dbm_api'> dbm_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/debugging'> debugging </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/decorators'> decorators </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/deprecation'> deprecation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/developer'> developer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_ad_service'> dfa_ad_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_api'> dfa_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_api_v118'> dfa_api_v118 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_creative_service'> dfa_creative_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_reporting_api'> dfa_reporting_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_site_service'> dfa_site_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.16'> dfa_v1.16 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.17'> dfa_v1.17 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.18'> dfa_v1.18 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.19'> dfa_v1.19 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfa_v1.20'> dfa_v1.20 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp'> dfp </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_api'> dfp_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_appengine'> dfp_appengine </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_creatives'> dfp_creatives </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_inventory'> dfp_inventory </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_mobile'> dfp_mobile </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_pql'> dfp_pql </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_reports'> dfp_reports </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_sales'> dfp_sales </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_teams'> dfp_teams </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201111'> dfp_v201111 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201201'> dfp_v201201 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201203'> dfp_v201203 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201204'> dfp_v201204 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201206'> dfp_v201206 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201208'> dfp_v201208 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201211'> dfp_v201211 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201302'> dfp_v201302 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201308'> dfp_v201308 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201608'> dfp_v201608 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dfp_v201711'> dfp_v201711 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/display'> display </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/display_network'> display_network </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/display_select'> display_select </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/display_smart_campaign'> display_smart_campaign </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/docs'> docs </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dotnet'> dotnet </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/doubleclick'> doubleclick </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/DoubleClick_Rich_Media'> DoubleClick_Rich_Media </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/doubleclick_studio'> doubleclick_studio </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/drafts'> drafts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dsa'> dsa </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dv360'> dv360 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dv360_api'> dv360_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/dynamic_creative'> dynamic_creative </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/enhanced_campaigns'> enhanced_campaigns </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/entity_read_files'> entity_read_files </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/erf'> erf </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/error%20handling'> error handling </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/eta'> eta </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/examples'> examples </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/excluded_placement_lists'> excluded_placement_lists </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/exoplayer'> exoplayer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/expanded_text_ads'> expanded_text_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/experiment'> experiment </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/experiments'> experiments </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/faq'> faq </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/feedback'> feedback </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/feeds'> feeds </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/firebase'> firebase </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/flash'> flash </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/flash_sdk'> flash_sdk </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/floc'> floc </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/flutter'> flutter </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/forecast_service'> forecast_service </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/games'> games </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gaql'> gaql </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gclid'> gclid </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gdc'> gdc </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gdl'> gdl </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/geo_targets'> geo_targets </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/geotargeting'> geotargeting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmail_ads'> gmail_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmail_image_ads'> gmail_image_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmail_multi_product_ads'> gmail_multi_product_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmail_single_promotion_ads'> gmail_single_promotion_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/GMF'> GMF </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gmp'> gmp </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/golang'> golang </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads'> google_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api'> google_ads_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_migration_workshop'> google_ads_api_migration_workshop </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0'> google_ads_api_v0 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_1'> google_ads_api_v0_1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_3'> google_ads_api_v0_3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_4'> google_ads_api_v0_4 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_5'> google_ads_api_v0_5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_6'> google_ads_api_v0_6 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v0_7'> google_ads_api_v0_7 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v1_0'> google_ads_api_v1_0 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v1_1'> google_ads_api_v1_1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v1_2'> google_ads_api_v1_2 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v1_3'> google_ads_api_v1_3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v2_1'> google_ads_api_v2_1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v3_0'> google_ads_api_v3_0 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v3_1'> google_ads_api_v3_1 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v4'> google_ads_api_v4 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v5'> google_ads_api_v5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_api_v6'> google_ads_api_v6 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_scripts'> google_ads_scripts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_ads_solutions'> google_ads_solutions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_apis'> google_apis </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_apps_script'> google_apps_script </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_drive'> google_drive </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_play_services'> google_play_services </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/google_plus'> google_plus </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/gpt'> gpt </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/guide'> guide </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/guides'> guides </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/hangout'> hangout </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/hotel_ads'> hotel_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/hotel_campaigns'> hotel_campaigns </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/html5'> html5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/html5_ads'> html5_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/https'> https </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/i18n'> i18n </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ids'> ids </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_android'> ima_android </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_flash'> ima_flash </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_html5'> ima_html5 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_ios'> ima_ios </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_roku'> ima_roku </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ima_sdk'> ima_sdk </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/image'> image </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/image_ads'> image_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/implementation'> implementation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/impression_share'> impression_share </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/interstitial'> interstitial </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/interview'> interview </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/io13'> io13 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/iOS'> iOS </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/iOS9'> iOS9 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/java_app_engine'> java_app_engine </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/java_dart_api'> java_dart_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/jdbc'> jdbc </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/keyword_optimizer'> keyword_optimizer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/keywords'> keywords </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/kotlin'> kotlin </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/labels'> labels </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/limits'> limits </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/line_item'> line_item </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/linq'> linq </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/listing_groups'> listing_groups </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/location_extensions'> location_extensions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/location_feeds'> location_feeds </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/LocationExtensionOperand'> LocationExtensionOperand </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/LocationGroups'> LocationGroups </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/logging'> logging </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/manager_accounts'> manager_accounts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/maps_api'> maps_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/marketplace'> marketplace </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/maximize'> maximize </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mcc'> mcc </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/media'> media </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/media_bundle'> media_bundle </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mediation_test_suite'> mediation_test_suite </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/merchant_api'> merchant_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/migration'> migration </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile'> mobile </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_ads'> mobile_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_ads_garage'> mobile_ads_garage </a> </li> <li> <span dir='ltr'> mobile_ads_sdk </span> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_sites'> mobile_sites </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_speed'> mobile_speed </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_targeting'> mobile_targeting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/mobile_ux'> mobile_ux </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/monitoring'> monitoring </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/native'> native </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/native_ads_express'> native_ads_express </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/new_features'> new_features </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/oauth'> oauth </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/oauth2'> oauth2 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/offline_conversions'> offline_conversions </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/OfflineConversionFeedService'> OfflineConversionFeedService </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/open_source'> open_source </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/openrtb'> openrtb </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/optimization'> optimization </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/Performance%20Max'> Performance Max </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/performance_max'> performance_max </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/performance_max_api_workshop'> performance_max_api_workshop </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/php'> php </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/PLA'> PLA </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/placements'> placements </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/PMax'> PMax </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/policy'> policy </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/policy_violation'> policy_violation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/PQL'> PQL </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/price_extension'> price_extension </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/privacy'> privacy </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/privacy_sandbox'> privacy_sandbox </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/product_listing_ads'> product_listing_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/proguard'> proguard </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/promotion_line'> promotion_line </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/publisher_ads_audits'> publisher_ads_audits </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/python'> python </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/qa'> qa </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/quality_score'> quality_score </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/query_builder_blog_series'> query_builder_blog_series </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/query_language'> query_language </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/quota'> quota </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/rate_limiter'> rate_limiter </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/rate_sheet'> rate_sheet </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/RateExceededError'> RateExceededError </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/realtime_bidding'> realtime_bidding </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/realtime_bidding_api'> realtime_bidding_api </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/realtime_bidding_protocol'> realtime_bidding_protocol </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/realtimebidding'> realtimebidding </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/recommendations'> recommendations </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/referer'> referer </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/release'> release </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/remarketing'> remarketing </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/reporting'> reporting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/reports'> reports </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/responsive_ads'> responsive_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/rewarded_video'> rewarded_video </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/rmf'> rmf </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ruby'> ruby </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sa360'> sa360 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sandbox'> sandbox </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/scripts'> scripts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sdf'> sdf </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sdkless'> sdkless </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search'> search </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search%20audience'> search audience </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search%20terms'> search terms </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search_audience'> search_audience </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search_network'> search_network </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/search_theme'> search_theme </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/selector'> selector </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sendbeacon'> sendbeacon </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/service_accounts'> service_accounts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/shared_negative_keywords'> shared_negative_keywords </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/shopping'> shopping </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/simulations'> simulations </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sitelinks'> sitelinks </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/smart'> smart </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/snds'> snds </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/spend'> spend </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ssl'> ssl </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/StepInsideAdWords'> StepInsideAdWords </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/success_stories'> success_stories </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/suggested_ad_units'> suggested_ad_units </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/sunset'> sunset </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/survey'> survey </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/swift'> swift </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/swiftui'> swiftui </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/target'> target </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/target_cpa'> target_cpa </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/targeting'> targeting </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/template_ads'> template_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/terms'> terms </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/test_accounts'> test_accounts </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/test_network'> test_network </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/testing'> testing </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/text_ads'> text_ads </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/text_asset_automation'> text_asset_automation </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/tools'> tools </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/trials'> trials </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/turtledove'> turtledove </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/ui'> ui </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/unity'> unity </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/update'> update </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/updates'> updates </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/upgrade'> upgrade </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/upgraded_urls'> upgraded_urls </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/v201509'> v201509 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/vast3'> vast3 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/vcpm'> vcpm </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/video'> video </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/viewable-cpm'> viewable-cpm </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/webinar'> webinar </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/workshop'> workshop </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/workshops'> workshops </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/wp8'> wp8 </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/xml'> xml </a> </li> <li> <a dir='ltr' href='http://ads-developers.googleblog.com/search/label/youtube'> youtube </a> </li> </ul> <div class='clear'></div> </div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <div class='tab'> <i class='material-icons icon'>  </i> <h2> Archive </h2> <i class='material-icons arrow'>  </i> </div> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <ul class='hierarchy'> <li class='archivedate expanded'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy toggle-open'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2025/'> 2025 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate expanded'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2025/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2025/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/'> 2024 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2024/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/'> 2023 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2023/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/'> 2022 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2022/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/'> 2021 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2021/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/'> 2020 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2020/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/'> 2019 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2019/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/'> 2018 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2018/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/'> 2017 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2017/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/'> 2016 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2016/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/'> 2015 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2015/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/'> 2014 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2014/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/'> 2013 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2013/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/'> 2012 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2012/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='http://ads-developers.googleblog.com/2011/'> 2011 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2011/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='http://ads-developers.googleblog.com/2011/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> </div> </div> <div class='clear'></div> </div> </div></div> <div class='section' id='sidebar-bottom'><div class='widget HTML' data-version='1' id='HTML5'> <div class='widget-content'> <div class='followgooglewrapper'> <script src="https://apis.google.com/js/plusone.js"></script> <div class="g-ytsubscribe" data-channel="AdsDevelopers" data-layout="full"></div> </div> </div> <div class='clear'></div> </div><div class='widget HTML' data-version='1' id='HTML7'> <div class='widget-content'> Give us feedback in our developer product forums:<br /><br /> <a href="https://groups.google.com/forum/#!forum/adwords-api">Google Ads API</a><br /> <a href="https://groups.google.com/forum/#!forum/adwords-scripts">Google Ads scripts</a><br /> <a href="https://groups.google.com/forum/#!forum/google-doubleclick-for-publishers-api">Google Ad Manager API</a><br /> <a href="https://groups.google.com/forum/#!forum/google-doubleclick-for-advertisers-api">DCM API</a><br /> <a href="https://groups.google.com/forum/#!forum/google-admob-ads-sdk">Google Mobile Ads SDK</a><br /> <a href="https://groups.google.com/g/google-admob-api-developer-forum">Google AdMob API</a><br /> <a href="https://groups.google.com/forum/#!forum/ima-sdk">Google Interactive Media Ads SDK</a><br /> <a href="https://groups.google.com/forum/#!forum/google-content-api-for-shopping">Google Content API for Shopping</a><br /> <a href="https://groups.google.com/forum/#!forum/google-doubleclick-ad-exchange-buyer-api">Authorized Buyers API</a><br /> </div> <div class='clear'></div> </div></div> </div> </div> <div style='clear:both;'></div> </div> <!-- Footer --> <div class='google-footer-outer loading'> <div id='google-footer'> <a href='//www.google.com/'> <img class='google-logo-dark' height='36' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABICAYAAABFoT/eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACLVJREFUeNrsXd+L20YQ3vOprdLqiMXFXE2qB7dcwEcTSB7ykIc+9A/PQx/yEMq1TWhNuYIpJriNr7XpmZ5IxFEvmW2EKs3Ornb1w50PxIFP0kiz387OzM6uhGAwGAxGP3Ho+f7x7ri1O7LdccPqZjSNA4dEHsLfaHcEFedJom93x9Xu2OyOFTcBo6sED3fHZHeMEELrkAHJF0B8Rr+gDFsZ5n0luLTQ95AXs4W06D/tjpR50xtM4CjD0y48YGB4rnyZxNOzyA7zBHr+nLnDaJLg0mo/ALekCasg3Z4XbM0ZdTEgnDPeHY8bIne+Qz2GvwyGNwsuyT218KWvIIBMcwGpLiipcolecjMxfBDchNyS1EvxLiOSIecp31q6IJ/C3yrIrMqMm4jhg+AxkdwbIO3aUO4KjqqMjCT3uaazMBhWBJfuxH3CtRfiXf66DhSRZWbmlMnNaILgZxrXJQO/eO3wORZwvwm4JUxuhheCjzVBYAbW1ces45YDSoZrFNOEE835M8FT6oyeEnws8Fz3QnBxFKPHBMem4GU+m6fPGb0leCTwWcM5B36MPgeZI01gudyDdw3hPeXfo8L/rmCUWnuMMdqUL2WqWeRbhf+twfVsO7YagZGNC79fw7OthEVtkiJ4jJzTd3KPwf3CRqhhiTu23AP5sl0/0xiwISQXpNwLIJK87mHF+U8ddzzdmgKlGzlPYjyxGJQouIhNT4k9AqWEFkqfguIvagTWbcq3KW1WE3xS3m8NtA9WS451xofwjKT5kkDoK/b6mDk5FfXr1lWDL4BofZEv2/SRsK/EHGlGdBdu8QNRb8HMCFwt7Yy3DDI/QP7fx5z3VLhdlJEIs4rKNuXXJXdxZPdB7kfCzWqwCO4V1LHgLjInX3tQ1KzCR52Cz+vDj1dydeRuS74rcvs2Pi6fT5H8OaaUQPQPYcWwRSGXyhhscn5dpAnEFMkuEZetbfkTAnlSuH4DxisE+aMGeJAQ3lFl7C4LJE6QWCaCd583ORQ1jYAwjFctal7nOs2ZZvicwvlZx+RHGrcoAwKUVX8uwcc/9TT65INeDOr5shL9LDRB6QTeIy3zwfdh3WOi6axLCEhSjXU7F3h6LqggUtvyJxpynwu8tDkD98fXApOxRj8zoZ9MnGveYVIVZKaGrkBXCY65BCYNN9NkjpKOyQ81Q79JgdxS+Jn3SDTEXRI7SWzaiSTB32oI3nU3BvMfM0urhOVYgwKhuiAfc4tM07wXwm1ZRoQYSl2NUwiu01fEAHVcpixd745FvVz4dzUUc0o8rwoLy8ZSwU6CyFx1RP5II9+1bFPEFs9HWbNLiimDXE+vCm7u1CS47cofzD3aEhVY57mxRo5zlqdt+RFC1JUH2S7bcVXg4liTMakaBZZVxiTICRoivcn1sEUBlk24JmaC6kxUbYmWoqvyfck2xZGGnDFYa9MMzkYQ1ijkCX6qidybrgePiQ0QIQqoi6qRLeqQfIoRsEHaQJLBdHOnLGetSdm/IPcymJuS1PAnbQPH0MOw/39C1vL11DiLOqIsbDI8QcHvGiLnySi2qUXBicaqUSxN5LEB0g7Jt3ENXJLPJ5S1tnaZBoWbpRqrmjRE7qHmpSmNHdQcYrEUadoh+TbBnc9ri7iycI1kzPeNcLDIvbiqXpez9Tmdq6zGREPuzECBoxrPMiI2WtvyNwhJba2wy3JZ6ky5dD1lSvmZS3e4SPA1wcf1VTFHKX+cGwZzdUYcqpvUtvwrD/InDttVlyZeAKlNN5MKbAiurHhKIPlUuJvlTCCiDjSKSCsUmCFWbGLZwCESfK07JB8LvMYWVtw0D00JEHV8Mq2HkqPbE0oHLvvK2g0o8ETg+4cfwTlZDT9JDoWygu4uQQE/ivIvtcnfPkaCqhiupz7jWOAzqL/vjtcdkv9G4MVMt+EaylfuImiPAXEUjRF3pjjaHiPPZ6If9TGGAO4ZY0am6jOCb+DQ+ZCqLkIpOIPrdNfIjnFPY6nyFut7TS/fanrziOBOKMupKw94WaLMtuVnSFt9CPrWWdJE6PeltCX432DEBoh+5Dv8RRhdis8YAv9uyq4/JAwtlEApgBe9Cw9xDD3tdk4Jn0MDfiHwPHcRPxBePCMER3GuIx7kGlv9fkZ4V9lolx2Uv4X7hEj7qJ3LDoAMGbTRMRibu4L2xQ8bgt8AyU+Q+x7nYrvDnH4iuO5LxKsYwPVbkPMvKF9Zky9wXzRfVWizi62r9X5VHf55h+WHhDjGBZ4WRhyTr6z5SlCoLMxLSpBZFsQ9F80uQFbF/6aFWi+Ev51vzzsuX+msyzuQXXjUz8zEBy+zpq9yweXAoxJW4JbYrDS6gYDqGHxPl+TKeiBfxj9/EBIElPYeOA4y8/qRQfknjvSzgRgtq0Pw/M1eQeMdOSb2Bnrhr6Led+1vcp2x7oTFHMnedFW+Ivlty062BUt74oHgSj+vHepnhunn0JJAMtBZgDI/qmGtMujRv8DDpo47zBJ8UtPOuAR/7rKn8t9AJ0tBdmBAmJ/Fu71yxp4I3qh+DhyRqbi5Y1ShVPlSb8X7bRNcfgZFl+WRGYo7uecrWq1r8X5bhmzP5OdlDwsGRm1suSxkg5rYm7ConyGQ3Zl+DgSD8V/kPwrWBMG9YcBtyShBnTLdTiHgttw7qAW7cqh/ZnmPKr/6ignOaKsdyxbsToT5UkPsW00bJjijDXficcX/JsLs6w2BwGtherdckH3w/kNXRPVI0OqJQoHX42/66IMfMj/2huRjxIidgKV/W0JS+bsstDoTeAHcrI8E5zTh/sDkqxL5rZup55/3USlswfcHf4IrQplVDgW9XFlOqnwr6pVPMMEZTuC60EttvdzbLbaZ4PsFVa3nohhO+vW+yn/ZB2fUhpysmQrzBcTSai9EszuZMcEZ1lCFVrp9zGXhm69iLyY4oxFIa178lPe12I/P2DAYDAaDwWAwGAwGg8FgMBgMBoPBYDD2Cf8IMADDRGoQTe+E9AAAAABJRU5ErkJggg==' style='margin-top: -16px;' width='92'/> </a> <ul> <li> <a href='//www.google.com/'> Google </a> </li> <li> <a href='//www.google.com/policies/privacy/'> Privacy </a> </li> <li> <a href='//www.google.com/policies/terms/'> Terms </a> </li> </ul> </div> </div> <script type='text/javascript'> //<![CDATA[ // Social sharing popups. var postEl = document.getElementsByClassName('social-wrapper'); var postCount = postEl.length; for(i=0; i<postCount;i++){ postEl[i].addEventListener("click", function(event){ var postUrl = this.getAttribute("data-href"); window.open( postUrl,'popUpWindow','height=500,width=500,left=10,top=10,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'); });} //]]> </script> <script type='text/javascript'> //<![CDATA[ var BreakpointHandler = function() { this.initted = false; this.isHomePage = false; this.isMobile = false; }; BreakpointHandler.prototype.finalizeSummary = function(summaryHtml, lastNode) { // Use $.trim for IE8 compatibility summaryHtml = $.trim(summaryHtml).replace(/(<br>|\s)+$/,''); if (lastNode.nodeType == 3) { var lastChar = summaryHtml.slice(-1); if (!lastChar.match(/[.”"?]/)) { if (!lastChar.match(/[A-Za-z]/)) { summaryHtml = summaryHtml.slice(0, -1); } summaryHtml += ' ...'; } } else if (lastNode.nodeType == 1 && (lastNode.nodeName == 'I' || lastNode.nodeName == 'A')) { summaryHtml += ' ...'; } return summaryHtml; }; BreakpointHandler.prototype.generateSummaryFromContent = function(content, numWords) { var seenWords = 0; var summaryHtml = ''; for (var i=0; i < content.childNodes.length; i++) { var node = content.childNodes[i]; var nodeText; if (node.nodeType == 1) { if (node.hasAttribute('data-about-pullquote')) { continue; } nodeText = node.textContent; if (nodeText === undefined) { // innerText for IE8 nodeText = node.innerText; } if (node.nodeName == 'DIV' || node.nodeName == 'B') { // Don't end early if we haven't seen enough words. if (seenWords < 10) { continue; } if (i > 0) { summaryHtml = this.finalizeSummary(summaryHtml, content.childNodes[i-1]); } break; } summaryHtml += node.outerHTML; } else if (node.nodeType == 3) { nodeText = node.nodeValue; summaryHtml += nodeText + ' '; } var words = nodeText.match(/\S+\s*/g); if (!words) { continue; } var remain = numWords - seenWords; if (words.length >= remain) { summaryHtml = this.finalizeSummary(summaryHtml, node); break; } seenWords += words.length; } return summaryHtml; }; BreakpointHandler.prototype.detect = function() { var match, pl = /\+/g, search = /([^&=]+)=?([^&]*)/g, decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); }, query = window.location.search.substring(1); var urlParams = {}; while (match = search.exec(query)) urlParams[decode(match[1])] = decode(match[2]); this.isListPage = $('html').hasClass('list-page'); this.isMobile = urlParams['m'] === '1'; this.isHomePage = window.location.pathname == '/'; }; BreakpointHandler.prototype.initContent = function() { var self = this; $('.post').each(function(index) { var body = $(this).children('.post-body')[0]; var content = $(body).children('.post-content')[0]; $(content).addClass('post-original'); var data = $(content).children('script').html(); data = self.rewriteForSSL(data); // If exists, extract specified editor's preview. var match = data.match(/([\s\S]+?)<div data-is-preview.+?>([\s\S]+)<\/div>/m); if (match) { data = match[1]; } // Prevent big images from loading when they aren't needed. // This must be done as a pre-injection step, since image loading can't be // canceled once embedded into the DOM. if (self.isListPage && self.isMobile) { data = data.replace(/<(img|iframe) .+?>/g, ''); } // Insert template to be rendered as nodes. content.innerHTML = data; if (self.isListPage) { var summary = document.createElement('div'); $(summary).addClass('post-content'); $(summary).addClass('post-summary'); body.insertBefore(summary, content); if (match) { // Use provided summary. summary.innerHTML = match[2]; } else { // Generate a summary. // Summary generation relies on DOM, so it must occur after content is // inserted into the page. summary.innerHTML = self.generateSummaryFromContent(content, 30); } // Add read more link to summary. var titleAnchor = $(this).find('.title a')[0]; var link = titleAnchor.cloneNode(true); link.innerHTML = 'Read More'; $(link).addClass('read-more'); summary.appendChild(link); } }); // Firefox does not allow for proper styling of BR. if (navigator.userAgent.indexOf('Firefox') > -1) { $('.post-content br').replaceWith('<span class="space"></span>'); } $('.loading').removeClass('loading'); }; BreakpointHandler.prototype.process = function() { if (!this.initted) { var makeInsecureImageRegex = function(hosts) { var whitelist = hosts.join('|').replace(/\./g,'\\.'); // Normal image tags, plus input images (yes, this is possible!) return new RegExp('(<(img|input)[^>]+?src=("|\'))http:\/\/(' + whitelist +')', 'g'); }; this.sslImageRegex = makeInsecureImageRegex(BreakpointHandler.KNOWN_HTTPS_HOSTS); this.sslImageCurrentDomainRegex = makeInsecureImageRegex([window.location.hostname]); this.detect(); this.initContent(); this.initted = true; } }; BreakpointHandler.KNOWN_HTTPS_HOSTS = [ "www.google.org", "www.google.com", "services.google.com", "blogger.com", "draft.blogger.com", "www.blogger.com", "photos1.blogger.com", "photos2.blogger.com", "photos3.blogger.com", "blogblog.com", "img1.blogblog.com", "img2.blogblog.com", "www.blogblog.com", "www1.blogblog.com", "www2.blogblog.com", "0.bp.blogspot.com", "1.bp.blogspot.com", "2.bp.blogspot.com", "3.bp.blogspot.com", "4.bp.blogspot.com", "lh3.googleusercontent.com", "lh4.googleusercontent.com", "lh5.googleusercontent.com", "lh6.googleusercontent.com", "themes.googleusercontent.com", ]; BreakpointHandler.prototype.rewriteForSSL = function(html) { // Handle HTTP -> HTTPS source replacement of images, movies, and other embedded content. return html.replace(this.sslImageRegex, '$1https://$4') .replace(this.sslImageCurrentDomainRegex, '$1//$4') .replace(/(<(embed|iframe)[^>]+?src=("|'))http:\/\/([^"']*?(youtube|picasaweb\.google)\.com)/g, '$1https://$4') // Slideshow SWF takes a image host, so we need to rewrite that parameter. .replace(/(<embed[^>]+?feed=http(?=[^s]))/g, '$1s'); }; $(document).ready(function() { var handler = new BreakpointHandler(); handler.process(); // Top-level navigation. $(".BlogArchive .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); $(".Label .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); // Blog archive year expansion. $('.BlogArchive .intervalToggle').click(function(ev) { ev.preventDefault(); if ($(this).parent().hasClass('collapsed')) { $(this).parent().removeClass('collapsed'); $(this).parent().addClass('expanded'); } else { $(this).parent().removeClass('expanded'); $(this).parent().addClass('collapsed'); } }); // Reverse order of months. $('.BlogArchive .intervalToggle + div').each(function(_, items) { var year = $(this); year.children().each(function(_, month) { year.prepend(month); }); }); // Set anchors to open in new tab. $('.post-content img').parent().each(function(_, node) { if (node.nodeName == 'A') { $(this).attr('target', '_blank'); } }); // Process search requests. $('.searchBox input').on("keypress", function(ev) { if (ev.which == 13) { window.location.href = 'https://www.google.com/search?q=site%3A' + window.location.hostname + '%20' + encodeURIComponent ($(this).val()); } }); }); //]]> </script> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/60983134-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY5bZAFtjmepHPOdhtPabmTG2mnaWQ:1739779489827';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d7815614485808579332','//ads-developers.googleblog.com/search/label/mobile_ads_sdk','7815614485808579332'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '7815614485808579332', 'title': 'Google Ads Developer Blog', 'url': 'http://ads-developers.googleblog.com/search/label/mobile_ads_sdk', 'canonicalUrl': 'http://ads-developers.googleblog.com/search/label/mobile_ads_sdk', 'homepageUrl': 'http://ads-developers.googleblog.com/', 'searchUrl': 'http://ads-developers.googleblog.com/search', 'canonicalHomepageUrl': 'http://ads-developers.googleblog.com/', 'blogspotFaviconUrl': 'http://ads-developers.googleblog.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': true, 'httpsEnabled': false, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'G-E4MSGF2SF9', 'analytics4': true, 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google Ads Developer Blog - Atom\x22 href\x3d\x22http://ads-developers.googleblog.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Google Ads Developer Blog - RSS\x22 href\x3d\x22http://ads-developers.googleblog.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google Ads Developer Blog - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/7815614485808579332/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/4b890f0df4aad4c4', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'index', 'searchLabel': 'mobile_ads_sdk', 'pageName': 'mobile_ads_sdk', 'pageTitle': 'Google Ads Developer Blog: mobile_ads_sdk'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Google Ads Developer Blog', 'description': 'The official blog for information about the Google Ads, Google Ad Manager, Google Mobile Ads SDKs for AdMob and IMA SDKs, and other Google Advertising Platform developer tools.', 'url': 'http://ads-developers.googleblog.com/search/label/mobile_ads_sdk', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': false, 'isSearch': true, 'isLabelSearch': true, 'search': {'label': 'mobile_ads_sdk', 'resultsMessage': 'Showing posts with the label mobile_ads_sdk', 'resultsMessageHtml': 'Showing posts with the label \x3cspan class\x3d\x27search-label\x27\x3emobile_ads_sdk\x3c/span\x3e'}}}]); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'navMessage': 'Showing posts with label \x3cb\x3emobile_ads_sdk\x3c/b\x3e. \x3ca href\x3d\x22http://ads-developers.googleblog.com/\x22\x3eShow all posts\x3c/a\x3e', 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/918196653-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/1964470060-lightbox_bundle.css'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML8', 'sidebar-top', document.getElementById('HTML8'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LabelView', new _WidgetInfo('Label1', 'sidebar', document.getElementById('Label1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML5', 'sidebar-bottom', document.getElementById('HTML5'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML7', 'sidebar-bottom', document.getElementById('HTML7'), {}, 'displayModeFull')); </script> </body> </html>