<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://docs.iqd-ao.de/de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Efeigegernoth</id>
	<title>Dokumentation - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://docs.iqd-ao.de/de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Efeigegernoth"/>
	<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Spezial:Beitr%C3%A4ge/Efeigegernoth"/>
	<updated>2026-04-29T09:57:50Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=362</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=362"/>
		<updated>2026-02-16T15:03:58Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Für das Hosting und den unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Sollte die zuvor genannte Variante aus technisch-organisatorischen Gründen nicht möglich sein, bitte Kontakt mit uns aufnehmen. In Absprache kann in Ausnahmefällen hiervon abgewichen werden. Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;,&lt;br /&gt;
        userData: {&lt;br /&gt;
           hashedEmail: &amp;quot;[Hashed Email siehe Erläuterung unten]&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpolitik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Es fehlt absichtlich level1, da dieser Teil der Adunit von der iqdigital innerhalb des Adcontrollers festgelegt wird.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: userData====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;userData&amp;quot; ist das Sammelobjekt für alle nötigen UserInformationen sowohl im  Rahmen von Clean Room Cases als auch unserer ID-Lösungen.&lt;br /&gt;
&lt;br /&gt;
=====Schlüssel: userData:hashedEmail=====&lt;br /&gt;
&lt;br /&gt;
Vorherige Normalisierung und Übergabe der via SHA256 erstellten Hashes der E-Mail Adressen über Publisher-CMS-/Mandantenobjekt (AdController) nach User Anmeldung/ Newsletter Registrierung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;javascript&#039;&amp;gt;&lt;br /&gt;
//Beispiel eines SHA256 Hashes&lt;br /&gt;
const userData:{&lt;br /&gt;
        hashedEmail: &amp;quot;21bd991f8b25a57075dd2489b4eebda1a5d956bbf52f961fe5289c6d5a0a2b5c&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normalisierung&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Vor dem Hashing der E-Mail-Adresse Normalisierung der Zeichenfolge, indem „überflüssige“ Zeichen entfernt werden:&lt;br /&gt;
&lt;br /&gt;
# Entfernen führender und nachgestellter Leerzeichen&lt;br /&gt;
# Alle ASCII-Zeichen in Kleinbuchstaben umwandeln&lt;br /&gt;
# Entfernen von &amp;quot;.&amp;quot; (ASCII-Code 46) aus dem Benutzernamen der E-Mail-Adresse &lt;br /&gt;
  à z.B. jane.smith@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
# Entfernen von &amp;quot;+&amp;quot; (ASCII-Code 43) und alle nachfolgenden Zeichen aus dem Benutzernamen der E-Mail-  Adresse &lt;br /&gt;
  à  z.B. janesmith+test@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Die Positionierung der Platzhaltercontainer der Anzeigen in der Publisher Seite erfolgt nach dem im Voraus abgestimmten Vertaggungsplan.&lt;br /&gt;
Die eigentliche Integration der Container sollte dem folgenden Muster gemäß geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_[N U M M E R]&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist. Mögliche Werte: &#039;&#039;&#039;desktop | tablet | mobile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen Signalfunktionen==&lt;br /&gt;
&lt;br /&gt;
===AdController.finalize(..)===&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===IQDComplete() - Page-Load Signal===&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=361</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=361"/>
		<updated>2026-02-16T15:00:46Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Für das Hosting und den unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Sollte die zuvor genannte Variante aus technisch-organisatorischen Gründen nicht möglich sein, bitte Kontakt mit uns aufnehmen. In Absprache kann in Ausnahmefällen hiervon abgewichen werden. Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;,&lt;br /&gt;
        userData: {&lt;br /&gt;
           hashedEmail: &amp;quot;[Hashed Email siehe Erläuterung unten]&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpolitik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Es fehlt absichtlich level1, da dieser Teil der Adunit von der iqdigital innerhalb des Adcontrollers festgelegt wird.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: userData====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;userData&amp;quot; ist das Sammelobjekt für alle nötigen UserInformationen sowohl im  Rahmen von Clean Room Cases als auch unserer ID-Lösungen.&lt;br /&gt;
&lt;br /&gt;
=====Schlüssel: userData:hashedEmail=====&lt;br /&gt;
&lt;br /&gt;
Vorherige Normalisierung und Übergabe der via SHA256 erstellten Hashes der E-Mail Adressen über Publisher-CMS-/Mandantenobjekt (AdController) nach User Anmeldung/ Newsletter Registrierung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;javascript&#039;&amp;gt;&lt;br /&gt;
//example&lt;br /&gt;
const userData:{&lt;br /&gt;
        hashedEmail: &amp;quot;21bd991f8b25a57075dd2489b4eebda1a5d956bbf52f961fe5289c6d5a0a2b5c&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normalisierung&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Vor dem Hashing der E-Mail-Adresse Normalisierung der Zeichenfolge, indem „überflüssige“ Zeichen entfernt werden:&lt;br /&gt;
&lt;br /&gt;
# Entfernen führender und nachgestellter Leerzeichen&lt;br /&gt;
# Alle ASCII-Zeichen in Kleinbuchstaben umwandeln&lt;br /&gt;
# Entfernen von &amp;quot;.&amp;quot; (ASCII-Code 46) aus dem Benutzernamen der E-Mail-Adresse &lt;br /&gt;
  à z.B. jane.smith@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
# Entfernen von &amp;quot;+&amp;quot; (ASCII-Code 43) und alle nachfolgenden Zeichen aus dem Benutzernamen der E-Mail-  Adresse &lt;br /&gt;
  à  z.B. janesmith+test@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Die Positionierung der Platzhaltercontainer der Anzeigen in der Publisher Seite erfolgt nach dem im Voraus abgestimmten Vertaggungsplan.&lt;br /&gt;
Die eigentliche Integration der Container sollte dem folgenden Muster gemäß geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_[N U M M E R]&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist. Mögliche Werte: &#039;&#039;&#039;desktop | tablet | mobile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen Signalfunktionen==&lt;br /&gt;
&lt;br /&gt;
===AdController.finalize(..)===&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===IQDComplete() - Page-Load Signal===&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=360</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=360"/>
		<updated>2026-02-16T14:48:09Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Für das Hosting und den unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Sollte die zuvor genannte Variante aus technisch-organisatorischen Gründen nicht möglich sein, bitte Kontakt mit uns aufnehmen. In Absprache kann in Ausnahmefällen hiervon abgewichen werden. Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;,&lt;br /&gt;
        userData: {&lt;br /&gt;
           hashedEmail: &amp;quot;[Hashed Email siehe Erläuterung unten]&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpolitik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Es fehlt absichtlich level1, da dieser Teil der Adunit von der iqdigital innerhalb des Adcontrollers festgelegt wird.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: userData====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;userData&amp;quot; ist das Sammelobjekt für alle nötigen UserInformationen sowohl im  Rahmen von Clean Room Cases als auch unserer ID-Lösungen.&lt;br /&gt;
&lt;br /&gt;
=====Schlüssel: userData:hashedEmail=====&lt;br /&gt;
&lt;br /&gt;
Vorherige Normalisierung und Übergabe der via SHA256 erstellten Hashes der E-Mail Adressen über Publisher-CMS-/Mandantenobjekt (AdController) nach User Anmeldung/ Newsletter Registrierung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normalisierung&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Vor dem Hashing der E-Mail-Adresse Normalisierung der Zeichenfolge, indem „überflüssige“ Zeichen entfernt werden:&lt;br /&gt;
&lt;br /&gt;
# Entfernen führender und nachgestellter Leerzeichen&lt;br /&gt;
# Alle ASCII-Zeichen in Kleinbuchstaben umwandeln&lt;br /&gt;
# Entfernen von &amp;quot;.&amp;quot; (ASCII-Code 46) aus dem Benutzernamen der E-Mail-Adresse &lt;br /&gt;
  à z.B. jane.smith@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
# Entfernen von &amp;quot;+&amp;quot; (ASCII-Code 43) und alle nachfolgenden Zeichen aus dem Benutzernamen der E-Mail-  Adresse &lt;br /&gt;
  à  z.B. janesmith+test@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Die Positionierung der Platzhaltercontainer der Anzeigen in der Publisher Seite erfolgt nach dem im Voraus abgestimmten Vertaggungsplan.&lt;br /&gt;
Die eigentliche Integration der Container sollte dem folgenden Muster gemäß geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_[N U M M E R]&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist. Mögliche Werte: &#039;&#039;&#039;desktop | tablet | mobile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen Signalfunktionen==&lt;br /&gt;
&lt;br /&gt;
===AdController.finalize(..)===&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===IQDComplete() - Page-Load Signal===&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=359</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=359"/>
		<updated>2026-02-16T14:14:57Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Für das Hosting und den unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Sollte die zuvor genannte Variante aus technisch-organisatorischen Gründen nicht möglich sein, bitte Kontakt mit uns aufnehmen. In Absprache kann in Ausnahmefällen hiervon abgewichen werden. Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;,&lt;br /&gt;
        userData: {&lt;br /&gt;
           hashedEmail: &amp;quot;[Hashed Email siehe Erläuterung unten]&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpolitik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Es fehlt absichtlich level1, da dieser Teil der Adunit von der iqdigital innerhalb des Adcontrollers festgelegt wird.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: userData====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;userData&amp;quot; ist das Sammelobjekt für alle nötigen UserInformationen sowohl im  Rahmen von Clean Room Cases als auch unserer ID-Lösungen.&lt;br /&gt;
&lt;br /&gt;
=====Schlüssel: userData:hashedEmail=====&lt;br /&gt;
&lt;br /&gt;
Vorherige Normalisierung  und Übergabe von E-Mail Adressen (Hashed E-Mail SHA256) über Publisher-CMS-/Mandantenobjekt (AdController), nach User Anmeldung/ Newsletter Registrierung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normalisierung&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Vor dem Hashing der E-Mail-Adresse Normalisierung der Zeichenfolge, indem „überflüssige“ Zeichen entfernt werden:&lt;br /&gt;
&lt;br /&gt;
# Entfernen führender und nachgestellter Leerzeichen&lt;br /&gt;
# Alle ASCII-Zeichen in Kleinbuchstaben umwandeln&lt;br /&gt;
# Entfernen von &amp;quot;.&amp;quot; (ASCII-Code 46) aus dem Benutzernamen der E-Mail-Adresse &lt;br /&gt;
  à z.B. jane.smith@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
# Entfernen von &amp;quot;+&amp;quot; (ASCII-Code 43) und alle nachfolgenden Zeichen aus dem Benutzernamen der E-Mail-  Adresse &lt;br /&gt;
  à  z.B. janesmith+test@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Die Positionierung der Platzhaltercontainer der Anzeigen in der Publisher Seite erfolgt nach dem im Voraus abgestimmten Vertaggungsplan.&lt;br /&gt;
Die eigentliche Integration der Container sollte dem folgenden Muster gemäß geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_[N U M M E R]&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist. Mögliche Werte: &#039;&#039;&#039;desktop | tablet | mobile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen Signalfunktionen==&lt;br /&gt;
&lt;br /&gt;
===AdController.finalize(..)===&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===IQDComplete() - Page-Load Signal===&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=358</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=358"/>
		<updated>2026-02-16T14:13:36Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Für das Hosting und den unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Sollte die zuvor genannte Variante aus technisch-organisatorischen Gründen nicht möglich sein, bitte Kontakt mit uns aufnehmen. In Absprache kann in Ausnahmefällen hiervon abgewichen werden. Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
      let mode = &#039;live&#039;;&lt;br /&gt;
      const currentUrlSearchParams = new URLSearchParams(window.location.search);&lt;br /&gt;
&lt;br /&gt;
      if (currentUrlSearchParams.has(&#039;iqdeployment&#039;)) {&lt;br /&gt;
        mode = currentUrlSearchParams.get(&#039;iqdeployment&#039;).replace(/\W/g, &#039;&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return mode;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;,&lt;br /&gt;
        userData: {&lt;br /&gt;
           hashedEmail: &amp;quot;[siehe Erläuterung unten]&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpolitik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Achtung:&#039;&#039;&#039;&amp;lt;/span&amp;gt; Es fehlt absichtlich level1, da dieser Teil der Adunit von der iqdigital innerhalb des Adcontrollers festgelegt wird.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: userData====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;userData&amp;quot; ist das Sammelobjekt für alle nötigen UserInformationen sowohl im  Rahmen von Clean Room Cases als auch unserer ID-Lösungen.&lt;br /&gt;
&lt;br /&gt;
=====Schlüssel: userData:hashedEmail=====&lt;br /&gt;
&lt;br /&gt;
Vorherige Normalisierung  und Übergabe von E-Mail Adressen (Hashed E-Mail SHA256) über Publisher-CMS-/Mandantenobjekt (AdController), nach User Anmeldung/ Newsletter Registrierung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Normalisierung&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Vor dem Hashing der E-Mail-Adresse Normalisierung der Zeichenfolge, indem „überflüssige“ Zeichen entfernt werden:&lt;br /&gt;
&lt;br /&gt;
# Entfernen führender und nachgestellter Leerzeichen&lt;br /&gt;
# Alle ASCII-Zeichen in Kleinbuchstaben umwandeln&lt;br /&gt;
# Entfernen von &amp;quot;.&amp;quot; (ASCII-Code 46) aus dem Benutzernamen der E-Mail-Adresse &lt;br /&gt;
  à z.B. jane.smith@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
# Entfernen von &amp;quot;+&amp;quot; (ASCII-Code 43) und alle nachfolgenden Zeichen aus dem Benutzernamen der E-Mail-  Adresse &lt;br /&gt;
  à  z.B. janesmith+test@gmail.com wird normalisiert zu janesmith@gmail.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Die Positionierung der Platzhaltercontainer der Anzeigen in der Publisher Seite erfolgt nach dem im Voraus abgestimmten Vertaggungsplan.&lt;br /&gt;
Die eigentliche Integration der Container sollte dem folgenden Muster gemäß geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_[N U M M E R]&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist. Mögliche Werte: &#039;&#039;&#039;desktop | tablet | mobile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen Signalfunktionen==&lt;br /&gt;
&lt;br /&gt;
===AdController.finalize(..)===&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===IQDComplete() - Page-Load Signal===&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Einbau_des_Google_Mobile_Ads_SDK&amp;diff=282</id>
		<title>Einbau des Google Mobile Ads SDK</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Einbau_des_Google_Mobile_Ads_SDK&amp;diff=282"/>
		<updated>2023-06-20T11:54:06Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Dokumentation dient dazu den Einbau des Google Mobile Ads SDK (GMA SDK) und die Werbeintegration der iq digital zu erklären. Sie geht dabei auf notwendige und wichtige Eigenheiten ein und versucht übliche Missverständnisse aufzuklären.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation beginnt dabei mit dem GMA SDK und allgemeinen Informationen, welche für alle Werbeformen gelten, die in der App laufen sollen. Darauf folgen Werbeform spezifische Erklärungen und zum Abschluss werden werbeform spezifische Events erklärt, welche die App berücksichtigen muss.&lt;br /&gt;
&lt;br /&gt;
==Offizielle Dokumentation zum Google Mobile Ads SDK==&lt;br /&gt;
Das Google Mobile Ads SDK (GMA SDK) bringt alles mit, was für eine Werbeausspielung in nativen Apps benötigt wird.&lt;br /&gt;
&lt;br /&gt;
===Getting Started zum Google Mobile Ads SDK===&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start GMA SDK iOS Getting Started]&lt;br /&gt;
&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/android/quick-start GMA SDK Android Getting Started]&lt;br /&gt;
&lt;br /&gt;
===Download des Google Mobile Ads SDK===&lt;br /&gt;
====Android====&lt;br /&gt;
Das GMA SDK ist in den Android Play Services integriert und deshalb auf den Android Geräten vorhanden. &lt;br /&gt;
&lt;br /&gt;
====iOS====&lt;br /&gt;
Für iOS kann das GMA SDK hier heruntergeladen werden:&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/ios/download Download iOS]&lt;br /&gt;
&lt;br /&gt;
===Ad-Manager vs. Admob===&lt;br /&gt;
Die Dokumentation zum Google Mobile Ads SDK gibt es in zwei Varianten: für Ad-Manager- und Admob-Nutzer. Die iq digital ist ein Ad-Manager Kunde, deswegen muss unbedingt darauf geachtet werden, dass in der Browser-URL https://developers.google.com/ad-manager/... enthalten ist. Die Admob Doku unterscheidet sich leicht von der Ad-Manager Doku.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kurze Einführung in den Lebens-Zyklus einer Werbeausspielung mit dem GMA SDK==&lt;br /&gt;
Am Beispiel einer Banner-Werbeausspielung wird hier kurz der Lebens-Zyklus einer Werbeausspielung erklärt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GMA_SDK.png|800px|thumbnail|Übersicht Workflow der Werbeausspielung mit GMA SDK]]&lt;br /&gt;
&lt;br /&gt;
===Request===&lt;br /&gt;
Das Adrequest wird in der App zusammengestellt und besteht aus mehreren Komponenten. Für eine erfolgreiche Werbeausspielung sind folgende Komponenten wichtig:&lt;br /&gt;
;Consent String:Die App benötigt vom Nutzer einen gültigen Consent für die Werbeausspielung. Dabei sind neben mehreren relevanten Purposes auch der Vendor 755 Google Advertising Products notwendig (s.u.)&lt;br /&gt;
;Creative-Sizes:In den meisten Fällen benutzen wir &#039;&#039;&#039;multisize&#039;&#039;&#039;-Adrequests. Das bedeutet, dass das Adrequest mehrere Creative Größen enthält und der Adserver daraufhin prüft, ob er ein Creative für eine dieser Größen zur Verfügung hat. Beispiele sind z.B. 320x1, 320x53, 320x80, 320x106, 320x160 etc.&lt;br /&gt;
;Adunit:Die Adunit ist die Adresse der Werbeplatzierung. Damit weiß der Adserver, auf welcher Seite eine Werbeausspielung erfolgt. Die Adunit ist für alle Adrequests eines Pagerequests gleich. Beispiel: /183/Rheinischer_Kurier_ios_phone/homepage &lt;br /&gt;
;Keywords (optional):Keywords sind Key-Value Paare und können eine Werbeplatzierung um weitere Informationen anreichern, die für eine gezielte Werbeausspielung notwendig sind. Die Werbeplatzierungen der iq digital enthalten alle eine bestimmte Bezeichnung, welche über die Keywords dem Adserver mitgegeben wird. Beispiel: kw=iqadtile1,digtransfrom&amp;amp;tile=1&amp;amp;doc=homepage&lt;br /&gt;
&lt;br /&gt;
===Adserver Google Admanager 360===&lt;br /&gt;
Wenn der Adserver gültigen Consent besitzt, prüft ein Verteilungsalgorithmus, ob eine oder mehrere Werbebuchungen für die Adunit, Creative sizes und Keywords vorliegen. Ist dies der Fall wählt der Adserver die beste dafür aus. Sind mehrere Buchungen gleich wichtig, wählt er zufällig eine davon aus. Nur im Falle keiner Buchung würde er eine &#039;&#039;&#039;no ad&#039;&#039;&#039; oder &#039;&#039;&#039;no fill&#039;&#039;&#039; Meldung ausgeben, die besagt, dass für die Kombination aus adunit, creative size und Keywords keine Buchung existiert.&lt;br /&gt;
&lt;br /&gt;
===Ausspielung innerhalb der App===&lt;br /&gt;
Die App lädt die Response des Adservers, die aus dem Template-Code und den Creative Komponenten besteht. Dabei ist zu beachten, dass der Werbecontainer auf die creative size des ausgelieferten Creatives vergrößert wird. Für Fullscreen Ads muss diese Größe von der App nachträglich auf die Display Viewport Größe (also device independent pixel) angepasst werden. Im Falle einer Banner Anzeige bekommt die App meist nach dem Ladevorgang ein oder mehrere setsize-Events über den einzubauenden AppEventHandler und muss den Werbecontainer auf die neue Größe anpassen, sofern diese sich von der creative size unterscheidet.&lt;br /&gt;
&lt;br /&gt;
===Impression-Zählung===&lt;br /&gt;
Eine Impression Zählung, die misst, dass ein Ad angesehen wurde, wird vom GMA SDK automatisch abgeschickt, sobald mindestens 1px im sichtbaren Bereich des Displays ist.&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Informationen==&lt;br /&gt;
===Adunits (Zonierung)===&lt;br /&gt;
Der Google Ad Manager benutzt zur Adressierung der Seiten Adunits, die sich wie folgt zusammensetzen können:&lt;br /&gt;
*/netzwerkId/level1&lt;br /&gt;
*/netzwerkId/level1/seitentyp&lt;br /&gt;
*/netzwerkId/level1/level2/seitentyp&lt;br /&gt;
*/netzwerkId/level1/level2/level3/seitentyp&lt;br /&gt;
*usw.&lt;br /&gt;
&lt;br /&gt;
====Begriffserklärung====&lt;br /&gt;
;netzwerkId:Hier ist immer die Netzwerk ID der iq digital einzugeben: 183&lt;br /&gt;
;level1:Dies ist die Bezeichnung der App im Google Ad Manager und wird von der iq digital vorgegeben. Die Bezeichnung besteht aus &amp;lt;appname&amp;gt;_app_&amp;lt;plattform&amp;gt;_&amp;lt;gerätetyp&amp;gt;.&lt;br /&gt;
:;appname:Der Name der App&lt;br /&gt;
:;plattform:Das Betriebsystem, also &#039;&#039;ios&#039;&#039; oder &#039;&#039;android&#039;&#039;&lt;br /&gt;
:;gerätetyp:Der Gerätetyp, also &#039;&#039;&#039;phone&#039;&#039;&#039; oder &#039;&#039;tablet&#039;&#039;&lt;br /&gt;
;level2:Dies ist die Bezeichnung einer Rubrik der App, z.B. &#039;&#039;politik&#039;&#039;&lt;br /&gt;
;level3 (usw.):Dies ist die Bezeichnung für eine Unterrubrik, z.B. im Falle von &#039;&#039;politik&#039;&#039; als level2 wäre &#039;&#039;ausland&#039;&#039; eine Unterrubrik für level3. Level4 und höher sind weitere tiefere Verzweigungen der App, diese werden im Normalfall nicht als Adunits angelegt. Solche Seiten würden dann über das übergeordnete level3 vermarktet werden. Beispiel: Eine Seite &#039;&#039;politik/ausland/usa&#039;&#039; ist zu speziell, um sie einzeln zu vermarkte. In so einem Fall ist es sinnvoll, dass sie nur bis level3, also als &#039;&#039;politik/ausland&#039;&#039;, vertaggt wird.&lt;br /&gt;
;seitentyp:In Apps mit Banner-Anzeigen (z.B. News Apps) bezeichnet &#039;&#039;seitentyp&#039;&#039; die unterschiedlichen Seitentypen, also ob es sich z.B. um eine Übersichts-, Artikel- oder Bildergalerieseite handelt. Übliche Werte dafür sind &#039;&#039;homepage&#039;&#039;, &#039;&#039;index&#039;&#039;, &#039;&#039;artikel&#039;&#039;, &#039;&#039;bildgal&#039;&#039;. In Apps mit Fullscreen-Anzeigen (z.B. epaper oder Zeitungs Apps) werden mit &#039;&#039;seitentyp&#039;&#039; die unterschiedlichen Anzeigeplätze innerhalb der Rubrik gemeint, also ob es sich z.B. erste, zweite oder dritte Swipe Anzeige handelt. Übliche Werte sind &#039;&#039;openingpage&#039;&#039;, &#039;&#039;swipe_1&#039;&#039;, &#039;&#039;swipe_2&#039;&#039;, &#039;&#039;swipe_3&#039;&#039; usw.&lt;br /&gt;
&lt;br /&gt;
====Beispiel für die fiktive Rheinischer Kurier News App mit Banner-Anzeigen:====&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone /homepage&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/index&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/artikel&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/bildgal&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/index&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/artikel&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/bildgal&lt;br /&gt;
&lt;br /&gt;
====Beispiel für die fiktive Rheinischer Kurier Epaper iPad App mit Fullscreen-Anzeigen:====&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/preloading_ad&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/openingpage&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_1&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_2&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_3&lt;br /&gt;
&lt;br /&gt;
{{Warnung|text=Der Adserver DFP erlaubt keine Sonderzeichen in den Adunits mit Ausnahme des Unterstrichs &amp;quot;_&amp;quot;. Auch Umlaute und ß sind nicht erlaubt. level2, level3 und seitentyp sollten auch komplett kleingeschrieben werden.&lt;br /&gt;
Generell sind die Adunits vom Google Ad Manager so gedacht, dass sie sich dynamisch aus dem CMS des Mandanten generieren lassen. Sollte das CMS so angelegt sein, dass eine andere Benennung sinnvoll erscheint, muss die iq digital frühzeitig kontaktiert werden, damit eine sinnvolle Lösung für alle Beteiligten gefunden werden kann.&lt;br /&gt;
Bei Rubriken mit einem &amp;quot;und&amp;quot; bzw. einem &amp;quot;&amp;amp;&amp;quot; im Namen, wie z.B. Wirtschaft &amp;amp; Politik, bietet es sich an, nur die Hauptwörter getrennt mit einem Unterstrich aufzuführen, also wirtschaft_politik.}}&lt;br /&gt;
&lt;br /&gt;
===Creative Sizes===&lt;br /&gt;
Im Google Ad Manager stehen die Creative Sizes für die Werbemittel-Größen. Dabei ist es möglich dass die tatsächlich ausgespielte Größe eines Werbemittels von der CreativeSize abweicht (in so einem Fall wird von Pseudogröße gesprochen). Die App muss für ein Adrequest der entsprechenden Platzierung alle zugehörigen Creative Sizes abfragen. Die oft lange Liste aus Größen ergibt sich aus den vielen möglichen unterschiedlichen Werbeformen und den Unterschieden in direkter und programmatischer Vermarktung.&lt;br /&gt;
&lt;br /&gt;
Bei Fullscreen Ad und Preloading Ad Platzierungen werden meist Größen für Portrait- und Landscape-Modus gemeinsam abgefragt.&lt;br /&gt;
&lt;br /&gt;
====Beispiele für Creative Sizes einer Banner Platzierung:====&lt;br /&gt;
99x1, 320x1, 320x50, 320x53, 320x80, 320x160, 320x320, 300x50, 300x75, 300x100, 300x150, 300x250&lt;br /&gt;
(In diesem Beispiel sind 99x1 und 320x1 Pseudogrößen. 99x1 ruft eine Ausbuchung vom Adserver, die die Werbeplatzierung ausblenden lässt. 320x1 ist eine historische Pseudogröße, welche in seltenen Fällen für von der Norm abweichende Werbemittel auf der Platzierung iqadtile1 verwendet wird. Jede Banner-Platzierung hat eine vergleichbare Pseudogröße der Form 320xY mit Y als Platzierungsbezeichnung, z.B. 320x1, 320x3, 320x4, 320x8 etc.&lt;br /&gt;
&lt;br /&gt;
====Beispiele für Creative Sizes einer Fullscreen Platzierung auf einem Android Tablet:====&lt;br /&gt;
310x480, 480x310, 750x1024, 1024x750&lt;br /&gt;
&lt;br /&gt;
====Links zu Creative Sizes im Google Mobile Ads SDK:====&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#multiple_ad_sizes&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#multiple_ad_sizes&lt;br /&gt;
und&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#custom_ad_sizes&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#custom_ad_sizes&lt;br /&gt;
&lt;br /&gt;
===Keywords (Anhängen von Key-Value-Paaren)===&lt;br /&gt;
Ein Adrequest bekommt als CustomTargeting immer eine Gruppe aus Key-Value Paaren. Dabei können mehrere Werte (Values) mit einem Komma separiert sein. &lt;br /&gt;
Diese Keywords haben mehrere Funktionen:&lt;br /&gt;
*bestimmte Buchungen liefern nur aus, wenn diese Keywords existieren (z.B. bei bestimmten Produkten oder auch bei Testschaltungen)&lt;br /&gt;
*Buchungen können über solche Keywords von der Auslieferung ausgeschlossen werden (z.B. um fehlerhafte Darstellungen einer Werbebuchung zu verhindern)&lt;br /&gt;
*solche Keywords erlauben detaillierte Auslieferungs-Berichte (Reports)&lt;br /&gt;
&lt;br /&gt;
Die iq digital benutzt dabei bestimmte Key-Value-Paare. Hier sind die wichtigsten Keys erklärt:&lt;br /&gt;
;kw:Generelle Keyword Liste. Hier sind meist mehrere Werte mit Komma separiert. Üblich sind einige Legacy-Werte (z.B. digtransform,nospa,enozqi). Hinzu kommen Bezeichner für die App oder die Seite (z.B. Rheinischer_Kurier_app_ios_phone), sowie die Werbeplatzierungsbezeichnung (z.B. iqadtile3).&lt;br /&gt;
;tile:Die Nummer der Werbeplatzierung. Im Falle eines iqadtile3 also als Wert 3.&lt;br /&gt;
;doc:Die Bezeichnung des Seitentyps. Gültige Werte sind homepage, index, artikel, bildgal&lt;br /&gt;
;iqadtype:Die Angabe der Plattform. Gültige Werte sind online, mew, app, amp&lt;br /&gt;
;appver:Die Bezeichnung der Appversions-Nummer (s.u.)&lt;br /&gt;
&lt;br /&gt;
Angaben welche Keywords für welche Platzierung verwendet werden sollen, finden sich in der creative_sizes_and_keywords.xlsc Tabelle, die von der iq digital zu Projektstart zur Verfügung gestellt wird.&lt;br /&gt;
&lt;br /&gt;
====Links zum CustomTargeting im Google Mobile Ads SDK====&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/targeting#custom_targeting&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/targeting#custom_targeting&lt;br /&gt;
&lt;br /&gt;
===Debugging===&lt;br /&gt;
[[Datei:Easteregg dialog.png|300px|thumbnail|Beispiel aus einer Android App mit Textfeld für Keywords und Checkbox für USB Debugging]]&lt;br /&gt;
Es muss eine &amp;quot;Easter-Egg&amp;quot;-Funktion in die App eingebaut werden, damit die iq digital Probleme und neue Werbeformen innerhalb der Live App (Version aus dem App- bzw. Playstore) testen kann. Der Adserver DFP bietet die Möglichkeiten Testschaltungen über ein Keyword in der App auszuspielen. &lt;br /&gt;
&lt;br /&gt;
In einem selten frequentierten Bereich der App, wie z.B. dem Impressum, sollte es daher die Möglichkeit für Eingeweihte geben, einen kleinen Dialog aufzurufen. Durch diesen kann man ein selbst gewähltes Keyword jedem zukünftigen Adrequest anhängen. Gleichzeitig oder durch das Aktivierung einer Checkbox kann der USB-Debug-Modus, um die Werbe Webviews in der Android App auf dem Desktop Chrome zu inspizieren, aktiviert werden. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WebView.setWebContentsDebuggingEnabled(true);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Danach kann man unter Android die Webviews der App im Desktop Chrome mit chrome://inspect einsehen. &lt;br /&gt;
Dies ermöglicht Fehler in der Werbedarstellung besser zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Ohne ein Debug Easter Egg in der App kann nach Livegang keine Testschaltung aufgesetzt werden und es können auch keine Probleme analysiert werden. Dies würde die Wartung der App von Seiten der iq digital verhindern und auch dem Mandanten keine Möglichkeit geben, selber seine App mit Testwerbung zu überprüfen.&lt;br /&gt;
Die Keyword-Funktion dient daher, den Personenkreis einzuschränken, der die Testschaltungen zu Gesicht bekäme. &lt;br /&gt;
&lt;br /&gt;
Das Anhängen der Keywords ist beim Punkt [[#Anhängen von Key-Value-Paaren]] genauer erklärt.&lt;br /&gt;
&lt;br /&gt;
Mehrfache Keywords werden durch Kommata separiert.&lt;br /&gt;
&lt;br /&gt;
Es gibt vielfältige Optionen, wie das Easter-Egg aktiviert werden kann. Mehrfache/unsinnige Taps auf UI-Elemente oder eine ganz spezielle Eingabe ins Suchfeld seien hier beispielhaft genannt. Die iq digital erlaubt sich aber die Vorgabe, dass unter Android und iOS das  Debug-Easter-Egg identisch aktiviert wird. Bei der Art der Aktivierung des Debug-Easter-Egg stehen wir gerne beratend zur Seite.&lt;br /&gt;
&lt;br /&gt;
===Wichtige Hinweise zu dieser Anleitung===&lt;br /&gt;
Die Adunits für die Werbeplatzierungen werden von uns erst zu Projektstart erstellt und mit Testwerbung belegt. Anschließend werden die Adunits an den Mandanten übermittelt.&lt;br /&gt;
Bitte nicht mit der im SDK fest eingebauten Logik für Test-Werbemittel arbeiten. Diese entspricht nicht der Art und Weise wie die von der iq digital vermarktete Werbung funktioniert und führt zu Missverständnissen.&lt;br /&gt;
Stattdessen sind auf den Adunits permanent Buchungen mit Test-Werbemitteln aktiv welche über ein spezielles Test-Keyword im Adrequest vom Adserver ausgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
===Ansprechpartner iq digital===&lt;br /&gt;
Die iq digital steht für Fragen und Kommentare gerne zur Verfügung. Sollten wir einmal nicht weiterhelfen können, ist es uns möglich einen Entwickler von Google als Ansprechpartner in die Diskussion mit einzubeziehen.&lt;br /&gt;
&lt;br /&gt;
====Tim Lohmann (Mobile Developer Ad Technology)====&lt;br /&gt;
;Telefon:+49 211 887 2336&lt;br /&gt;
;E-Mail:tim.lohmann@iqdigital.de&lt;br /&gt;
&lt;br /&gt;
===Wichtige Dokumente===&lt;br /&gt;
====Liste der Creative Sizes und Keywords für jede  Platzierung:====&lt;br /&gt;
*&amp;lt;datum&amp;gt;_dfp_creative_sizes.xlsx&lt;br /&gt;
====Liste der Adunits:====&lt;br /&gt;
(diese dienen nur als Orientierungshilfe. Die Apps sollten diese Zonen dynamisch aus dem CMS generieren)&lt;br /&gt;
&amp;lt;appname&amp;gt; muss durch den entsprechenden App Namen ersetzt werden.&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_android_tablet.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ios_tablet.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ android_phone.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ios_phone.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Preloading Ad==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist eine Display ausfüllende Anzeige, die während des Ladescreen (Splashscreen) der App angezeigt wird. Sie wird für 5s angezeigt und schließt dann automatisch. In einer Ecke wird ein Close-Button angezeigt, um vorzeitig zum Inhalt der App zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Preloading Ad 1.png|x300px]]&lt;br /&gt;
[[Datei:Preloading Ad 2.png|300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung legt sich wie ein Overlay über den Splash-Screen der App. Im Hintergrund kann die App den Content laden.&lt;br /&gt;
|template=&lt;br /&gt;
*skaliert Werbemittel bei Beibehaltung des Seitenverhältnisses entsprechend der Abmaße des Werbecontainers&lt;br /&gt;
*schließt das Werbemittel nach 5s&lt;br /&gt;
*positioniert und zentriert das Werbemittel&lt;br /&gt;
*zeigt in einer Ecke einen Close-Button an, mit dem der Nutzer jederzeit zum Content zurückkehren kann.&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: skaliert die Werbemittel enstprechend der neuen Maße. Dies kann mehrere hundert Millisekunden dauern, bis alle neuen Maße feststehen und vom Webviewbrowser zur Verfügung gestellt werden.&lt;br /&gt;
Durch die Skalierung können je nach Display am Rand schwarze oder weiße Balken entstehen. Dies passiert immer dann, wenn das Display ein anderes Seitenverhältnis als die Werbemittel hat.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet das Adrequest während des Splash-Screens&lt;br /&gt;
*im Falle einer Buchung: &lt;br /&gt;
**erzeugt das Interstitial mit Hilfe des GMA SDKs&lt;br /&gt;
**vergrößert den Werbecontainers auf Display-Größe&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: passt die Werbeseite und den Werbecontainer an die neuen Display-Maße an&lt;br /&gt;
*bereitet im Hintergrund weiter den Content vor&lt;br /&gt;
*im Falle &#039;&#039;&#039;keiner&#039;&#039;&#039; Buchung: wird normal der Content geladen&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App wird vom Nutzer gestartet&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt das Interstitial&lt;br /&gt;
#Werbetemplate skaliert Werbemittel in dem Container&lt;br /&gt;
#nach 5s schließt sich das Ad automatisch und der Content dahinter wird sichtbar&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet, dass er keine Werbebuchung hat&lt;br /&gt;
#App lädt ganz normal den Content&lt;br /&gt;
|creativesizes=&lt;br /&gt;
;Smartphone:320x480 bzw. 480x320&lt;br /&gt;
;Tablet:768x1024 bzw. 1024x768&amp;lt;br /&amp;gt;(bei Android auch zusätzlich: 320x480 bzw. 480x320)&lt;br /&gt;
{{Warnung|text=Die Creativesizes sind Pseudogrößen, sie entsprechen nicht den tatsächlichen Abmaßen des Werbemittels.}}&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:iqadtilePre&lt;br /&gt;
;tile:0&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Fullscreen Anzeigen (auch Swipe Anzeigen oder Swipe-Ads genannt)==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist eine Display ausfüllende Anzeigen, die zwischen zwei regulären Content-Seiten in der App angezeigt wird. Sie lässt sich horizontal wie die übrigen Content-Seiten swipen und wird von keinen Teilen der App (wie App-Header oder -Footer) überlagert. Sollte der Nutzer ein Orientationchange-Event erzeugen, passt sich die Anzeige dem neuen Seitenverhältnis an.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fullscreen Ad 1.png|x300px]]&lt;br /&gt;
[[Datei:Fullscreen Ad 2.png|300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung ist dynamisch zwischen zwei Content-Seiten eingebettet. Dabei befindet sich die Werbeplatzierung immer rechts neben der Seite, die Ihr im Content zugeordnet ist, z.B. Politik/swipe_1 meint, dass zuerst die 1. Politik-Content-Seite angezeigt wird und beim nächsten Swipe die Werbe-Seite erscheint &lt;br /&gt;
|template=&lt;br /&gt;
*skaliert Werbemittel bei Beibehaltung des Seitenverhältnisses entsprechend der Abmaße des Werbecontainers&lt;br /&gt;
*positioniert und zentriert das Werbemittel&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: skaliert die Werbemittel enstprechend der neuen Maße. Dies kann mehrere hundert Millisekunden dauern, bis alle neuen Maße feststehen und vom Webviewbrowser zur Verfügung gestellt werden.&lt;br /&gt;
Durch die Skalierung können je nach Display am Rand schwarze oder weiße Balken entstehen. Dies passiert immer dann, wenn das Display ein anderes Seitenverhältnis als die Werbemittel hat.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet das Adrequest 1-2 Content-Seiten vor der Platzierung ab, damit der Adserver Zeit genug hat, die Werbung zu liefern&lt;br /&gt;
*erzeugt dynamisch eine Werbeseite im Seitenfluss rechts neben der zugeordneten Content-Seite&lt;br /&gt;
*im Falle einer Buchung: vergößert den Werbecontainers auf Display-Größe&lt;br /&gt;
*blendet App-Header und -Footer aus (falls erforderlich)&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: passt die Werbeseite und den Werbecontainer an die neuen Display-Maße an&lt;br /&gt;
*im Falle &#039;&#039;&#039;keiner&#039;&#039;&#039; Buchung: entfernt die Werbeseite aus dem Seitenfluss&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt dynamisch die Werbeseite&lt;br /&gt;
#Werbecontainer wird auf die Display-Abmaße aufgezogen&lt;br /&gt;
#Werbetemplate skaliert Werbemittel in dem Container&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet, dass er keine Werbebuchung hat&lt;br /&gt;
#App erzeugt &#039;&#039;&#039;keine&#039;&#039;&#039; Werbeseite bzw. entfernt eine zuvor erzeugte Werbeseite aus dem Seitenfluss&lt;br /&gt;
|creativesizes=&lt;br /&gt;
;Smartphone:310x480 bzw. 480x310&lt;br /&gt;
;Tablet:750x1024 bzw. 1024x750&amp;lt;br /&amp;gt;(bei Android auch zusätzlich: 310x480 bzw. 480x310)&lt;br /&gt;
{{Warnung|text=Die Creativesizes sind Pseudogrößen, sie entsprechen nicht den tatsächlichen Abmaßen des Werbemittels.}}&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:iqadtileFull&lt;br /&gt;
;tile:1&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Banner-Anzeigen==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist ein Banner innerhalb einer Content-Seite. Je nach Werbeform kann diese Anzeige mehr oder weniger Interaktivität für den Endnutzer besitzen. Sie kann anmiert oder eine komplexe HTML-Anzeige sein. Es ist auch möglich dass die Anzeige durch bestimmte Ereignisse sich in der Größe verändert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Mobile High Impact Ad.png|x300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung ist zwischen Content-Elemente einer Seite platziert und erfordert eine Anzeigenkennzeichnung &amp;quot;Anzeige&amp;quot; oberhalb der Platzierung. Üblicherweise befinden sich mehrere Platzierungen innerhalb einer Seite.&lt;br /&gt;
|template=&lt;br /&gt;
*kümmert sich um die Funktionalität, welche je nach Werbeform simpel oder komplex sein kann.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet die Adrequests für alle Platzierungen einer Seite&lt;br /&gt;
*baut für jede Platzierung eine Anzeigenkennzeichnung &amp;quot;Anzeige&amp;quot; oberhalb der Platzierung ein&lt;br /&gt;
*erstellt den Werbecontainer mit Größe, welche in der Antwort vom Andserver auf das Adrequest mitgeliefert wird&lt;br /&gt;
*lauscht mit dem EventListener auf mögliche setsize- oder noad-Events und verändert den Werbecontainer entsprechend.&lt;br /&gt;
*im Falle einer Ausbuchung:&lt;br /&gt;
**empfängt sie ein setsize-Event muss sie die Werbeplatzierung und den Werbecontainer an die neue Größe anpassen, sofern sich diese von der aktuellen Größe unterscheidet&lt;br /&gt;
**empfängt sie ein noad-Event, muss sie die Werbeplatzierung und die zugehörige Anzeigenkennzeichnung komplett entfernen bzw. ausblenden&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt Werbecontainer mit der Größe, die in der Response des Adservers enthalten ist&lt;br /&gt;
#eventuell muss der Werbecontainer auf Grund eines setsize-Events angepasst werden&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Ausbuchung als Werbebuchung&lt;br /&gt;
#App empfängt eine Response mit der Größe 99x1 und erhält kurze Zeit später ein noad-Event&lt;br /&gt;
#App blendet Werbeplatzierung und Anzeigenkennzeichnung bis zum nächsten Pagerequest aus&lt;br /&gt;
|creativesizes=&lt;br /&gt;
320x50, 320x53, 320x80, 320x106, 320x160, 320x320, 320x416, 320x460, 300x50, 300x75, 300x100, 300x150, 300x200, 300x250, 300x600&lt;br /&gt;
Weitere Größen sind möglich. Je nach Platzierung wird nur ein Auszug der Größenliste im Adrequest verwendet. Eine genaue Zuordnung erfolgt in einem separaten Dokument.&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:nospa, enozqi, digtransform, iqadtileX*&lt;br /&gt;
;tile:X*&lt;br /&gt;
X entspricht dabei der Nummer der Platzierung, z.B. iqadtile1, iqadtile3, iqadtile4, iqadtile99, iqadtile8&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Dokumentation der iq digital App Events==&lt;br /&gt;
Die Werbetemplates der iq digital senden in bestimmten Situationen Events an die App. Die App muss auf diese Events reagieren und gemäß der folgenden Spezifikation den Werbecontainer verändern. Die App Events bestehen dabei immer aus dem Namen und einem &amp;quot;data&amp;quot;-String.&lt;br /&gt;
&lt;br /&gt;
===Wichtige Links in der GMA SDK Dokumentation===&lt;br /&gt;
*[https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#app_events GMA SDK iOS App Events]&lt;br /&gt;
*[https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#app_events GMA SDK Android App Events]&lt;br /&gt;
&lt;br /&gt;
===setsize – Event===&lt;br /&gt;
Das setsize-Event wird von den Werbetemplates der iq digital aufgerufen, um die Größe des Adviews der Werbeplatzierung zu verändern.&lt;br /&gt;
Der &amp;quot;data&amp;quot;-String hat das Format &#039;&#039;&#039;&amp;quot;width:height&amp;quot;&#039;&#039;&#039; für eine sofortige Änderung der Größe.&lt;br /&gt;
&lt;br /&gt;
=====Parameter=====&lt;br /&gt;
Die Parameter werden mit einem Doppelpunkt von einander getrennt.&lt;br /&gt;
;width:Die neue Breite des Adviews in Pixel  (Device-Independent-Pixel) als ganze Zahl.&lt;br /&gt;
;height:Die neue Höhe des Adviews in Pixel  (Device-Independent-Pixel) als ganze Zahl.&lt;br /&gt;
{{Warnung|text=Ausnahme: Für eine Anpassung auf die maximal verfügbare Breite oder Höhe wird der Wert &#039;&#039;&#039;max&#039;&#039;&#039; verwendet. Mit maximaler verfügbare Breite bzw. Höhe ist im Normalfall die Displaybreite bzw. -Höhe gemeint. Sollte eine App hier zwingende Abweichungen haben, wie einen notwendigen Rand, muss dies unbedingt &#039;&#039;&#039;frühzeitig mit iq digital&#039;&#039;&#039; besprochen werden.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispielaufrufe:&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;320:80&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview bekommt die neue Größe 320x80 Pixel&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;320:240&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview bekommt die neue Größe 320x240 Pixel&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;max:160&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview wird auf die maximal verfügbare Breite und eine Höhe von 160 Pixel angepasst&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;max:max&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview wird auf die maximal verfügbare Breite und die maximal verfügbare Höhe angepasst&lt;br /&gt;
&lt;br /&gt;
===noad – Event===&lt;br /&gt;
Das noad-Event wird von den Werbetemplates der iq digital aufgerufen, um der App zu signalisieren, dass für die Platzierung keine Buchung vorliegt und die App die Werbeplatzierung &#039;&#039;&#039;und die zugehörige Anzeigenkennzeichnung&#039;&#039;&#039; entfernen soll.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;data&amp;quot;-String hat für dieses Event keine Bedeutung und kann ignoriert werden. Da das AppEventListener Interface von Google eine @NonNull Annotation für data hat, wird beim noad-Event einfach der Wert &amp;quot;noad&amp;quot; für data übergeben, da der leere String von Google als null umgewandelt wird.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Ad Technology]][[Kategorie:APP]]&lt;br /&gt;
[[en:Integration of the Google Mobile Ads SDK]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=281</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=281"/>
		<updated>2023-04-14T09:47:17Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: /* Anzeigen-Containermodell */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Alternativ zum Hosting und unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpoltik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Die Positionierung der Platzhaltercontainer der Anzeigen in der Publisher Seite erfolgt nach dem im Voraus abgestimmten Vertaggungsplan.&lt;br /&gt;
Die eigentliche Integration der Container sollte dem folgenden Muster gemäß geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_[N U M M E R]&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# Das Data Attribute &amp;quot;&#039;&#039;&#039;data-device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist. Mögliche Werte: &#039;&#039;&#039;desktop | tablet | mobile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;[D E V I C E T Y P E]&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen Signalfunktionen==&lt;br /&gt;
&lt;br /&gt;
===AdController.finalize(..)===&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===IQDComplete() - Page-Load Signal===&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=277</id>
		<title>Ad Technology</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=277"/>
		<updated>2023-04-13T09:02:10Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;chapterlist&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;clheader&amp;quot;&amp;gt;Ad Technology&amp;lt;/div&amp;gt;&lt;br /&gt;
*Online/Mobile Web&lt;br /&gt;
*[[Adcontroller]]&lt;br /&gt;
*[[Creative Identifier]]&lt;br /&gt;
*App&lt;br /&gt;
*[[Einbau des Google Mobile Ads SDK]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Banner-Anzeigen]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Fullscreen-Anzeigen]]&lt;br /&gt;
*[[Prebid Mobile SDK in Apps]]&lt;br /&gt;
*[[Akzeptanzkriterien Werbeintegration mit Google Mobile SDK]]&lt;br /&gt;
*AMP&lt;br /&gt;
*[[Aufbau eines amp-ad-Tags]]&lt;br /&gt;
*[[AMP Anzeigenkennzeichnung]]&lt;br /&gt;
*[[Wechsel Prebid Server zu Prebid Server Premium]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Ad Technology]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=(Deprecated)_Adcontroller&amp;diff=276</id>
		<title>(Deprecated) Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=(Deprecated)_Adcontroller&amp;diff=276"/>
		<updated>2023-04-13T08:59:24Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: Die Seite wurde neu angelegt: „==Implementierung AdController-Deployment (API + Konfiguration)==  ===Allgemeine Informationen===  Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.  Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessuale…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Alternativ zum Hosting und unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpoltik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Im neuen Anzeigen-Containermodell werden nicht mehr die Werbeplätze vom Mandanten/Publisher direkt in die Seite integriert, sondern nur noch Platzhalter Div Container an die nach Vertaggungsplan entsprechenden Stellen, in welche dann jeweils IQD die passenden Werbeplätze integriert.&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# 1. Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# 2. Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# 3. Das Data Attribute &amp;quot;&#039;&#039;&#039;data_device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Topbannerkonstrukt in Pos_01 Desktop====&lt;br /&gt;
&lt;br /&gt;
Der Platzhalter für Desktop mit der &amp;quot;data-placement&amp;quot; Nummer &amp;quot;pos_1&amp;quot; stellt unser altes Topbanner-Konstrukt dar und umfasst daher den Einbau mehrerer Werbeplätze (iqadtile1, iqadtile20, iqadtile21). Um dies kenntlich zu machen sind im Vertaggungsplan auch noch &amp;quot;pos_out_1&amp;quot; und &amp;quot;pos_out_2&amp;quot; eingezeichnet.&lt;br /&gt;
Auf Ihren Einbau sollte aber verzichtet werden, da Ihre Funktion bereits komplett von &amp;quot;pos_1&amp;quot; übernommen wird.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_1&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen==&lt;br /&gt;
&lt;br /&gt;
===Signale &amp;amp; Anzeigestruktur===&lt;br /&gt;
&lt;br /&gt;
====AdController.render(..)====&lt;br /&gt;
&lt;br /&gt;
Nach Initialisierung des AdControllers ist dieser bereit für das Absetzen einer Anzeigenanforderung an den AdServer. Auslöser einer Anzeigenanforderung ist die jeweilige Anzeigenplatzierung mit entsprechender AdController.render-Methode. In der Render-Phase des AdControllers werden die Level-Informationen des CMS-Mandanten-Objects an den AdRequest-URL-Builder des AdControllers übergeben und mit weiteren Konfigurationsparametern des Deployments zu einem AdServer-konformen Anzeigen-Request zusammengeführt und versendet.&lt;br /&gt;
&lt;br /&gt;
Welche Anzeigenplatzierungen für das jeweilige Layout Ihrer Website umzusetzen ist, ist im Vorfeld mit iq digital hinsichtlich Vermarktungsmöglichkeiten zu besprechen. Die Anzeigenplatzierung ist durch ein eindeutiges DOM-Element mit exemplarischer id=iqadtileT I L E N U M B E R in Ihrem HTML-MarkUp zu implementieren. Der übergebene Positionsschlüssel innerhalb des AdCongroller.render-Aufrufs bewirkt eine asynchrone Einbindung via DOM-Insertion der gelieferten Anzeige im Zielcontainer&lt;br /&gt;
&lt;br /&gt;
Bitte fügen Sie keinen weitere DOM oder Script-Bestandteile innerhalb dieser Anzeigencontainer ein. Die Anzeigen-Kennzeichnung der Werbeplatzierungen erfolgt optimalerweise durch iq digital. Gerne besprechen wir diesen Punkt gemeinsam mit Ihnen.&lt;br /&gt;
&lt;br /&gt;
====TopBanner Konstrukt====&lt;br /&gt;
&lt;br /&gt;
Anzeigenplatzierung TopBanner Konstrukt, beinhaltet die erste Position iqadtile1 und beide Sky Postionen (bitte 1:1 genauso implementieren)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this construct for the top positions (iqadtile1), the sky right part (iqadtile21) &amp;amp; the left sky part (iqadtile20) and the out-of-page position (iqadtileOOP)--&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileOOP&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;script&amp;gt;&lt;br /&gt;
          AdController.render(&#039;iqadtileOOP&#039;);&lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqd_mainAd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;iqd_align_Ad&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_topAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile1&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_leftAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile20&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_rightAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile21&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile21&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====weitere Anzeigepositionen====&lt;br /&gt;
&lt;br /&gt;
Alle weitere Platzierungen nach folgender Muster umsetzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this pattern for all other positions --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileT I L E N U M B E R&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        if (typeof AdController !== &#039;undefined&#039;) {&lt;br /&gt;
           AdController.render(&#039;iqadtileT I L E N U M B E R&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController.finalize(..)====&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====IQDComplete() - Page-Load Signal====&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=275</id>
		<title>Ad Technology</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=275"/>
		<updated>2023-04-13T08:59:00Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;chapterlist&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;clheader&amp;quot;&amp;gt;Ad Technology&amp;lt;/div&amp;gt;&lt;br /&gt;
*Online/Mobile Web&lt;br /&gt;
*[[Adcontroller]]&lt;br /&gt;
*[[Adcontroller Alt]]&lt;br /&gt;
*[[(Deprecated) Adcontroller]]&lt;br /&gt;
*[[Creative Identifier]]&lt;br /&gt;
*App&lt;br /&gt;
*[[Einbau des Google Mobile Ads SDK]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Banner-Anzeigen]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Fullscreen-Anzeigen]]&lt;br /&gt;
*[[Prebid Mobile SDK in Apps]]&lt;br /&gt;
*[[Akzeptanzkriterien Werbeintegration mit Google Mobile SDK]]&lt;br /&gt;
*AMP&lt;br /&gt;
*[[Aufbau eines amp-ad-Tags]]&lt;br /&gt;
*[[AMP Anzeigenkennzeichnung]]&lt;br /&gt;
*[[Wechsel Prebid Server zu Prebid Server Premium]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Ad Technology]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=274</id>
		<title>Ad Technology</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=274"/>
		<updated>2023-04-13T08:51:00Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;chapterlist&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;clheader&amp;quot;&amp;gt;Ad Technology&amp;lt;/div&amp;gt;&lt;br /&gt;
*Online/Mobile Web&lt;br /&gt;
*[[Adcontroller]]&lt;br /&gt;
*[[Adcontroller Alt]]&lt;br /&gt;
*[[Creative Identifier]]&lt;br /&gt;
*App&lt;br /&gt;
*[[Einbau des Google Mobile Ads SDK]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Banner-Anzeigen]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Fullscreen-Anzeigen]]&lt;br /&gt;
*[[Prebid Mobile SDK in Apps]]&lt;br /&gt;
*[[Akzeptanzkriterien Werbeintegration mit Google Mobile SDK]]&lt;br /&gt;
*AMP&lt;br /&gt;
*[[Aufbau eines amp-ad-Tags]]&lt;br /&gt;
*[[AMP Anzeigenkennzeichnung]]&lt;br /&gt;
*[[Wechsel Prebid Server zu Prebid Server Premium]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Ad Technology]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=273</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=273"/>
		<updated>2023-04-13T08:49:19Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Alternativ zum Hosting und unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpoltik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Im neuen Anzeigen-Containermodell werden nicht mehr die Werbeplätze vom Mandanten/Publisher direkt in die Seite integriert, sondern nur noch Platzhalter Div Container an die nach Vertaggungsplan entsprechenden Stellen, in welche dann jeweils IQD die passenden Werbeplätze integriert.&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# 1. Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# 2. Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# 3. Das Data Attribute &amp;quot;&#039;&#039;&#039;data_device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Topbannerkonstrukt in Pos_01 Desktop====&lt;br /&gt;
&lt;br /&gt;
Der Platzhalter für Desktop mit der &amp;quot;data-placement&amp;quot; Nummer &amp;quot;pos_1&amp;quot; stellt unser altes Topbanner-Konstrukt dar und umfasst daher den Einbau mehrerer Werbeplätze (iqadtile1, iqadtile20, iqadtile21). Um dies kenntlich zu machen sind im Vertaggungsplan auch noch &amp;quot;pos_out_1&amp;quot; und &amp;quot;pos_out_2&amp;quot; eingezeichnet.&lt;br /&gt;
Auf Ihren Einbau sollte aber verzichtet werden, da Ihre Funktion bereits komplett von &amp;quot;pos_1&amp;quot; übernommen wird.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_1&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen Signalfunktionen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AdController.finalize(..)===&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===IQDComplete() - Page-Load Signal===&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=271</id>
		<title>Ad Technology</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=271"/>
		<updated>2023-04-13T08:48:16Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;chapterlist&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;clheader&amp;quot;&amp;gt;Ad Technology&amp;lt;/div&amp;gt;&lt;br /&gt;
*Online/Mobile Web&lt;br /&gt;
*[[Adcontroller]]&lt;br /&gt;
*[[Adcontroller Neu]]&lt;br /&gt;
*[[Adcontroller Alt]]&lt;br /&gt;
*[[Creative Identifier]]&lt;br /&gt;
*App&lt;br /&gt;
*[[Einbau des Google Mobile Ads SDK]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Banner-Anzeigen]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Fullscreen-Anzeigen]]&lt;br /&gt;
*[[Prebid Mobile SDK in Apps]]&lt;br /&gt;
*[[Akzeptanzkriterien Werbeintegration mit Google Mobile SDK]]&lt;br /&gt;
*AMP&lt;br /&gt;
*[[Aufbau eines amp-ad-Tags]]&lt;br /&gt;
*[[AMP Anzeigenkennzeichnung]]&lt;br /&gt;
*[[Wechsel Prebid Server zu Prebid Server Premium]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Ad Technology]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=268</id>
		<title>Ad Technology</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Ad_Technology&amp;diff=268"/>
		<updated>2023-04-13T08:41:28Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;chapterlist&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;clheader&amp;quot;&amp;gt;Ad Technology&amp;lt;/div&amp;gt;&lt;br /&gt;
*Online/Mobile Web&lt;br /&gt;
*[[Adcontroller]]&lt;br /&gt;
*[[Adcontroller Neu]]&lt;br /&gt;
*[[Creative Identifier]]&lt;br /&gt;
*App&lt;br /&gt;
*[[Einbau des Google Mobile Ads SDK]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Banner-Anzeigen]]&lt;br /&gt;
*[[Grundsätzliche Regeln und Hinweise zum Einbau von Fullscreen-Anzeigen]]&lt;br /&gt;
*[[Prebid Mobile SDK in Apps]]&lt;br /&gt;
*[[Akzeptanzkriterien Werbeintegration mit Google Mobile SDK]]&lt;br /&gt;
*AMP&lt;br /&gt;
*[[Aufbau eines amp-ad-Tags]]&lt;br /&gt;
*[[AMP Anzeigenkennzeichnung]]&lt;br /&gt;
*[[Wechsel Prebid Server zu Prebid Server Premium]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Ad Technology]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=267</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=267"/>
		<updated>2023-03-21T15:34:31Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: /* Neues Anzeigen-Containermodell */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Alternativ zum Hosting und unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpoltik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Im neuen Anzeigen-Containermodell werden nicht mehr die Werbeplätze vom Mandanten/Publisher direkt in die Seite integriert, sondern nur noch Platzhalter Div Container an die nach Vertaggungsplan entsprechenden Stellen, in welche dann jeweils IQD die passenden Werbeplätze integriert.&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# 1. Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# 2. Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# 3. Das Data Attribute &amp;quot;&#039;&#039;&#039;data_device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Topbannerkonstrukt in Pos_01 Desktop====&lt;br /&gt;
&lt;br /&gt;
Der Platzhalter für Desktop mit der &amp;quot;data-placement&amp;quot; Nummer &amp;quot;pos_1&amp;quot; stellt unser altes Topbanner-Konstrukt dar und umfasst daher den Einbau mehrerer Werbeplätze (iqadtile1, iqadtile20, iqadtile21). Um dies kenntlich zu machen sind im Vertaggungsplan auch noch &amp;quot;pos_out_1&amp;quot; und &amp;quot;pos_out_2&amp;quot; eingezeichnet.&lt;br /&gt;
Auf Ihren Einbau sollte aber verzichtet werden, da Ihre Funktion bereits komplett von &amp;quot;pos_1&amp;quot; übernommen wird.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_1&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen==&lt;br /&gt;
&lt;br /&gt;
===Signale &amp;amp; Anzeigestruktur===&lt;br /&gt;
&lt;br /&gt;
====AdController.render(..)====&lt;br /&gt;
&lt;br /&gt;
Nach Initialisierung des AdControllers ist dieser bereit für das Absetzen einer Anzeigenanforderung an den AdServer. Auslöser einer Anzeigenanforderung ist die jeweilige Anzeigenplatzierung mit entsprechender AdController.render-Methode. In der Render-Phase des AdControllers werden die Level-Informationen des CMS-Mandanten-Objects an den AdRequest-URL-Builder des AdControllers übergeben und mit weiteren Konfigurationsparametern des Deployments zu einem AdServer-konformen Anzeigen-Request zusammengeführt und versendet.&lt;br /&gt;
&lt;br /&gt;
Welche Anzeigenplatzierungen für das jeweilige Layout Ihrer Website umzusetzen ist, ist im Vorfeld mit iq digital hinsichtlich Vermarktungsmöglichkeiten zu besprechen. Die Anzeigenplatzierung ist durch ein eindeutiges DOM-Element mit exemplarischer id=iqadtileT I L E N U M B E R in Ihrem HTML-MarkUp zu implementieren. Der übergebene Positionsschlüssel innerhalb des AdCongroller.render-Aufrufs bewirkt eine asynchrone Einbindung via DOM-Insertion der gelieferten Anzeige im Zielcontainer&lt;br /&gt;
&lt;br /&gt;
Bitte fügen Sie keinen weitere DOM oder Script-Bestandteile innerhalb dieser Anzeigencontainer ein. Die Anzeigen-Kennzeichnung der Werbeplatzierungen erfolgt optimalerweise durch iq digital. Gerne besprechen wir diesen Punkt gemeinsam mit Ihnen.&lt;br /&gt;
&lt;br /&gt;
====TopBanner Konstrukt====&lt;br /&gt;
&lt;br /&gt;
Anzeigenplatzierung TopBanner Konstrukt, beinhaltet die erste Position iqadtile1 und beide Sky Postionen (bitte 1:1 genauso implementieren)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this construct for the top positions (iqadtile1), the sky right part (iqadtile21) &amp;amp; the left sky part (iqadtile20) and the out-of-page position (iqadtileOOP)--&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileOOP&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;script&amp;gt;&lt;br /&gt;
          AdController.render(&#039;iqadtileOOP&#039;);&lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqd_mainAd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;iqd_align_Ad&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_topAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile1&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_leftAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile20&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_rightAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile21&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile21&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====weitere Anzeigepositionen====&lt;br /&gt;
&lt;br /&gt;
Alle weitere Platzierungen nach folgender Muster umsetzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this pattern for all other positions --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileT I L E N U M B E R&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        if (typeof AdController !== &#039;undefined&#039;) {&lt;br /&gt;
           AdController.render(&#039;iqadtileT I L E N U M B E R&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController.finalize(..)====&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====IQDComplete() - Page-Load Signal====&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=266</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=266"/>
		<updated>2023-03-21T15:33:51Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: /* Neues Anzeigen-Containermodell */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Alternativ zum Hosting und unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpoltik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Im neuen Anzeigen-Containermodell werden nicht mehr die Werbeplätze vom Mandanten/Publisher direkt in die Seite integriert, sondern nur noch Platzhalter Div Container an die nach Vertaggungsplan entsprechenden Stellen, in welche dann jeweils IQD die passenden Werbeplätze integriert.&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# 1. Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# 2. Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# 3. Das Data Attribute &amp;quot;&#039;&#039;&#039;data_device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop, Mobile oder Tablet Werbeausspielung gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;tablet&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Topbannerkonstrukt in Pos_01 Desktop====&lt;br /&gt;
&lt;br /&gt;
Der Platzhalter für Desktop mit der &amp;quot;data-placement&amp;quot; Nummer &amp;quot;pos_1&amp;quot; stellt unser altes Topbanner-Konstrukt dar und umfasst daher den Einbau mehrerer Werbeplätze (iqadtile1, iqadtile20, iqadtile21). Um dies kenntlich zu machen sind im Vertaggungsplan auch noch &amp;quot;pos_out_1&amp;quot; und &amp;quot;pos_out_2&amp;quot; eingezeichnet.&lt;br /&gt;
Auf Ihren Einbau sollte aber verzichtet werden, da Ihre Funktion bereits komplett von &amp;quot;pos_1&amp;quot; übernommen wird.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_1&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen==&lt;br /&gt;
&lt;br /&gt;
===Signale &amp;amp; Anzeigestruktur===&lt;br /&gt;
&lt;br /&gt;
====AdController.render(..)====&lt;br /&gt;
&lt;br /&gt;
Nach Initialisierung des AdControllers ist dieser bereit für das Absetzen einer Anzeigenanforderung an den AdServer. Auslöser einer Anzeigenanforderung ist die jeweilige Anzeigenplatzierung mit entsprechender AdController.render-Methode. In der Render-Phase des AdControllers werden die Level-Informationen des CMS-Mandanten-Objects an den AdRequest-URL-Builder des AdControllers übergeben und mit weiteren Konfigurationsparametern des Deployments zu einem AdServer-konformen Anzeigen-Request zusammengeführt und versendet.&lt;br /&gt;
&lt;br /&gt;
Welche Anzeigenplatzierungen für das jeweilige Layout Ihrer Website umzusetzen ist, ist im Vorfeld mit iq digital hinsichtlich Vermarktungsmöglichkeiten zu besprechen. Die Anzeigenplatzierung ist durch ein eindeutiges DOM-Element mit exemplarischer id=iqadtileT I L E N U M B E R in Ihrem HTML-MarkUp zu implementieren. Der übergebene Positionsschlüssel innerhalb des AdCongroller.render-Aufrufs bewirkt eine asynchrone Einbindung via DOM-Insertion der gelieferten Anzeige im Zielcontainer&lt;br /&gt;
&lt;br /&gt;
Bitte fügen Sie keinen weitere DOM oder Script-Bestandteile innerhalb dieser Anzeigencontainer ein. Die Anzeigen-Kennzeichnung der Werbeplatzierungen erfolgt optimalerweise durch iq digital. Gerne besprechen wir diesen Punkt gemeinsam mit Ihnen.&lt;br /&gt;
&lt;br /&gt;
====TopBanner Konstrukt====&lt;br /&gt;
&lt;br /&gt;
Anzeigenplatzierung TopBanner Konstrukt, beinhaltet die erste Position iqadtile1 und beide Sky Postionen (bitte 1:1 genauso implementieren)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this construct for the top positions (iqadtile1), the sky right part (iqadtile21) &amp;amp; the left sky part (iqadtile20) and the out-of-page position (iqadtileOOP)--&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileOOP&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;script&amp;gt;&lt;br /&gt;
          AdController.render(&#039;iqadtileOOP&#039;);&lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqd_mainAd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;iqd_align_Ad&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_topAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile1&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_leftAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile20&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_rightAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile21&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile21&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====weitere Anzeigepositionen====&lt;br /&gt;
&lt;br /&gt;
Alle weitere Platzierungen nach folgender Muster umsetzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this pattern for all other positions --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileT I L E N U M B E R&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        if (typeof AdController !== &#039;undefined&#039;) {&lt;br /&gt;
           AdController.render(&#039;iqadtileT I L E N U M B E R&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController.finalize(..)====&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====IQDComplete() - Page-Load Signal====&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=265</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=265"/>
		<updated>2023-03-20T10:14:05Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Alternativ zum Hosting und unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpoltik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
Im neuen Anzeigen-Containermodell werden nicht mehr die Werbeplätze vom Mandanten/Publisher direkt in die Seite integriert, sondern nur noch Platzhalter Div Container an die nach Vertaggungsplan entsprechenden Stellen, in welche dann jeweils IQD die passenden Werbeplätze integriert.&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# 1. Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# 2. Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# 3. Das Data Attribute &amp;quot;&#039;&#039;&#039;data_device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop oder Mobile Werbeausspielung gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Topbannerkonstrukt in Pos_01 Desktop====&lt;br /&gt;
&lt;br /&gt;
Der Platzhalter für Desktop mit der &amp;quot;data-placement&amp;quot; Nummer &amp;quot;pos_01&amp;quot; stellt unser altes Topbanner-Konstrukt dar und umfasst daher den Einbau mehrerer Werbeplätze (iqadtile1, iqadtile20, iqadtile21). Um dies kenntlich zu machen sind im Vertaggungsplan auch noch &amp;quot;pos_out_1&amp;quot; und &amp;quot;pos_out_2&amp;quot; eingezeichnet.&lt;br /&gt;
Auf Ihren Einbau sollte aber verzichtet werden, da Ihre Funktion bereits komplett von &amp;quot;pos_01&amp;quot; übernommen wird.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_1&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen==&lt;br /&gt;
&lt;br /&gt;
===Signale &amp;amp; Anzeigestruktur===&lt;br /&gt;
&lt;br /&gt;
====AdController.render(..)====&lt;br /&gt;
&lt;br /&gt;
Nach Initialisierung des AdControllers ist dieser bereit für das Absetzen einer Anzeigenanforderung an den AdServer. Auslöser einer Anzeigenanforderung ist die jeweilige Anzeigenplatzierung mit entsprechender AdController.render-Methode. In der Render-Phase des AdControllers werden die Level-Informationen des CMS-Mandanten-Objects an den AdRequest-URL-Builder des AdControllers übergeben und mit weiteren Konfigurationsparametern des Deployments zu einem AdServer-konformen Anzeigen-Request zusammengeführt und versendet.&lt;br /&gt;
&lt;br /&gt;
Welche Anzeigenplatzierungen für das jeweilige Layout Ihrer Website umzusetzen ist, ist im Vorfeld mit iq digital hinsichtlich Vermarktungsmöglichkeiten zu besprechen. Die Anzeigenplatzierung ist durch ein eindeutiges DOM-Element mit exemplarischer id=iqadtileT I L E N U M B E R in Ihrem HTML-MarkUp zu implementieren. Der übergebene Positionsschlüssel innerhalb des AdCongroller.render-Aufrufs bewirkt eine asynchrone Einbindung via DOM-Insertion der gelieferten Anzeige im Zielcontainer&lt;br /&gt;
&lt;br /&gt;
Bitte fügen Sie keinen weitere DOM oder Script-Bestandteile innerhalb dieser Anzeigencontainer ein. Die Anzeigen-Kennzeichnung der Werbeplatzierungen erfolgt optimalerweise durch iq digital. Gerne besprechen wir diesen Punkt gemeinsam mit Ihnen.&lt;br /&gt;
&lt;br /&gt;
====TopBanner Konstrukt====&lt;br /&gt;
&lt;br /&gt;
Anzeigenplatzierung TopBanner Konstrukt, beinhaltet die erste Position iqadtile1 und beide Sky Postionen (bitte 1:1 genauso implementieren)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this construct for the top positions (iqadtile1), the sky right part (iqadtile21) &amp;amp; the left sky part (iqadtile20) and the out-of-page position (iqadtileOOP)--&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileOOP&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;script&amp;gt;&lt;br /&gt;
          AdController.render(&#039;iqadtileOOP&#039;);&lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqd_mainAd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;iqd_align_Ad&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_topAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile1&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_leftAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile20&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_rightAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile21&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile21&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====weitere Anzeigepositionen====&lt;br /&gt;
&lt;br /&gt;
Alle weitere Platzierungen nach folgender Muster umsetzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this pattern for all other positions --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileT I L E N U M B E R&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        if (typeof AdController !== &#039;undefined&#039;) {&lt;br /&gt;
           AdController.render(&#039;iqadtileT I L E N U M B E R&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController.finalize(..)====&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====IQDComplete() - Page-Load Signal====&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=264</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=264"/>
		<updated>2023-03-20T10:13:18Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Alternativ zum Hosting und unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpoltik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell Anfang==&lt;br /&gt;
&lt;br /&gt;
Im neuen Anzeigen-Containermodell werden nicht mehr die Werbeplätze vom Mandanten/Publisher direkt in die Seite integriert, sondern nur noch Platzhalter Div Container an die nach Vertaggungsplan entsprechenden Stellen, in welche dann jeweils IQD die passenden Werbeplätze integriert.&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# 1. Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# 2. Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# 3. Das Data Attribute &amp;quot;&#039;&#039;&#039;data_device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop oder Mobile Werbeausspielung gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Topbannerkonstrukt in Pos_01 Desktop====&lt;br /&gt;
&lt;br /&gt;
Der Platzhalter für Desktop mit der &amp;quot;data-placement&amp;quot; Nummer &amp;quot;pos_01&amp;quot; stellt unser altes Topbanner-Konstrukt dar und umfasst daher den Einbau mehrerer Werbeplätze (iqadtile1, iqadtile20, iqadtile21). Um dies kenntlich zu machen sind im Vertaggungsplan auch noch &amp;quot;pos_out_1&amp;quot; und &amp;quot;pos_out_2&amp;quot; eingezeichnet.&lt;br /&gt;
Auf Ihren Einbau sollte aber verzichtet werden, da Ihre Funktion bereits komplett von &amp;quot;pos_01&amp;quot; übernommen wird.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_1&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell Ende==&lt;br /&gt;
&lt;br /&gt;
==Anzeigenplatzierungen==&lt;br /&gt;
&lt;br /&gt;
===Signale &amp;amp; Anzeigestruktur===&lt;br /&gt;
&lt;br /&gt;
====AdController.render(..)====&lt;br /&gt;
&lt;br /&gt;
Nach Initialisierung des AdControllers ist dieser bereit für das Absetzen einer Anzeigenanforderung an den AdServer. Auslöser einer Anzeigenanforderung ist die jeweilige Anzeigenplatzierung mit entsprechender AdController.render-Methode. In der Render-Phase des AdControllers werden die Level-Informationen des CMS-Mandanten-Objects an den AdRequest-URL-Builder des AdControllers übergeben und mit weiteren Konfigurationsparametern des Deployments zu einem AdServer-konformen Anzeigen-Request zusammengeführt und versendet.&lt;br /&gt;
&lt;br /&gt;
Welche Anzeigenplatzierungen für das jeweilige Layout Ihrer Website umzusetzen ist, ist im Vorfeld mit iq digital hinsichtlich Vermarktungsmöglichkeiten zu besprechen. Die Anzeigenplatzierung ist durch ein eindeutiges DOM-Element mit exemplarischer id=iqadtileT I L E N U M B E R in Ihrem HTML-MarkUp zu implementieren. Der übergebene Positionsschlüssel innerhalb des AdCongroller.render-Aufrufs bewirkt eine asynchrone Einbindung via DOM-Insertion der gelieferten Anzeige im Zielcontainer&lt;br /&gt;
&lt;br /&gt;
Bitte fügen Sie keinen weitere DOM oder Script-Bestandteile innerhalb dieser Anzeigencontainer ein. Die Anzeigen-Kennzeichnung der Werbeplatzierungen erfolgt optimalerweise durch iq digital. Gerne besprechen wir diesen Punkt gemeinsam mit Ihnen.&lt;br /&gt;
&lt;br /&gt;
====TopBanner Konstrukt====&lt;br /&gt;
&lt;br /&gt;
Anzeigenplatzierung TopBanner Konstrukt, beinhaltet die erste Position iqadtile1 und beide Sky Postionen (bitte 1:1 genauso implementieren)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this construct for the top positions (iqadtile1), the sky right part (iqadtile21) &amp;amp; the left sky part (iqadtile20) and the out-of-page position (iqadtileOOP)--&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileOOP&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;script&amp;gt;&lt;br /&gt;
          AdController.render(&#039;iqadtileOOP&#039;);&lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqd_mainAd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;iqd_align_Ad&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_topAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile1&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_leftAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile20&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_rightAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile21&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile21&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====weitere Anzeigepositionen====&lt;br /&gt;
&lt;br /&gt;
Alle weitere Platzierungen nach folgender Muster umsetzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this pattern for all other positions --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileT I L E N U M B E R&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        if (typeof AdController !== &#039;undefined&#039;) {&lt;br /&gt;
           AdController.render(&#039;iqadtileT I L E N U M B E R&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController.finalize(..)====&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====IQDComplete() - Page-Load Signal====&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=263</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=263"/>
		<updated>2023-03-20T10:01:02Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: /* Neues Anzeigen-Containermodell */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Alternativ zum Hosting und unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpoltik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Anzeigenplatzierungen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell Anfang==&lt;br /&gt;
&lt;br /&gt;
Im neuen Anzeigen-Containermodell werden nicht mehr die Werbeplätze vom Mandanten/Publisher direkt in die Seite integriert, sondern nur noch Platzhalter Div Container an die nach Vertaggungsplan entsprechenden Stellen, in welche dann jeweils IQD die passenden Werbeplätze integriert.&lt;br /&gt;
Zur richtigen Identifizierung aller Platzhalter müssen folgende Informationen allen Platzhalter Div-Containern mitgegeben werden:&lt;br /&gt;
&lt;br /&gt;
# 1. Die Klasse &amp;quot;&#039;&#039;&#039;iqdcontainer&#039;&#039;&#039;&amp;quot;. Durch diese Klasse werden alle Divs Werbeplatzhalter gekennzeichnet.&lt;br /&gt;
# 2. Das Data Attribute &amp;quot;&#039;&#039;&#039;data-placement&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut können die jeweiligen Positionen in der Seite eindeutig erfasst werden.&lt;br /&gt;
# 3. Das Data Attribute &amp;quot;&#039;&#039;&#039;data_device&#039;&#039;&#039;&amp;quot;. Über dieses Data-Attribut wird gekennzeichnet, ob der Werbeplatz für die Desktop oder Mobile Werbeausspielung gedacht ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_2&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SonderPositionen===&lt;br /&gt;
&lt;br /&gt;
====Header und Footer====&lt;br /&gt;
&lt;br /&gt;
Alle Positionen im Footer und Header bekommen keine Zahl in &amp;quot;data-placement&amp;quot;, sondern jeweils &amp;quot;pos_header&amp;quot; oder &amp;quot;pos_footer&amp;quot;, wodurch sie eindeutig bestimmt sind.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_header&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_footer&amp;quot; data-device=&amp;quot;mobile&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Topbannerkonstrukt in Pos_01 Desktop====&lt;br /&gt;
&lt;br /&gt;
Der Platzhalter für Desktop mit der &amp;quot;data-placement&amp;quot; Nummer &amp;quot;pos_01&amp;quot; stellt unser altes Topbanner-Konstrukt dar und umfasst daher den Einbau mehrerer Werbeplätze (iqadtile1, iqadtile20, iqadtile21). Um dies kenntlich zu machen sind im Vertaggungsplan auch noch &amp;quot;pos_out_1&amp;quot; und &amp;quot;pos_out_2&amp;quot; eingezeichnet.&lt;br /&gt;
Auf Ihren Einbau sollte aber verzichtet werden, da Ihre Funktion bereits komplett von &amp;quot;pos_01&amp;quot; übernommen wird.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;iqdcontainer&amp;quot; data-placement=&amp;quot;pos_1&amp;quot; data-device=&amp;quot;desktop&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell Ende==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Signale &amp;amp; Anzeigestruktur===&lt;br /&gt;
&lt;br /&gt;
====AdController.render(..)====&lt;br /&gt;
&lt;br /&gt;
Nach Initialisierung des AdControllers ist dieser bereit für das Absetzen einer Anzeigenanforderung an den AdServer. Auslöser einer Anzeigenanforderung ist die jeweilige Anzeigenplatzierung mit entsprechender AdController.render-Methode. In der Render-Phase des AdControllers werden die Level-Informationen des CMS-Mandanten-Objects an den AdRequest-URL-Builder des AdControllers übergeben und mit weiteren Konfigurationsparametern des Deployments zu einem AdServer-konformen Anzeigen-Request zusammengeführt und versendet.&lt;br /&gt;
&lt;br /&gt;
Welche Anzeigenplatzierungen für das jeweilige Layout Ihrer Website umzusetzen ist, ist im Vorfeld mit iq digital hinsichtlich Vermarktungsmöglichkeiten zu besprechen. Die Anzeigenplatzierung ist durch ein eindeutiges DOM-Element mit exemplarischer id=iqadtileT I L E N U M B E R in Ihrem HTML-MarkUp zu implementieren. Der übergebene Positionsschlüssel innerhalb des AdCongroller.render-Aufrufs bewirkt eine asynchrone Einbindung via DOM-Insertion der gelieferten Anzeige im Zielcontainer&lt;br /&gt;
&lt;br /&gt;
Bitte fügen Sie keinen weitere DOM oder Script-Bestandteile innerhalb dieser Anzeigencontainer ein. Die Anzeigen-Kennzeichnung der Werbeplatzierungen erfolgt optimalerweise durch iq digital. Gerne besprechen wir diesen Punkt gemeinsam mit Ihnen.&lt;br /&gt;
&lt;br /&gt;
====TopBanner Konstrukt====&lt;br /&gt;
&lt;br /&gt;
Anzeigenplatzierung TopBanner Konstrukt, beinhaltet die erste Position iqadtile1 und beide Sky Postionen (bitte 1:1 genauso implementieren)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this construct for the top positions (iqadtile1), the sky right part (iqadtile21) &amp;amp; the left sky part (iqadtile20) and the out-of-page position (iqadtileOOP)--&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileOOP&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;script&amp;gt;&lt;br /&gt;
          AdController.render(&#039;iqadtileOOP&#039;);&lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqd_mainAd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;iqd_align_Ad&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_topAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile1&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_leftAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile20&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_rightAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile21&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile21&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====weitere Anzeigepositionen====&lt;br /&gt;
&lt;br /&gt;
Alle weitere Platzierungen nach folgender Muster umsetzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this pattern for all other positions --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileT I L E N U M B E R&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        if (typeof AdController !== &#039;undefined&#039;) {&lt;br /&gt;
           AdController.render(&#039;iqadtileT I L E N U M B E R&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController.finalize(..)====&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====IQDComplete() - Page-Load Signal====&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=262</id>
		<title>Adcontroller</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Adcontroller&amp;diff=262"/>
		<updated>2023-03-20T07:59:56Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: /* Anzeigenplatzierungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Implementierung AdController-Deployment (API + Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Der AdController stellt in Form eines Script-Deployments ein Framework für die Initialisierung und das Rendering einer Anzeigenanforderung für die jeweils gültige Konfiguration einer Angebotsseite zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Implementierung des Script-Deployments soll für die optimierte Bereitstellung der Dienstekonfiguration sowie Steuerbarkeit der prozessualen Code-Ausführung im &amp;lt;head&amp;gt;-Tag der Seite erfolgen. Das Script funktioniert zu 100% asynchron und verwendet keinen blockierenden Script-Code. Kann aus technischen Gründen nicht auf das &amp;lt;head&amp;gt;-Tag zugegriffen werden, ist eine Implementierung im Dokument-body noch vor dem erstem AdRequest zu prüfen (bitte stimmen Sie sich in diesem Fall gesondert mit iq digital ab). Die Initialisierung des AdControllers (AC) soll frühstmöglich erfolgen und ist Voraussetzung für die Anzeigeaufrufe (AdController.render-Aufrufe) zur Anzeigenanforderung. Sollte das nicht möglich sein bzw. Advertising-Technologien in Abhängigkeit von eintretenden Events (z.B. nach Page-Load) vorausgesetzt sein, stimmen Sie sich bitte gesondert mit iq digital ab.&lt;br /&gt;
&lt;br /&gt;
Es sollte im Voraus geklärt werden, ob es sich bei Ihrem Angebot um eine klassische Webeanwendung handelt, die aus mehreren untereinander verlinkten HTML-Dokumenten besteht (d.h. bei initialem Aufruf einer Content-Seite sowie Navigation zu anderen Seiten wird auch immer ein Browser-Refresh ausgeführt). Sollten Sie im Rahmen einer &amp;quot;Single-Page-Webanwendung&amp;quot; ein davon abweichendes Konzept implementieren, sollten Sie zusätzlich die Schritte im Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] befolgen.&lt;br /&gt;
&lt;br /&gt;
Wenn lediglich redaktionelle Elemente derselben Seite asynchron nachladen werden (z.B. Bildergalerien ohne Page-Refresh), bietet der AdController zu diesem Zweck eine Callback-Funktion zum Nachladen der Anzeigenpositionen an. Hier können die Schritte aus Abschnitt [[#Single_Page_Applikation_(Kein_Pageload)| Single Page Applikation (Kein Pageload)]] ignoriert werden. Der Publisher verantwortet die Event-Bindung zum Triggern des Callback nach gemeinsamer Absprache mit iq digital ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
===Hosting &amp;amp; Einbindung AdController===&lt;br /&gt;
&lt;br /&gt;
Es bestehen zwei Möglichkeiten für das Hosting/Einbindung des AdController Script-Deployments auf Ihren Seiten:&lt;br /&gt;
&lt;br /&gt;
*Abruf des AC-Script-Deployments von einem externen Web-Host der iq digital (AWS-CDN)&lt;br /&gt;
**Hosting und Abruf des AC-Deployment vom iq-CDN &lt;br /&gt;
*Abruf des AC-Script-Deployments vom Web-Server des Seitenbetreibers (empfohlen)&lt;br /&gt;
**Alternativ zum Hosting und unmittelbaren Abruf des AC-Deployment vom iq-CDN wird eine direkte Implementierung des Adcontrollers über den Webserver des Seitenbetreibers empfohlen. Voraussetzung ist eine weiterhin flexible Anbindung des AC- Deployment als PRELIVE- und SANDBOX-Version (siehe &amp;quot;Auslieferungsmodus&amp;quot;) durch den iq-Entwickler mittels iqdeployment-Parameter. Es gibt hierzu bereits unterschiedliche Umsetzungen im Einsatz, die wir gerne gemeinsam mit Ihnen abstimmen.&lt;br /&gt;
&lt;br /&gt;
===Caching AdController===&lt;br /&gt;
&lt;br /&gt;
Für ein optimiertes Ergebnis hinsichtlich Performance und aktuelle Version des AC-Deployment stimmen wir Möglichkeiten zum kurzfristigen Cachen sowie Expire-Varianten gerne gemeinsam mit Ihnen ab. Die sichere Ausspielung ist dabei voranzustellen, so dass durch iq digital erforderliche Änderungen im AC-Deployment auch sofort beim User in die Ausführung kommen und nicht durch ältere Versionen im Cache blockiert werden.&lt;br /&gt;
&lt;br /&gt;
===Auslieferungsmodus===&lt;br /&gt;
&lt;br /&gt;
Die Variable iqd_mode (siehe Code Beispiel zur Umsetzung von AdController) referenziert, die geplante LIVE Version des AdControllers, oder eine von LIVE abweichende Version (z.B. PRELIVE- oder SANDBOX- Version des AC-Deployments). Durch die URL-Parametererweiterung &amp;quot;iqdeployment=[platzhalter]&amp;quot; ist es dem iq-Entwickler möglich eine Vorabversion des AC-Deployments, ohne Umstellung der Website oder Implikation der Webseitenbesucher, während des Live- Betriebs zu testen bzw. bereitzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments (die Trennung der Script-Blöcke ist erforderlich).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Der Wert für das Makro &amp;lt;b&amp;gt;[cdn_partnersite_Folgt_durch_iq]&amp;lt;/b&amp;gt; wird von iq zur Verfügung gestellt.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Einbindung auf einer nicht-reponsive Seite====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    //VARIANTE 1:&lt;br /&gt;
    IQSLoader(&amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz &amp;quot;);&lt;br /&gt;
    //VARIANTE 2:&lt;br /&gt;
    IQSLoader(&amp;quot;https://[publisher_directory]/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; + iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====Einbindung auf einer responsive Seite (Beispiel Implementierung)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
    function isDesktop() {&lt;br /&gt;
        var width = (window.innerWidth &amp;gt; 0) ? window.innerWidth : screen.width;&lt;br /&gt;
        return width &amp;gt;= 850;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobileOrTablet() {&lt;br /&gt;
        return !isDesktop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isTablet() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; window.outerWidth &amp;gt;= 480 &amp;amp;&amp;amp; window.hasOwnProperty(&#039;orientation&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function isMobile() {&lt;br /&gt;
        return isMobileOrTablet() &amp;amp;&amp;amp; !isTablet();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getPlatform() {&lt;br /&gt;
        if (isDesktop()) {&lt;br /&gt;
            return &#039;desktop&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (isTablet()) {&lt;br /&gt;
            return &#039;tablet&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        return &#039;mobile&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function IQSLoader(url) {&lt;br /&gt;
        var script = document.createElement(&amp;quot;script&amp;quot;)&lt;br /&gt;
        script.type = &amp;quot;text/javascript&amp;quot;;&lt;br /&gt;
        script.src = url;&lt;br /&gt;
        document.getElementsByTagName(&amp;quot;head&amp;quot;)[0].appendChild(script);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var iqd_mode = (function () {&lt;br /&gt;
        var dm = window.location.href.toLowerCase();&lt;br /&gt;
        return (dm.indexOf(&#039;iqdeployment=&#039;) &amp;gt; 1) ? dm.split(&#039;iqdeployment=&#039;)[1].split(&#039;&amp;amp;&#039;)[0] : &#039;live&#039;;&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    if (isDesktop()) {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        IQSLoader(&lt;br /&gt;
            &amp;quot;https://s3.eu-central-1.amazonaws.com/prod.iqdcontroller.iqdigital/[cdn_partnersite_Folgt_durch_iq]/&amp;quot; +&lt;br /&gt;
            iqd_mode + &amp;quot;/iqadcontroller.js.gz&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController proxy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        window.AdController = {&lt;br /&gt;
            i: null, // page info&lt;br /&gt;
            q: [], // render queue&lt;br /&gt;
            f: false, // is finalized &lt;br /&gt;
            s: false, // is staged&lt;br /&gt;
            n: false, // is initialized &lt;br /&gt;
            r: null, // ready function &lt;br /&gt;
            c: [], // command queue&lt;br /&gt;
            setPageInfo: function (i) {&lt;br /&gt;
                window.AdController.i = i;&lt;br /&gt;
            },&lt;br /&gt;
            stage: function () {&lt;br /&gt;
                window.AdController.s = true;&lt;br /&gt;
            },&lt;br /&gt;
            initialize: function () {&lt;br /&gt;
                window.AdController.n = true;&lt;br /&gt;
            },&lt;br /&gt;
            render: function (n, c) {&lt;br /&gt;
                window.AdController.q.push([n, c]);&lt;br /&gt;
            },&lt;br /&gt;
            finalize: function () {&lt;br /&gt;
                window.AdController.f = true;&lt;br /&gt;
            },&lt;br /&gt;
            ready: function (callback) {&lt;br /&gt;
                window.AdController.r = callback;&lt;br /&gt;
            },&lt;br /&gt;
            startLoadCycle: function () {&lt;br /&gt;
                window.AdController.c.push([&#039;startLoadCycle&#039;]);&lt;br /&gt;
            },&lt;br /&gt;
            reload: function (p, t) {&lt;br /&gt;
                window.AdController.c.push([&#039;reload&#039;, p, t]);&lt;br /&gt;
            },&lt;br /&gt;
            reinitialize: function (i) {&lt;br /&gt;
                window.AdController.c.push([&#039;reinitialize&#039;, i]);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Mandanten-CMS-Objekt (Seiteninformationen für AdController-Konfiguration)==&lt;br /&gt;
&lt;br /&gt;
===Allgemeine Informationen===&lt;br /&gt;
&lt;br /&gt;
Um unter Anderem die anzuwendende Konfiguration für die aktuelle Angebotsseite festzustellen, werden dem AdController über dieses Objekt notwendige Informationen des Seitenbetreibers übergeben.&lt;br /&gt;
Das vom Seitenbetreiber bereitzustellende Mandanten-CMS-Objekt übermittelt die seitenspezifischen Informationen zur Auswahl der gültigen bzw. spezifischen AdController-Konfiguration und inventargerechten Anzeigenanforderung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;Code-Beispiel zur Umsetzung im &amp;lt;head&amp;gt;-Tag des Dokuments nach der AdController Einbindung:&amp;lt;/p&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // ########### CMS-MANDANTEN-OBJECT #############&lt;br /&gt;
    var cmsObject = {};&lt;br /&gt;
    cmsObject = {&lt;br /&gt;
        $handle: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level2: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        level3: &amp;quot;&amp;quot;,&lt;br /&gt;
        level4: &amp;quot;&amp;quot;,&lt;br /&gt;
        isWrapperApp: [true,false],&lt;br /&gt;
        keywords: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        tma: &amp;quot;[Erfolgt_mit_Abstimmung_iq]&amp;quot;,&lt;br /&gt;
        platform: &amp;quot;[desktop | tablet | mobile]&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schlüssel Informationen===&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: $handle====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung von einer Seite der Webpräsenz zu einer Subsite des iq digital Tag Management Systems (TMS), deren Konfiguration für die aktuelle Seite wirksam ist, erfolgt über das $handle-Matching-Kriterium. Die Anzeigen-Vertaggung erfolgt somit nach vermarktungsrelevanten und technisch abbildbaren CMS-Layout-Typen der Webpräsenz. iq digital liefert soweit möglich die für das Matching relevanten und zuvor abgestimmten $handle-Bezeichner für die definierten Layout-Cluster - z.B. Homepage ($handle:&#039;homepage&#039;), Übersichts- und Sub-Übersichtsseiten ($handle:&#039;index&#039;), Detailseiten ($handle:&#039;index&#039;), Artikelseiten ($handle:&#039;artikel&#039;). Je nach redaktioneller Layout-Struktur und Anforderungen zur Ansteuerungen  der Webpräsenz kann eine granulare oder flache $handle-Clusterung erforderlich sein. Für die optimale Zuordnung ist durch den Seitenbetreiber eine Site-Map mit abgesprochenen und &amp;quot;offenen&amp;quot; Layout-$handle-Zuordnung zur Verfügung zu stellen.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: level2, level3 und level4====&lt;br /&gt;
&lt;br /&gt;
Enthalten seitenspezifische Informationen für die erforderliche Inventarisierung der Publisher-Site im Ad Server und den AdRequest- URL-Builder zur Anforderungen der auf dieses Inventar gebuchten Anzeigen. Die Level-Informationen sind in Abhängigkeit der Ressort- bzw. Umfeld-Tiefen zu füllen insofern vermarktungsrelevant. &lt;br /&gt;
Beispiel: Wenn die Seite eine Rubrik &#039;Politik&#039; hat und diese eine Unterrubrik &#039;Außenpoltik&#039;, dann wäre den Wert für level2:&#039;politik&#039; und für level3:&#039;aussenpolitik&#039;&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: isWrapperApp====&lt;br /&gt;
&lt;br /&gt;
Anhand von diesem Wert sollte die Information an uns übermittelt werden, ob es sich bei der Ausspielung um eine Wrapper App handelt oder nicht. Möglich Werte hierzu sind true oder false. &lt;br /&gt;
&lt;br /&gt;
====Schlüssel: keywords====&lt;br /&gt;
&lt;br /&gt;
Hier kommen die Werte aus level2, level3, level4 mitrein. Zusätzlich können hier weitere Schlagwörter optional hinzugefügt werden, die die Seite beschreiben und für besseres Kampagnien-Targeting helfen können.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: tma====&lt;br /&gt;
&lt;br /&gt;
Dieses Wert ist optional, sollte jedoch befüllt werden, wenn es sich hierbei um eine Themenseite oder Themenunterseite handelt. Der Wert ist hier der Name von dem Thema, um das es sich hier handelt.&lt;br /&gt;
&lt;br /&gt;
====Schlüssel: platform====&lt;br /&gt;
&lt;br /&gt;
Hier sind folgende Werte möglich: desktop, tablet oder mobile&lt;br /&gt;
Je nachdem auf welchen Device der User unterwegs ist sollte der entsprechende Wert übergeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeichenlimitierung===&lt;br /&gt;
&lt;br /&gt;
Alle Informationen im CMS-Objekt sind ausschließlich klein zu schreiben; Leerzeichen, Sonderzeichen und Umlaute sind nicht erlaubt. Die einzige Ausnahme ist das &amp;quot;_&amp;quot; Zeichen (Unterstrich/Underscore).&lt;br /&gt;
&lt;br /&gt;
FALSCH: Archäologie	RICHTIG: archaeologie | FALSCH: Psychologie-Hirnforschung RICHTIG: psychologie_hirnforschung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==AdController initialisieren==&lt;br /&gt;
&lt;br /&gt;
Nach dem Setzen von dem cmsObject muss der AdController initialisiert werden wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (!AdController._initialized) {&lt;br /&gt;
        AdController.setPageInfo(cmsObject);&lt;br /&gt;
        try {&lt;br /&gt;
            AdController.stage();&lt;br /&gt;
        } catch (e) {}&lt;br /&gt;
        AdController.initialize();&lt;br /&gt;
    } else {&lt;br /&gt;
        (function checkDOMReadyState(c) {&lt;br /&gt;
            try {&lt;br /&gt;
                if (AdController.getRenderController().isReady()) {&lt;br /&gt;
                    AdController.reinitialize(cmsObject);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                if (c &amp;lt; 50) {&lt;br /&gt;
                    c++;&lt;br /&gt;
                    setTimeout(function () {&lt;br /&gt;
                        checkDOMReadyState(c);&lt;br /&gt;
                    }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        })(0);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mandanten-SiteMap (Übersicht AdController-$handle-Zuordnung)==&lt;br /&gt;
&lt;br /&gt;
Zum besseren Verständnis Ihrer Website-Struktur und deren Verwaltung in Ihrem CMS ist die Bereitstellung einer Site-Map des Angebotes wünschenswert. Des Weiteren ist die Klärung folgender Fragen für die AC- Implementierung wichtig.&lt;br /&gt;
&lt;br /&gt;
*Generierung eines generellen Verständnisses des Mandanten-Content-Managements&lt;br /&gt;
**Welche Angebote werden über das eigene Redaktionssystem betrieben?&lt;br /&gt;
**Welche Angebote werden von externen Dienstleistern (Content-Partnern)	betrieben. Gibt	es abweichende Voraussetzungen für die AC-Implementierung, z.B. Cross-Domain-Integrationen via IFrame?&lt;br /&gt;
**Welche Cluster, Limitierung für die Angebotsansteuerung- bzw. -aussteuerung ist durch das CMS-Layout-Templating vorgegeben?&lt;br /&gt;
*Welche Angebote sind derzeit nicht vermarktet und werden auch zukünftig keinen AdController einbinden?&lt;br /&gt;
*Welche Angebote sind derzeit vermarktet ggf. aber nicht sofort bzw. zum vereinbarten Timing mit dem AdController implementiert?&lt;br /&gt;
**Problem: Ggf. Unterschiedliche AdServer-Technologien parallel im Einsatz&lt;br /&gt;
**Timing erforderlich, wann diese Angebote nachgezogen werden können&lt;br /&gt;
*Zuordnung des CMS-Layout-Templating zu AdController-$handle-Cluster&lt;br /&gt;
**Die Möglichkeit eine individuelle Tagging-Konfiguration für einen bestimmten Angebotsbereich wirksam zu machen ist nur gegeben, wenn auch ein eigenes AdController-$handle für die Konfigurationsauswahl im AC-Deployment vergeben wurde&lt;br /&gt;
**I.d.R. erfolgt das $handle-Cluster Layout-basiert (z.B. Homepage, Startseiten, Detailseiten, …) da die Vermarktung entsprechende Produktpakete zur Umfeld-Vermarktung erfordert und Anzeigenpositionen oftmals in Layoutabhängigkeit stehen&lt;br /&gt;
**Zielsetzung ist, nicht für jedes abweichende Layout im Angebot auch ein eigenes $handle-Cluster bzw. eigene Konfiguration bereitzustellen, sondern nicht relevante bzw. produktunabhängige Reichweitenangebote in passende Cluster zusammenzufassen. Es gilt der Grundsatz - so viel $handle-Bezeichner wie nötig, so wenig wie möglich. iq kann zu diesem Zweck mehrere von der Redaktion bereitgestellt Cluster verdichten, so dass zwar eine granulare Kennzeichnung erfolgt, jedoch immer dieselbe Konfiguration im AdController zur Ausführung kommt. Ein Vorteil ist, dass iq digital in diesen Fällen bei späterem Bedarf spezifische Konfigurationen nach Auflösung solcher Bundle vergeben kann&lt;br /&gt;
&lt;br /&gt;
Bitte stellen Sie die Zuordnung der Layout-$handle nur in Absprache mit iq digital zur Verfügung. Je nach Anforderung kann es zu unterschiedlichen Ergebnissen kommen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
==Anzeigenplatzierungen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Neues Anzeigen-Containermodell==&lt;br /&gt;
&lt;br /&gt;
===Signale &amp;amp; Anzeigestruktur===&lt;br /&gt;
&lt;br /&gt;
====AdController.render(..)====&lt;br /&gt;
&lt;br /&gt;
Nach Initialisierung des AdControllers ist dieser bereit für das Absetzen einer Anzeigenanforderung an den AdServer. Auslöser einer Anzeigenanforderung ist die jeweilige Anzeigenplatzierung mit entsprechender AdController.render-Methode. In der Render-Phase des AdControllers werden die Level-Informationen des CMS-Mandanten-Objects an den AdRequest-URL-Builder des AdControllers übergeben und mit weiteren Konfigurationsparametern des Deployments zu einem AdServer-konformen Anzeigen-Request zusammengeführt und versendet.&lt;br /&gt;
&lt;br /&gt;
Welche Anzeigenplatzierungen für das jeweilige Layout Ihrer Website umzusetzen ist, ist im Vorfeld mit iq digital hinsichtlich Vermarktungsmöglichkeiten zu besprechen. Die Anzeigenplatzierung ist durch ein eindeutiges DOM-Element mit exemplarischer id=iqadtileT I L E N U M B E R in Ihrem HTML-MarkUp zu implementieren. Der übergebene Positionsschlüssel innerhalb des AdCongroller.render-Aufrufs bewirkt eine asynchrone Einbindung via DOM-Insertion der gelieferten Anzeige im Zielcontainer&lt;br /&gt;
&lt;br /&gt;
Bitte fügen Sie keinen weitere DOM oder Script-Bestandteile innerhalb dieser Anzeigencontainer ein. Die Anzeigen-Kennzeichnung der Werbeplatzierungen erfolgt optimalerweise durch iq digital. Gerne besprechen wir diesen Punkt gemeinsam mit Ihnen.&lt;br /&gt;
&lt;br /&gt;
====TopBanner Konstrukt====&lt;br /&gt;
&lt;br /&gt;
Anzeigenplatzierung TopBanner Konstrukt, beinhaltet die erste Position iqadtile1 und beide Sky Postionen (bitte 1:1 genauso implementieren)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this construct for the top positions (iqadtile1), the sky right part (iqadtile21) &amp;amp; the left sky part (iqadtile20) and the out-of-page position (iqadtileOOP)--&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileOOP&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;script&amp;gt;&lt;br /&gt;
          AdController.render(&#039;iqadtileOOP&#039;);&lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqd_mainAd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;iqd_align_Ad&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_topAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile1&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_leftAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile20&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile20&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;iqd_rightAd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;iqadtile21&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;script&amp;gt;&lt;br /&gt;
                    AdController.render(&#039;iqadtile21&#039;);&lt;br /&gt;
                &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====weitere Anzeigepositionen====&lt;br /&gt;
&lt;br /&gt;
Alle weitere Platzierungen nach folgender Muster umsetzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;!-- please use this pattern for all other positions --&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;iqadtileT I L E N U M B E R&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        if (typeof AdController !== &#039;undefined&#039;) {&lt;br /&gt;
           AdController.render(&#039;iqadtileT I L E N U M B E R&#039;);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====AdController.finalize(..)====&lt;br /&gt;
&lt;br /&gt;
Die Web-Seite signalisiert dem AdController mit dem AdController.finalize-Aufruf, dass die Render-Phase abgeschlossen werden kann, da keine weiteren Anzeigen-Anforderungen von der Seite implementiert sind. In Einzelfällen kann es dazu kommen, dass die geplante AdController-Konfiguration für die aktuelle Seite von den tatsächlich implementierten Anzeigeplatzierungen abweicht. In diesem Fall werden die Abweichungen durch den AdController evaluiert, abgefangen und bei Bedarf protokolliert. Abweichungen können immer dann Auftreten, wenn für das betroffene Angebot keine spezifische $handle-Zuordnung geplant wurde. Das kann auch ein durch iq digital gewünschtes Szenario sein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    AdController.finalize(); //Signalisiert dem AdController, dass keine weiteren AdCall-Aufrufe auf dieser Seite folgen&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;page-break&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
====IQDComplete() - Page-Load Signal====&lt;br /&gt;
&lt;br /&gt;
Sobald alle Inhalte auf der Seite (auch verzögert dynamisch geladener Content), die zur Höhenberechnung der Seite beitragen, geladen worden sind, soll ein Signal an iq digital gesendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var IQDComplete = {&lt;br /&gt;
        init: function () {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bereitstellung Entwicklungsumgebung==&lt;br /&gt;
&lt;br /&gt;
Für die ordnungsgemäße Umsetzung und Gewährleistung des AdControllers hinsichtlich Betriebsbereitschaft der Webpräsenzen und Sicherstellung der gegenwärtigen und zukünftigen Vermarktungskonzepte durch iq digital ist die Umsetzung auf einer vollumfänglichen Entwicklungsumgebung für die initiale Vertaggung der Seiten durch den AdController erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ziel ist die Sicherstellung einer realen, dem LIVE-Betrieb entsprechenden Umsetzung des AdControllers auf einem parallelen System, welches LIVE gestellt wird, wenn das finale SetUp und Testing von beiden Seiten abgeschlossen wurde.&lt;br /&gt;
&lt;br /&gt;
Die Bereitstellung des AdControllers für die Web-Seiten wird über verschiedene Kanäle erfolgen. Änderungen und weitere Entwicklungen im Rahmen von Konfigurationsanpassungen oder Technologieerweiterung für eine Seite erfolgen bei iq digital über ein Preview-Deployment. Die derzeitige Einbindung des AdControllers sieht bereits einen dynamischen Switch zwischen LIVE- und PRELIVE- Version des AdControllers vor, die auf Clientseite mit einer GET-Parameter-Erweiterung in der URL gesteuert werden kann &amp;quot;https://www.domain.de?iqdeployment=prelive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Die CMP, die auf die Liveseite verwendet wird, sollte außerdem auch auf die Testseite implementiert sein.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fluide/Responsive Webanwendungen==&lt;br /&gt;
Wenn Sie eine fluide bzw. responsive Webanwendung betreiben um unterschiedliche Kanäle im Rahmen des stationären Desktop- und Mobilen-Webs mit schlankeren Code und einheitlichen Redaktionssystem zu pflegen, ist eine Abstimmung der für die Vermarktung relevanten Punkte im Vorfeld erforderlich. Für den Fall des AdControllers bedeutet das, dass Anzeigenplatzierungs-Konzepte für Desktop-Web und Mobile aufeinander plausibel abgestimmt werden müssen. Bitte stellen Sie iq digital eine Übersicht Ihrer Layout- Lösung mit darin geplanten Sprungmarken, ggf. adaptiven Layout-Anpassungen und Device-Detektionen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel vom Layout für Desktop-Web zur Mobile-optimierten Ansicht ist die Implementierung eines gesonderten AC-Mobile- Deployments erforderlich, sobald Ihr Code zur Device-Detektion das entsprechende Umfeld identifiziert. Des Weiteren lassen sich dann die Anzeigenplatzierungen des Desktop-Webs nicht 1:1 auf das zu diesem Zeitpunkt Mobile-optimierte Design übertragen, da Anzahl und Position der Platzierungen bei fluider Neu-Anordnung des HTML-MarkUps nicht den verschiedenen Vermarktungsanforderungen dieser Umfelder entsprechen. Bitte stimmen Sie sich gemeinsam mit iq digital bzgl. eines entsprechenden Platzierungs-Konzeptes ab.&lt;br /&gt;
&lt;br /&gt;
Entsprechende Anforderungen und Konzepte sind bereits im Vermarktungsportfolio von iq digital im Einsatz, gerne Leisten wir Hilfestellung im Rahmen bereits aktiver Implementierungen.&lt;br /&gt;
&lt;br /&gt;
==Single Page Applikation (Kein Pageload)==&lt;br /&gt;
&lt;br /&gt;
Der Mandant muss im Falle einer SPA Implementierung beim Seitennavigieren dafür sorgen, dass:&lt;br /&gt;
&lt;br /&gt;
* cmsObject muss neu gesetzt werden&lt;br /&gt;
* AdController muss reinitialisiert wird&lt;br /&gt;
* Render Funktionen müssen erneut aufgerufen werden&lt;br /&gt;
* eine postMessage() Nachricht an uns geschickt wird ([[#Callback-Funktion_zum_Nachladen_der_Anzeigenpositionen| siehe Abschnitt Callback-Funktion zum Nachladen der Anzeigenpositionen]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Callback-Funktion zum Nachladen der Anzeigenpositionen==&lt;br /&gt;
&lt;br /&gt;
Folgende postMessage muss an iq gesendet werden, sobald dies mit iq schon abgestimmt wurde, um ein Nachladen der Anzeigen anzustoßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;html&#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.top.postMessage(&amp;quot;iq_refresh_ads&amp;quot;,&amp;quot;[targetOrigin]&amp;quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Adcontroller]][[Kategorie:Ad Technology]]&lt;br /&gt;
[[en:Adcontroller]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Einbau_des_Google_Mobile_Ads_SDK&amp;diff=195</id>
		<title>Einbau des Google Mobile Ads SDK</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Einbau_des_Google_Mobile_Ads_SDK&amp;diff=195"/>
		<updated>2021-11-12T23:13:36Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: /* Preloading Ad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Offizielle Dokumentation zum Google Mobile Ads SDK==&lt;br /&gt;
Das Google Mobile Ads SDK (GMA SDK) bringt alles mit, was für eine Werbeausspielung in nativen Apps benötigt wird.&lt;br /&gt;
&lt;br /&gt;
===Getting Started zum Google Mobile Ads SDK===&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start GMA SDK iOS Getting Started]&lt;br /&gt;
&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/android/quick-start GMA SDK iOS Getting Started]&lt;br /&gt;
&lt;br /&gt;
===Download des Google Mobile Ads SDK===&lt;br /&gt;
====Android====&lt;br /&gt;
Das GMA SDK ist in den Android Play Services integriert und deshalb auf den Android Geräten vorhanden. &lt;br /&gt;
&lt;br /&gt;
====iOS====&lt;br /&gt;
Für iOS kann das GMA SDK hier heruntergeladen werden:&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/ios/download Download iOS]&lt;br /&gt;
&lt;br /&gt;
===Ad-Manager vs. Admob===&lt;br /&gt;
Die Dokumentation zum Google Mobile Ads SDK gibt es in zwei Varianten: für Ad-Manager- und Admob-Nutzer. Die iq digital ist ein Ad-Manager Kunde, deswegen muss unbedingt darauf geachtet werden, dass in der Browser-URL https://developers.google.com/ad-manager/... enthalten ist. Die Admob Doku unterscheidet sich leicht von der Ad-Manager Doku.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kurze Einführung in den Lebens-Zyklus einer Werbeausspielung mit dem GMA SDK==&lt;br /&gt;
Am Beispiel einer Banner-Werbeausspielung wird hier kurz der Lebens-Zyklus einer Werbeausspielung erklärt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GMA_SDK.png|800px|thumbnail|Übersicht Workflow der Werbeausspielung mit GMA SDK]]&lt;br /&gt;
&lt;br /&gt;
===Request===&lt;br /&gt;
Das Adrequest wird in der App zusammengestellt und besteht aus mehreren Komponenten. Für eine erfolgreiche Werbeausspielung sind folgende Komponenten wichtig:&lt;br /&gt;
;Consent String:Die App benötigt vom Nutzer einen gültigen Consent für die Werbeausspielung. Dabei sind neben mehreren relevanten Purposes auch der Vendor 755 Google Advertising Products notwendig (s.u.)&lt;br /&gt;
;Creative-Sizes:In den meisten Fällen benutzen wir &#039;&#039;&#039;multisize&#039;&#039;&#039;-Adrequests. Das bedeutet, dass das Adrequest mehrere Creative Größen enthält und der Adserver daraufhin prüft, ob er ein Creative für eine dieser Größen zur Verfügung hat. Beispiele sind z.B. 320x1, 320x53, 320x80, 320x106, 320x160 etc.&lt;br /&gt;
;Adunit:Die Adunit ist die Adresse der Werbeplatzierung. Damit weiß der Adserver, auf welcher Seite eine Werbeausspielung erfolgt. Die Adunit ist für alle Adrequests eines Pagerequests gleich. Beispiel: /183/Rheinischer_Kurier_ios_phone/homepage &lt;br /&gt;
;Keywords (optional):Keywords sind Key-Value Paare und können eine Werbeplatzierung um weitere Informationen anreichern, die für eine gezielte Werbeausspielung notwendig sind. Die Werbeplatzierungen der iq digital enthalten alle eine bestimmte Bezeichnung, welche über die Keywords dem Adserver mitgegeben wird. Beispiel: kw=iqadtile1,digtransfrom&amp;amp;tile=1&amp;amp;doc=homepage&lt;br /&gt;
&lt;br /&gt;
===Adserver Google Admanager 360===&lt;br /&gt;
Wenn der Adserver gültigen Consent besitzt, prüft ein Verteilungsalgorithmus, ob eine oder mehrere Werbebuchungen für die Adunit, Creative sizes und Keywords vorliegen. Ist dies der Fall wählt der Adserver die beste dafür aus. Sind mehrere Buchungen gleich wichtig, wählt er zufällig eine davon aus. Nur im Falle keiner Buchung würde er eine &#039;&#039;&#039;no ad&#039;&#039;&#039; oder &#039;&#039;&#039;no fill&#039;&#039;&#039; Meldung ausgeben, die besagt, dass für die Kombination aus adunit, creative size und Keywords keine Buchung existiert.&lt;br /&gt;
&lt;br /&gt;
===Ausspielung innerhalb der App===&lt;br /&gt;
Die App lädt die Response des Adservers, die aus dem Template-Code und den Creative Komponenten besteht. Dabei ist zu beachten, dass der Werbecontainer auf die creative size des ausgelieferten Creatives vergrößert wird. Für Fullscreen Ads muss diese Größe von der App nachträglich auf die Display Viewport Größe (also device independent pixel) angepasst werden. Im Falle einer Banner Anzeige bekommt die App meist nach dem Ladevorgang ein oder mehrere setsize-Events über den einzubauenden AppEventHandler und muss den Werbecontainer auf die neue Größe anpassen, sofern diese sich von der creative size unterscheidet.&lt;br /&gt;
&lt;br /&gt;
===Impression-Zählung===&lt;br /&gt;
Eine Impression Zählung, die misst, dass ein Ad angesehen wurde, wird vom GMA SDK automatisch abgeschickt, sobald mindestens 1px im sichtbaren Bereich des Displays ist.&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Informationen==&lt;br /&gt;
===Adunits (Zonierung)===&lt;br /&gt;
Der Google Ad Manager benutzt zur Adressierung der Seiten Adunits, die sich wie folgt zusammensetzen können:&lt;br /&gt;
*/netzwerkId/level1&lt;br /&gt;
*/netzwerkId/level1/seitentyp&lt;br /&gt;
*/netzwerkId/level1/level2/seitentyp&lt;br /&gt;
*/netzwerkId/level1/level2/level3/seitentyp&lt;br /&gt;
*usw.&lt;br /&gt;
&lt;br /&gt;
====Begriffserklärung====&lt;br /&gt;
;netzwerkId:Hier ist immer die Netzwerk ID der iq digital einzugeben: 183&lt;br /&gt;
;level1:Dies ist die Bezeichnung der App im Google Ad Manager und wird von der iq digital vorgegeben. Die Bezeichnung besteht aus &amp;lt;appname&amp;gt;_app_&amp;lt;plattform&amp;gt;_&amp;lt;gerätetyp&amp;gt;.&lt;br /&gt;
:;appname:Der Name der App&lt;br /&gt;
:;plattform:Das Betriebsystem, also &#039;&#039;ios&#039;&#039; oder &#039;&#039;android&#039;&#039;&lt;br /&gt;
:;gerätetyp:Der Gerätetyp, also &#039;&#039;&#039;phone&#039;&#039;&#039; oder &#039;&#039;tablet&#039;&#039;&lt;br /&gt;
;level2:Dies ist die Bezeichnung einer Rubrik der App, z.B. &#039;&#039;politik&#039;&#039;&lt;br /&gt;
;level3 (usw.):Dies ist die Bezeichnung für eine Unterrubrik, z.B. im Falle von &#039;&#039;politik&#039;&#039; als level2 wäre &#039;&#039;ausland&#039;&#039; eine Unterrubrik für level3. Level4 und höher sind weitere tiefere Verzweigungen der App, diese werden im Normalfall nicht also Adunits angelegt und solche Seiten würden unter dem level3 angelegt werden.&lt;br /&gt;
;seitentyp:In Apps mit Banner-Anzeigen (z.B. News Apps) bezeichnet &#039;&#039;seitentyp&#039;&#039; die unterschiedlichen Seitentypen, also ob es sich z.B. um eine Übersichts-, Artikel- oder Bildergalerieseite handelt. Übliche Werte dafür sind &#039;&#039;homepage&#039;&#039;, &#039;&#039;index&#039;&#039;, &#039;&#039;artikel&#039;&#039;, &#039;&#039;bildgal&#039;&#039;. In Apps mit Fullscreen-Anzeigen (z.B. epaper oder Zeitungs Apps) werden mit &#039;&#039;seitentyp&#039;&#039; die unterschiedlichen Anzeigeplätze innerhalb der Rubrik gemeint, also ob es sich z.B. erste, zweite oder dritte Swipe Anzeige handelt. Übliche Werte sind &#039;&#039;openingpage&#039;&#039;, &#039;&#039;swipe_1&#039;&#039;, &#039;&#039;swipe_2&#039;&#039;, &#039;&#039;swipe_3&#039;&#039; usw.&lt;br /&gt;
&lt;br /&gt;
====Beispiel für die fiktive Rheinischer Kurier News App mit Banner-Anzeigen:====&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone /homepage&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/index&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/artikel&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/bildgal&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/index&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/artikel&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/bildgal&lt;br /&gt;
&lt;br /&gt;
====Beispiel für die fiktive Rheinischer Kurier Epaper iPad App mit Fullscreen-Anzeigen:====&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/preloading_ad&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/openingpage&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_1&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_2&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_3&lt;br /&gt;
&lt;br /&gt;
{{Warnung|text=Der Adserver DFP erlaubt keine Sonderzeichen in den Adunits mit Ausnahme des Unterstrichs &amp;quot;_&amp;quot;. Auch Umlaute und ß sind nicht erlaubt. level2, level3 und seitentyp sollten auch komplett kleingeschrieben werden.&lt;br /&gt;
Generell sind die Adunits vom Google Ad Manager so gedacht, dass sie sich dynamisch aus dem CMS des Mandanten generieren lassen. Sollte das CMS so angelegt sein, dass eine andere Benennung sinnvoll erscheint, muss die iq digital frühzeitig kontaktiert werden, damit eine sinnvolle Lösung für alle Beteiligten gefunden werden kann.&lt;br /&gt;
Bei Rubriken mit einem &amp;quot;und&amp;quot; bzw. einem &amp;quot;&amp;amp;&amp;quot; im Namen, wie z.B. Wirtschaft &amp;amp; Politik, bietet es sich an, nur die Hauptwörter getrennt mit einem Unterstrich aufzuführen, also wirtschaft_politik.}}&lt;br /&gt;
&lt;br /&gt;
===Creative Sizes===&lt;br /&gt;
Im Google Ad Manager stehen die Creative Sizes für die Werbemittel-Größen. Dabei ist es möglich dass die tatsächlich ausgespielte Größe eines Werbemittels von der CreativeSize abweicht (in so einem Fall wird von Pseudogröße gesprochen). Die App muss für ein Adrequest der entsprechenden Platzierung alle zugehörigen Creative Sizes abfragen. Die oft lange Liste aus Größen ergibt sich aus den vielen möglichen unterschiedlichen Werbeformen und den Unterschieden in direkter und programmatischer Vermarktung.&lt;br /&gt;
&lt;br /&gt;
Bei Fullscreen Ad und Preloading Ad Platzierungen werden meist Größen für Portrait- und Landscape-Modus gemeinsam abgefragt.&lt;br /&gt;
&lt;br /&gt;
====Beispiele für Creative Sizes einer Banner Platzierung:====&lt;br /&gt;
99x1, 320x1, 320x50, 320x53, 320x80, 320x160, 320x320, 300x50, 300x75, 300x100, 300x150, 300x250&lt;br /&gt;
(In diesem Beispiel sind 99x1 und 320x1 Pseudogrößen. 99x1 ruft eine Ausbuchung vom Adserver, die die Werbeplatzierung ausblenden lässt. 320x1 ist eine historische Pseudogröße, welche in seltenen Fällen für von der Norm abweichende Werbemittel auf der Platzierung iqadtile1 verwendet wird. Jede Banner-Platzierung hat eine vergleichbare Pseudogröße der Form 320xY mit Y als Platzierungsbezeichnung, z.B. 320x1, 320x3, 320x4, 320x8 etc.&lt;br /&gt;
&lt;br /&gt;
====Beispiele für Creative Sizes einer Fullscreen Platzierung auf einem Android Tablet:====&lt;br /&gt;
310x480, 480x310, 750x1024, 1024x750&lt;br /&gt;
&lt;br /&gt;
====Links zu Creative Sizes im Google Mobile Ads SDK:====&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#multiple_ad_sizes&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#multiple_ad_sizes&lt;br /&gt;
und&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#custom_ad_sizes&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#custom_ad_sizes&lt;br /&gt;
&lt;br /&gt;
===Keywords (Anhängen von Key-Value-Paaren)===&lt;br /&gt;
Ein Adrequest bekommt als CustomTargeting immer eine Gruppe aus Key-Value Paaren. Dabei können mehrere Werte (Values) mit einem Komma separiert sein. &lt;br /&gt;
Diese Keywords haben mehrere Funktionen:&lt;br /&gt;
*bestimmte Buchungen liefern nur aus, wenn diese Keywords existieren (z.B. bei bestimmten Produkten oder auch bei Testschaltungen)&lt;br /&gt;
*Buchungen können über solche Keywords von der Auslieferung ausgeschlossen werden (z.B. um fehlerhafte Darstellungen einer Werbebuchung zu verhindern)&lt;br /&gt;
*solche Keywords erlauben detaillierte Auslieferungs-Berichte (Reports)&lt;br /&gt;
&lt;br /&gt;
Die iq digital benutzt dabei bestimmte Key-Value-Paare. Hier sind die wichtigsten Keys erklärt:&lt;br /&gt;
;kw:Generelle Keyword Liste. Hier sind meist mehrere Werte mit Komma separiert. Üblich sind einige Legacy-Werte (z.B. digtransform,nospa,enozqi). Hinzu kommen Bezeichner für die App oder die Seite (z.B. Rheinischer_Kurier_app_ios_phone), sowie die Werbeplatzierungsbezeichnung (z.B. iqadtile3).&lt;br /&gt;
;tile:Die Nummer der Werbeplatzierung. Im Falle eines iqadtile3 also als Wert 3.&lt;br /&gt;
;doc:Die Bezeichnung des Seitentyps. Gültige Werte sind homepage, index, artikel, bildgal&lt;br /&gt;
;iqadtype:Die Angabe der Plattform. Gültige Werte sind online, mew, app, amp&lt;br /&gt;
;appver:Die Bezeichnung der Appversions-Nummer (s.u.)&lt;br /&gt;
&lt;br /&gt;
Angaben welche Keywords für welche Platzierung verwendet werden sollen, finden sich in der creative_sizes_and_keywords.xlsc Tabelle, die von der iq digital zu Projektstart zur Verfügung gestellt wird.&lt;br /&gt;
&lt;br /&gt;
====Links zum CustomTargeting im Google Mobile Ads SDK====&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/targeting#custom_targeting&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/targeting#custom_targeting&lt;br /&gt;
&lt;br /&gt;
===Debugging===&lt;br /&gt;
[[Datei:Easteregg dialog.png|300px|thumbnail|Beispiel aus einer Android App mit Textfeld für Keywords und Checkbox für USB Debugging]]&lt;br /&gt;
Es muss eine &amp;quot;Easter-Egg&amp;quot;-Funktion in die App eingebaut werden, damit die iq digital Probleme und neue Werbeformen innerhalb der Live App (Version aus dem App- bzw. Playstore) testen kann. Der Adserver DFP bietet die Möglichkeiten Testschaltungen über ein Keyword in der App auszuspielen. &lt;br /&gt;
&lt;br /&gt;
In einem selten frequentierten Bereich der App, wie z.B. dem Impressum, sollte es daher die Möglichkeit für Eingeweihte geben, einen kleinen Dialog aufzurufen. Durch diesen kann man ein selbst gewähltes Keyword jedem zukünftigen Adrequest anhängen. Gleichzeitig oder durch das Aktivierung einer Checkbox kann der USB-Debug-Modus, um die Werbe Webviews in der Android App auf dem Desktop Chrome zu inspizieren, aktiviert werden. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WebView.setWebContentsDebuggingEnabled(true);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Danach kann man unter Android die Webviews der App im Desktop Chrome mit chrome://inspect einsehen. &lt;br /&gt;
Dies ermöglicht Fehler in der Werbedarstellung besser zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Ohne ein Debug Easter Egg in der App kann nach Livegang keine Testschaltung aufgesetzt werden und es können auch keine Probleme analysiert werden. Dies würde die Wartung der App von Seiten der iq digital verhindern und auch dem Mandanten keine Möglichkeit geben, selber seine App mit Testwerbung zu überprüfen.&lt;br /&gt;
Die Keyword-Funktion dient daher, den Personenkreis einzuschränken, der die Testschaltungen zu Gesicht bekäme. &lt;br /&gt;
&lt;br /&gt;
Das Anhängen der Keywords ist beim Punkt [[#Anhängen von Key-Value-Paaren]] genauer erklärt.&lt;br /&gt;
&lt;br /&gt;
Mehrfache Keywords werden durch Kommata separiert.&lt;br /&gt;
&lt;br /&gt;
Es gibt vielfältige Optionen, wie das Easter-Egg aktiviert werden kann. Mehrfache/unsinnige Taps auf UI-Elemente oder eine ganz spezielle Eingabe ins Suchfeld seien hier beispielhaft genannt. Die iq digital erlaubt sich aber die Vorgabe, dass unter Android und iOS das  Debug-Easter-Egg identisch aktiviert wird. Bei der Art der Aktivierung des Debug-Easter-Egg stehen wir gerne beratend zur Seite.&lt;br /&gt;
&lt;br /&gt;
===Wichtige Hinweise zu dieser Anleitung===&lt;br /&gt;
Die Adunits für die Werbeplatzierungen werden von uns erst zu Projektstart erstellt und mit Testwerbung belegt. Anschließend werden die Adunits an den Mandanten übermittelt.&lt;br /&gt;
Bitte nicht mit der im SDK fest eingebauten Logik für Test-Werbemittel arbeiten. Diese entspricht nicht der Art und Weise wie die von der iq digital vermarktete Werbung funktioniert und führt zu Missverständnissen.&lt;br /&gt;
Stattdessen sind auf den Adunits permanent Buchungen mit Test-Werbemitteln aktiv welche über ein spezielles Test-Keyword im Adrequest vom Adserver ausgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
===Ansprechpartner iq digital===&lt;br /&gt;
Die iq digital steht für Fragen und Kommentare gerne zur Verfügung. Sollten wir einmal nicht weiterhelfen können, ist es uns möglich einen Entwickler von Google als Ansprechpartner in die Diskussion mit einzubeziehen.&lt;br /&gt;
&lt;br /&gt;
====Tim Lohmann (Mobile Developer Ad Technology)====&lt;br /&gt;
;Telefon:+49 211 887 2336&lt;br /&gt;
;E-Mail:tim.lohmann@iqdigital.de&lt;br /&gt;
&lt;br /&gt;
===Wichtige Dokumente===&lt;br /&gt;
====Liste der Creative Sizes und Keywords für jede  Platzierung:====&lt;br /&gt;
*&amp;lt;datum&amp;gt;_dfp_creative_sizes.xlsx&lt;br /&gt;
====Liste der Adunits:====&lt;br /&gt;
(diese dienen nur als Orientierungshilfe. Die Apps sollten diese Zonen dynamisch aus dem CMS generieren)&lt;br /&gt;
&amp;lt;appname&amp;gt; muss durch den entsprechenden App Namen ersetzt werden.&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_android_tablet.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ios_tablet.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ android_phone.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ios_phone.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Preloading Ad==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist eine Display ausfüllende Anzeige, die während des Ladescreen (Splashscreen) der App angezeigt wird. Sie wird für 5s angezeigt und schließt dann automatisch. In einer Ecke wird ein Close-Button angezeigt, um vorzeitig zum Inhalt der App zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Preloading Ad 1.png|x300px]]&lt;br /&gt;
[[Datei:Preloading Ad 2.png|300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung legt sich wie ein Overlay über den Splash-Screen der App. Im Hintergrund kann die App den Content laden.&lt;br /&gt;
|template=&lt;br /&gt;
*skaliert Werbemittel bei Beibehaltung des Seitenverhältnisses entsprechend der Abmaße des Werbecontainers&lt;br /&gt;
*schließt das Werbemittel nach 5s&lt;br /&gt;
*positioniert und zentriert das Werbemittel&lt;br /&gt;
*zeigt in einer Ecke einen Close-Button an, mit dem der Nutzer jederzeit zum Content zurückkehren kann.&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: skaliert die Werbemittel enstprechend der neuen Maße. Dies kann mehrere hundert Millisekunden dauern, bis alle neuen Maße feststehen und vom Webviewbrowser zur Verfügung gestellt werden.&lt;br /&gt;
Durch die Skalierung können je nach Display am Rand schwarze oder weiße Balken entstehen. Dies passiert immer dann, wenn das Display ein anderes Seitenverhältnis als die Werbemittel hat.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet das Adrequest während des Splash-Screens&lt;br /&gt;
*im Falle einer Buchung: &lt;br /&gt;
**erzeugt das Interstitial mit Hilfe des GMA SDKs&lt;br /&gt;
**vergrößert den Werbecontainers auf Display-Größe&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: passt die Werbeseite und den Werbecontainer an die neuen Display-Maße an&lt;br /&gt;
*bereitet im Hintergrund weiter den Content vor&lt;br /&gt;
*im Falle &#039;&#039;&#039;keiner&#039;&#039;&#039; Buchung: wird normal der Content geladen&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App wird vom Nutzer gestartet&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt das Interstitial&lt;br /&gt;
#Werbetemplate skaliert Werbemittel in dem Container&lt;br /&gt;
#nach 5s schließt sich das Ad automatisch und der Content dahinter wird sichtbar&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet, dass er keine Werbebuchung hat&lt;br /&gt;
#App lädt ganz normal den Content&lt;br /&gt;
|creativesizes=&lt;br /&gt;
;Smartphone:320x480 bzw. 480x320&lt;br /&gt;
;Tablet:768x1024 bzw. 1024x768&amp;lt;br /&amp;gt;(bei Android auch zusätzlich: 320x480 bzw. 480x320)&lt;br /&gt;
{{Warnung|text=Die Creativesizes sind Pseudogrößen, sie entsprechen nicht den tatsächlichen Abmaßen des Werbemittels.}}&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:iqadtilePre&lt;br /&gt;
;tile:0&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Fullscreen Anzeigen (auch Swipe Anzeigen oder Swipe-Ads genannt)==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist eine Display ausfüllende Anzeigen, die zwischen zwei regulären Content-Seiten in der App angezeigt wird. Sie lässt sich horizontal wie die übrigen Content-Seiten swipen und wird von keinen Teilen der App (wie App-Header oder -Footer) überlagert. Sollte der Nutzer ein Orientationchange-Event erzeugen, passt sich die Anzeige dem neuen Seitenverhältnis an.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fullscreen Ad 1.png|x300px]]&lt;br /&gt;
[[Datei:Fullscreen Ad 2.png|300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung ist dynamisch zwischen zwei Content-Seiten eingebettet. Dabei befindet sich die Werbeplatzierung immer rechts neben der Seite, die Ihr im Content zugeordnet ist, z.B. Politik/swipe_1 meint, dass zuerst die 1. Politik-Content-Seite angezeigt wird und beim nächsten Swipe die Werbe-Seite erscheint &lt;br /&gt;
|template=&lt;br /&gt;
*skaliert Werbemittel bei Beibehaltung des Seitenverhältnisses entsprechend der Abmaße des Werbecontainers&lt;br /&gt;
*positioniert und zentriert das Werbemittel&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: skaliert die Werbemittel enstprechend der neuen Maße. Dies kann mehrere hundert Millisekunden dauern, bis alle neuen Maße feststehen und vom Webviewbrowser zur Verfügung gestellt werden.&lt;br /&gt;
Durch die Skalierung können je nach Display am Rand schwarze oder weiße Balken entstehen. Dies passiert immer dann, wenn das Display ein anderes Seitenverhältnis als die Werbemittel hat.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet das Adrequest 1-2 Content-Seiten vor der Platzierung ab, damit der Adserver Zeit genug hat, die Werbung zu liefern&lt;br /&gt;
*erzeugt dynamisch eine Werbeseite im Seitenfluss rechts neben der zugeordneten Content-Seite&lt;br /&gt;
*im Falle einer Buchung: vergößert den Werbecontainers auf Display-Größe&lt;br /&gt;
*blendet App-Header und -Footer aus (falls erforderlich)&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: passt die Werbeseite und den Werbecontainer an die neuen Display-Maße an&lt;br /&gt;
*im Falle &#039;&#039;&#039;keiner&#039;&#039;&#039; Buchung: entfernt die Werbeseite aus dem Seitenfluss&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt dynamisch die Werbeseite&lt;br /&gt;
#Werbecontainer wird auf die Display-Abmaße aufgezogen&lt;br /&gt;
#Werbetemplate skaliert Werbemittel in dem Container&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet, dass er keine Werbebuchung hat&lt;br /&gt;
#App erzeugt &#039;&#039;&#039;keine&#039;&#039;&#039; Werbeseite bzw. entfernt eine zuvor erzeugte Werbeseite aus dem Seitenfluss&lt;br /&gt;
|creativesizes=&lt;br /&gt;
;Smartphone:310x480 bzw. 480x310&lt;br /&gt;
;Tablet:750x1024 bzw. 1024x750&amp;lt;br /&amp;gt;(bei Android auch zusätzlich: 310x480 bzw. 480x310)&lt;br /&gt;
{{Warnung|text=Die Creativesizes sind Pseudogrößen, sie entsprechen nicht den tatsächlichen Abmaßen des Werbemittels.}}&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:iqadtileFull&lt;br /&gt;
;tile:1&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Banner-Anzeigen==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist ein Banner innerhalb einer Content-Seite. Je nach Werbeform kann diese Anzeige mehr oder weniger Interaktivität für den Endnutzer besitzen. Sie kann anmiert oder eine komplexe HTML-Anzeige sein. Es ist auch möglich dass die Anzeige durch bestimmte Ereignisse sich in der Größe verändert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Mobile High Impact Ad.png|x300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung ist zwischen Content-Elemente einer Seite platziert und erfordert eine Anzeigenkennzeichnung &amp;quot;Anzeige&amp;quot; oberhalb der Platzierung. Üblicherweise befinden sich mehrere Platzierungen innerhalb einer Seite.&lt;br /&gt;
|template=&lt;br /&gt;
*kümmert sich um die Funktionalität, welche je nach Werbeform simpel oder komplex sein kann.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet die Adrequests für alle Platzierungen einer Seite&lt;br /&gt;
*baut für jede Platzierung eine Anzeigenkennzeichnung &amp;quot;Anzeige&amp;quot; oberhalb der Platzierung ein&lt;br /&gt;
*erstellt den Werbecontainer mit Größe, welche in der Antwort vom Andserver auf das Adrequest mitgeliefert wird&lt;br /&gt;
*lauscht mit dem EventListener auf mögliche setsize- oder noad-Events und verändert den Werbecontainer entsprechend.&lt;br /&gt;
*im Falle einer Ausbuchung:&lt;br /&gt;
**empfängt sie ein setsize-Event muss sie die Werbeplatzierung und den Werbecontainer an die neue Größe anpassen, sofern sich diese von der aktuellen Größe unterscheidet&lt;br /&gt;
**empfängt sie ein noad-Event, muss sie die Werbeplatzierung und die zugehörige Anzeigenkennzeichnung komplett entfernen bzw. ausblenden&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt Werbecontainer mit der Größe, die in der Response des Adservers enthalten ist&lt;br /&gt;
#eventuell muss der Werbecontainer auf Grund eines setsize-Events angepasst werden&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Ausbuchung als Werbebuchung&lt;br /&gt;
#App empfängt eine Response mit der Größe 99x1 und erhält kurze Zeit später ein noad-Event&lt;br /&gt;
#App blendet Werbeplatzierung und Anzeigenkennzeichnung bis zum nächsten Pagerequest aus&lt;br /&gt;
|creativesizes=&lt;br /&gt;
320x50, 320x53, 320x80, 320x106, 320x160, 320x320, 320x416, 320x460, 300x50, 300x75, 300x100, 300x150, 300x200, 300x250, 300x600&lt;br /&gt;
Weitere Größen sind möglich. Je nach Platzierung wird nur ein Auszug der Größenliste im Adrequest verwendet. Eine genaue Zuordnung erfolgt in einem separaten Dokument.&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:nospa, enozqi, digtransform, iqadtileX*&lt;br /&gt;
;tile:X*&lt;br /&gt;
X entspricht dabei der Nummer der Platzierung, z.B. iqadtile1, iqadtile3, iqadtile4, iqadtile99, iqadtile8&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Dokumentation der iq digital App Events==&lt;br /&gt;
Die App Events bestehen aus dem Namen und einem &amp;quot;data&amp;quot;-String&lt;br /&gt;
&lt;br /&gt;
===setsize – Event===&lt;br /&gt;
Das setsize-Event wird von den Werbetemplates der iq digital aufgerufen, um die Größe des Adviews der Werbeplatzierung zu verändern.&lt;br /&gt;
Der &amp;quot;data&amp;quot;-String hat das Format &#039;&#039;&#039;&amp;quot;width:height&amp;quot;&#039;&#039;&#039; für eine sofortige Änderung der Größe.&lt;br /&gt;
&lt;br /&gt;
=====Parameter=====&lt;br /&gt;
Die Parameter werden mit einem Doppelpunkt von einander getrennt.&lt;br /&gt;
;width:Die neue Breite des Adviews in Pixel  (Device-Independent-Pixel) als ganze Zahl.&lt;br /&gt;
;height:Die neue Höhe des Adviews in Pixel  (Device-Independent-Pixel) als ganze Zahl.&lt;br /&gt;
{{Warnung|text=Ausnahme: Für eine Anpassung auf die maximal verfügbare Breite oder Höhe wird der Wert &#039;&#039;&#039;max&#039;&#039;&#039; verwendet.}}&lt;br /&gt;
&lt;br /&gt;
Beispielaufrufe:&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;320:80&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview bekommt die neue Größe 320x80 Pixel&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;320:240&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview bekommt die neue Größe 320x240 Pixel&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;max:160&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview wird auf die maximal verfügbare Breite und eine Höhe von 160 Pixel angepasst&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;max:max&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview wird auf die maximal verfügbare Breite und die maximal verfügbare Höhe angepasst&lt;br /&gt;
&lt;br /&gt;
===noad – Event===&lt;br /&gt;
Das noad-Event wird von den Werbetemplates der iq digital aufgerufen, um der App zu signalisieren, dass für die Platzierung keine Buchung vorliegt und die App die Werbeplatzierung &#039;&#039;&#039;und die zugehörige Anzeigenkennzeichnung&#039;&#039;&#039; entfernen soll.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;data&amp;quot;-String hat für dieses Event keine Bedeutung und kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Ad Technology]][[Kategorie:APP]]&lt;br /&gt;
[[en:Integration of the Google Mobile Ads SDK]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Einbau_des_Google_Mobile_Ads_SDK&amp;diff=194</id>
		<title>Einbau des Google Mobile Ads SDK</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Einbau_des_Google_Mobile_Ads_SDK&amp;diff=194"/>
		<updated>2021-11-12T22:57:51Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: /* Creative Sizes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Offizielle Dokumentation zum Google Mobile Ads SDK==&lt;br /&gt;
Das Google Mobile Ads SDK (GMA SDK) bringt alles mit, was für eine Werbeausspielung in nativen Apps benötigt wird.&lt;br /&gt;
&lt;br /&gt;
===Getting Started zum Google Mobile Ads SDK===&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start GMA SDK iOS Getting Started]&lt;br /&gt;
&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/android/quick-start GMA SDK iOS Getting Started]&lt;br /&gt;
&lt;br /&gt;
===Download des Google Mobile Ads SDK===&lt;br /&gt;
====Android====&lt;br /&gt;
Das GMA SDK ist in den Android Play Services integriert und deshalb auf den Android Geräten vorhanden. &lt;br /&gt;
&lt;br /&gt;
====iOS====&lt;br /&gt;
Für iOS kann das GMA SDK hier heruntergeladen werden:&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/ios/download Download iOS]&lt;br /&gt;
&lt;br /&gt;
===Ad-Manager vs. Admob===&lt;br /&gt;
Die Dokumentation zum Google Mobile Ads SDK gibt es in zwei Varianten: für Ad-Manager- und Admob-Nutzer. Die iq digital ist ein Ad-Manager Kunde, deswegen muss unbedingt darauf geachtet werden, dass in der Browser-URL https://developers.google.com/ad-manager/... enthalten ist. Die Admob Doku unterscheidet sich leicht von der Ad-Manager Doku.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kurze Einführung in den Lebens-Zyklus einer Werbeausspielung mit dem GMA SDK==&lt;br /&gt;
Am Beispiel einer Banner-Werbeausspielung wird hier kurz der Lebens-Zyklus einer Werbeausspielung erklärt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GMA_SDK.png|800px|thumbnail|Übersicht Workflow der Werbeausspielung mit GMA SDK]]&lt;br /&gt;
&lt;br /&gt;
===Request===&lt;br /&gt;
Das Adrequest wird in der App zusammengestellt und besteht aus mehreren Komponenten. Für eine erfolgreiche Werbeausspielung sind folgende Komponenten wichtig:&lt;br /&gt;
;Consent String:Die App benötigt vom Nutzer einen gültigen Consent für die Werbeausspielung. Dabei sind neben mehreren relevanten Purposes auch der Vendor 755 Google Advertising Products notwendig (s.u.)&lt;br /&gt;
;Creative-Sizes:In den meisten Fällen benutzen wir &#039;&#039;&#039;multisize&#039;&#039;&#039;-Adrequests. Das bedeutet, dass das Adrequest mehrere Creative Größen enthält und der Adserver daraufhin prüft, ob er ein Creative für eine dieser Größen zur Verfügung hat. Beispiele sind z.B. 320x1, 320x53, 320x80, 320x106, 320x160 etc.&lt;br /&gt;
;Adunit:Die Adunit ist die Adresse der Werbeplatzierung. Damit weiß der Adserver, auf welcher Seite eine Werbeausspielung erfolgt. Die Adunit ist für alle Adrequests eines Pagerequests gleich. Beispiel: /183/Rheinischer_Kurier_ios_phone/homepage &lt;br /&gt;
;Keywords (optional):Keywords sind Key-Value Paare und können eine Werbeplatzierung um weitere Informationen anreichern, die für eine gezielte Werbeausspielung notwendig sind. Die Werbeplatzierungen der iq digital enthalten alle eine bestimmte Bezeichnung, welche über die Keywords dem Adserver mitgegeben wird. Beispiel: kw=iqadtile1,digtransfrom&amp;amp;tile=1&amp;amp;doc=homepage&lt;br /&gt;
&lt;br /&gt;
===Adserver Google Admanager 360===&lt;br /&gt;
Wenn der Adserver gültigen Consent besitzt, prüft ein Verteilungsalgorithmus, ob eine oder mehrere Werbebuchungen für die Adunit, Creative sizes und Keywords vorliegen. Ist dies der Fall wählt der Adserver die beste dafür aus. Sind mehrere Buchungen gleich wichtig, wählt er zufällig eine davon aus. Nur im Falle keiner Buchung würde er eine &#039;&#039;&#039;no ad&#039;&#039;&#039; oder &#039;&#039;&#039;no fill&#039;&#039;&#039; Meldung ausgeben, die besagt, dass für die Kombination aus adunit, creative size und Keywords keine Buchung existiert.&lt;br /&gt;
&lt;br /&gt;
===Ausspielung innerhalb der App===&lt;br /&gt;
Die App lädt die Response des Adservers, die aus dem Template-Code und den Creative Komponenten besteht. Dabei ist zu beachten, dass der Werbecontainer auf die creative size des ausgelieferten Creatives vergrößert wird. Für Fullscreen Ads muss diese Größe von der App nachträglich auf die Display Viewport Größe (also device independent pixel) angepasst werden. Im Falle einer Banner Anzeige bekommt die App meist nach dem Ladevorgang ein oder mehrere setsize-Events über den einzubauenden AppEventHandler und muss den Werbecontainer auf die neue Größe anpassen, sofern diese sich von der creative size unterscheidet.&lt;br /&gt;
&lt;br /&gt;
===Impression-Zählung===&lt;br /&gt;
Eine Impression Zählung, die misst, dass ein Ad angesehen wurde, wird vom GMA SDK automatisch abgeschickt, sobald mindestens 1px im sichtbaren Bereich des Displays ist.&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Informationen==&lt;br /&gt;
===Adunits (Zonierung)===&lt;br /&gt;
Der Google Ad Manager benutzt zur Adressierung der Seiten Adunits, die sich wie folgt zusammensetzen können:&lt;br /&gt;
*/netzwerkId/level1&lt;br /&gt;
*/netzwerkId/level1/seitentyp&lt;br /&gt;
*/netzwerkId/level1/level2/seitentyp&lt;br /&gt;
*/netzwerkId/level1/level2/level3/seitentyp&lt;br /&gt;
*usw.&lt;br /&gt;
&lt;br /&gt;
====Begriffserklärung====&lt;br /&gt;
;netzwerkId:Hier ist immer die Netzwerk ID der iq digital einzugeben: 183&lt;br /&gt;
;level1:Dies ist die Bezeichnung der App im Google Ad Manager und wird von der iq digital vorgegeben. Die Bezeichnung besteht aus &amp;lt;appname&amp;gt;_app_&amp;lt;plattform&amp;gt;_&amp;lt;gerätetyp&amp;gt;.&lt;br /&gt;
:;appname:Der Name der App&lt;br /&gt;
:;plattform:Das Betriebsystem, also &#039;&#039;ios&#039;&#039; oder &#039;&#039;android&#039;&#039;&lt;br /&gt;
:;gerätetyp:Der Gerätetyp, also &#039;&#039;&#039;phone&#039;&#039;&#039; oder &#039;&#039;tablet&#039;&#039;&lt;br /&gt;
;level2:Dies ist die Bezeichnung einer Rubrik der App, z.B. &#039;&#039;politik&#039;&#039;&lt;br /&gt;
;level3 (usw.):Dies ist die Bezeichnung für eine Unterrubrik, z.B. im Falle von &#039;&#039;politik&#039;&#039; als level2 wäre &#039;&#039;ausland&#039;&#039; eine Unterrubrik für level3. Level4 und höher sind weitere tiefere Verzweigungen der App, diese werden im Normalfall nicht also Adunits angelegt und solche Seiten würden unter dem level3 angelegt werden.&lt;br /&gt;
;seitentyp:In Apps mit Banner-Anzeigen (z.B. News Apps) bezeichnet &#039;&#039;seitentyp&#039;&#039; die unterschiedlichen Seitentypen, also ob es sich z.B. um eine Übersichts-, Artikel- oder Bildergalerieseite handelt. Übliche Werte dafür sind &#039;&#039;homepage&#039;&#039;, &#039;&#039;index&#039;&#039;, &#039;&#039;artikel&#039;&#039;, &#039;&#039;bildgal&#039;&#039;. In Apps mit Fullscreen-Anzeigen (z.B. epaper oder Zeitungs Apps) werden mit &#039;&#039;seitentyp&#039;&#039; die unterschiedlichen Anzeigeplätze innerhalb der Rubrik gemeint, also ob es sich z.B. erste, zweite oder dritte Swipe Anzeige handelt. Übliche Werte sind &#039;&#039;openingpage&#039;&#039;, &#039;&#039;swipe_1&#039;&#039;, &#039;&#039;swipe_2&#039;&#039;, &#039;&#039;swipe_3&#039;&#039; usw.&lt;br /&gt;
&lt;br /&gt;
====Beispiel für die fiktive Rheinischer Kurier News App mit Banner-Anzeigen:====&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone /homepage&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/index&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/artikel&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/bildgal&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/index&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/artikel&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/bildgal&lt;br /&gt;
&lt;br /&gt;
====Beispiel für die fiktive Rheinischer Kurier Epaper iPad App mit Fullscreen-Anzeigen:====&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/preloading_ad&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/openingpage&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_1&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_2&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_3&lt;br /&gt;
&lt;br /&gt;
{{Warnung|text=Der Adserver DFP erlaubt keine Sonderzeichen in den Adunits mit Ausnahme des Unterstrichs &amp;quot;_&amp;quot;. Auch Umlaute und ß sind nicht erlaubt. level2, level3 und seitentyp sollten auch komplett kleingeschrieben werden.&lt;br /&gt;
Generell sind die Adunits vom Google Ad Manager so gedacht, dass sie sich dynamisch aus dem CMS des Mandanten generieren lassen. Sollte das CMS so angelegt sein, dass eine andere Benennung sinnvoll erscheint, muss die iq digital frühzeitig kontaktiert werden, damit eine sinnvolle Lösung für alle Beteiligten gefunden werden kann.&lt;br /&gt;
Bei Rubriken mit einem &amp;quot;und&amp;quot; bzw. einem &amp;quot;&amp;amp;&amp;quot; im Namen, wie z.B. Wirtschaft &amp;amp; Politik, bietet es sich an, nur die Hauptwörter getrennt mit einem Unterstrich aufzuführen, also wirtschaft_politik.}}&lt;br /&gt;
&lt;br /&gt;
===Creative Sizes===&lt;br /&gt;
Im Google Ad Manager stehen die Creative Sizes für die Werbemittel-Größen. Dabei ist es möglich dass die tatsächlich ausgespielte Größe eines Werbemittels von der CreativeSize abweicht (in so einem Fall wird von Pseudogröße gesprochen). Die App muss für ein Adrequest der entsprechenden Platzierung alle zugehörigen Creative Sizes abfragen. Die oft lange Liste aus Größen ergibt sich aus den vielen möglichen unterschiedlichen Werbeformen und den Unterschieden in direkter und programmatischer Vermarktung.&lt;br /&gt;
&lt;br /&gt;
Bei Fullscreen Ad und Preloading Ad Platzierungen werden meist Größen für Portrait- und Landscape-Modus gemeinsam abgefragt.&lt;br /&gt;
&lt;br /&gt;
====Beispiele für Creative Sizes einer Banner Platzierung:====&lt;br /&gt;
99x1, 320x1, 320x50, 320x53, 320x80, 320x160, 320x320, 300x50, 300x75, 300x100, 300x150, 300x250&lt;br /&gt;
(In diesem Beispiel sind 99x1 und 320x1 Pseudogrößen. 99x1 ruft eine Ausbuchung vom Adserver, die die Werbeplatzierung ausblenden lässt. 320x1 ist eine historische Pseudogröße, welche in seltenen Fällen für von der Norm abweichende Werbemittel auf der Platzierung iqadtile1 verwendet wird. Jede Banner-Platzierung hat eine vergleichbare Pseudogröße der Form 320xY mit Y als Platzierungsbezeichnung, z.B. 320x1, 320x3, 320x4, 320x8 etc.&lt;br /&gt;
&lt;br /&gt;
====Beispiele für Creative Sizes einer Fullscreen Platzierung auf einem Android Tablet:====&lt;br /&gt;
310x480, 480x310, 750x1024, 1024x750&lt;br /&gt;
&lt;br /&gt;
====Links zu Creative Sizes im Google Mobile Ads SDK:====&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#multiple_ad_sizes&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#multiple_ad_sizes&lt;br /&gt;
und&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#custom_ad_sizes&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#custom_ad_sizes&lt;br /&gt;
&lt;br /&gt;
===Keywords (Anhängen von Key-Value-Paaren)===&lt;br /&gt;
Ein Adrequest bekommt als CustomTargeting immer eine Gruppe aus Key-Value Paaren. Dabei können mehrere Werte (Values) mit einem Komma separiert sein. &lt;br /&gt;
Diese Keywords haben mehrere Funktionen:&lt;br /&gt;
*bestimmte Buchungen liefern nur aus, wenn diese Keywords existieren (z.B. bei bestimmten Produkten oder auch bei Testschaltungen)&lt;br /&gt;
*Buchungen können über solche Keywords von der Auslieferung ausgeschlossen werden (z.B. um fehlerhafte Darstellungen einer Werbebuchung zu verhindern)&lt;br /&gt;
*solche Keywords erlauben detaillierte Auslieferungs-Berichte (Reports)&lt;br /&gt;
&lt;br /&gt;
Die iq digital benutzt dabei bestimmte Key-Value-Paare. Hier sind die wichtigsten Keys erklärt:&lt;br /&gt;
;kw:Generelle Keyword Liste. Hier sind meist mehrere Werte mit Komma separiert. Üblich sind einige Legacy-Werte (z.B. digtransform,nospa,enozqi). Hinzu kommen Bezeichner für die App oder die Seite (z.B. Rheinischer_Kurier_app_ios_phone), sowie die Werbeplatzierungsbezeichnung (z.B. iqadtile3).&lt;br /&gt;
;tile:Die Nummer der Werbeplatzierung. Im Falle eines iqadtile3 also als Wert 3.&lt;br /&gt;
;doc:Die Bezeichnung des Seitentyps. Gültige Werte sind homepage, index, artikel, bildgal&lt;br /&gt;
;iqadtype:Die Angabe der Plattform. Gültige Werte sind online, mew, app, amp&lt;br /&gt;
;appver:Die Bezeichnung der Appversions-Nummer (s.u.)&lt;br /&gt;
&lt;br /&gt;
Angaben welche Keywords für welche Platzierung verwendet werden sollen, finden sich in der creative_sizes_and_keywords.xlsc Tabelle, die von der iq digital zu Projektstart zur Verfügung gestellt wird.&lt;br /&gt;
&lt;br /&gt;
====Links zum CustomTargeting im Google Mobile Ads SDK====&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/targeting#custom_targeting&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/targeting#custom_targeting&lt;br /&gt;
&lt;br /&gt;
===Debugging===&lt;br /&gt;
[[Datei:Easteregg dialog.png|300px|thumbnail|Beispiel aus einer Android App mit Textfeld für Keywords und Checkbox für USB Debugging]]&lt;br /&gt;
Es muss eine &amp;quot;Easter-Egg&amp;quot;-Funktion in die App eingebaut werden, damit die iq digital Probleme und neue Werbeformen innerhalb der Live App (Version aus dem App- bzw. Playstore) testen kann. Der Adserver DFP bietet die Möglichkeiten Testschaltungen über ein Keyword in der App auszuspielen. &lt;br /&gt;
&lt;br /&gt;
In einem selten frequentierten Bereich der App, wie z.B. dem Impressum, sollte es daher die Möglichkeit für Eingeweihte geben, einen kleinen Dialog aufzurufen. Durch diesen kann man ein selbst gewähltes Keyword jedem zukünftigen Adrequest anhängen. Gleichzeitig oder durch das Aktivierung einer Checkbox kann der USB-Debug-Modus, um die Werbe Webviews in der Android App auf dem Desktop Chrome zu inspizieren, aktiviert werden. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WebView.setWebContentsDebuggingEnabled(true);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Danach kann man unter Android die Webviews der App im Desktop Chrome mit chrome://inspect einsehen. &lt;br /&gt;
Dies ermöglicht Fehler in der Werbedarstellung besser zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Ohne ein Debug Easter Egg in der App kann nach Livegang keine Testschaltung aufgesetzt werden und es können auch keine Probleme analysiert werden. Dies würde die Wartung der App von Seiten der iq digital verhindern und auch dem Mandanten keine Möglichkeit geben, selber seine App mit Testwerbung zu überprüfen.&lt;br /&gt;
Die Keyword-Funktion dient daher, den Personenkreis einzuschränken, der die Testschaltungen zu Gesicht bekäme. &lt;br /&gt;
&lt;br /&gt;
Das Anhängen der Keywords ist beim Punkt [[#Anhängen von Key-Value-Paaren]] genauer erklärt.&lt;br /&gt;
&lt;br /&gt;
Mehrfache Keywords werden durch Kommata separiert.&lt;br /&gt;
&lt;br /&gt;
Es gibt vielfältige Optionen, wie das Easter-Egg aktiviert werden kann. Mehrfache/unsinnige Taps auf UI-Elemente oder eine ganz spezielle Eingabe ins Suchfeld seien hier beispielhaft genannt. Die iq digital erlaubt sich aber die Vorgabe, dass unter Android und iOS das  Debug-Easter-Egg identisch aktiviert wird. Bei der Art der Aktivierung des Debug-Easter-Egg stehen wir gerne beratend zur Seite.&lt;br /&gt;
&lt;br /&gt;
===Wichtige Hinweise zu dieser Anleitung===&lt;br /&gt;
Die Adunits für die Werbeplatzierungen werden von uns erst zu Projektstart erstellt und mit Testwerbung belegt. Anschließend werden die Adunits an den Mandanten übermittelt.&lt;br /&gt;
Bitte nicht mit der im SDK fest eingebauten Logik für Test-Werbemittel arbeiten. Diese entspricht nicht der Art und Weise wie die von der iq digital vermarktete Werbung funktioniert und führt zu Missverständnissen.&lt;br /&gt;
Stattdessen sind auf den Adunits permanent Buchungen mit Test-Werbemitteln aktiv welche über ein spezielles Test-Keyword im Adrequest vom Adserver ausgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
===Ansprechpartner iq digital===&lt;br /&gt;
Die iq digital steht für Fragen und Kommentare gerne zur Verfügung. Sollten wir einmal nicht weiterhelfen können, ist es uns möglich einen Entwickler von Google als Ansprechpartner in die Diskussion mit einzubeziehen.&lt;br /&gt;
&lt;br /&gt;
====Tim Lohmann (Mobile Developer Ad Technology)====&lt;br /&gt;
;Telefon:+49 211 887 2336&lt;br /&gt;
;E-Mail:tim.lohmann@iqdigital.de&lt;br /&gt;
&lt;br /&gt;
===Wichtige Dokumente===&lt;br /&gt;
====Liste der Creative Sizes und Keywords für jede  Platzierung:====&lt;br /&gt;
*&amp;lt;datum&amp;gt;_dfp_creative_sizes.xlsx&lt;br /&gt;
====Liste der Adunits:====&lt;br /&gt;
(diese dienen nur als Orientierungshilfe. Die Apps sollten diese Zonen dynamisch aus dem CMS generieren)&lt;br /&gt;
&amp;lt;appname&amp;gt; muss durch den entsprechenden App Namen ersetzt werden.&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_android_tablet.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ios_tablet.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ android_phone.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ios_phone.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Preloading Ad==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist eine Display ausfüllende Anzeige, die während des Ladescreen (Splashscreen) der App angezeigt wird. Sie wird für 5s angezeigt und schließt dann automatisch. In einer Ecke wird ein Close-Button angezeigt, um vorzeitig zum Inhalt der App zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Preloading Ad 1.png|x300px]]&lt;br /&gt;
[[Datei:Preloading Ad 2.png|300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung legt sich wie ein Overlay über den Splash-Screen der App. Im Hintergrund kann die App den Content laden.&lt;br /&gt;
|template=&lt;br /&gt;
*skaliert Werbemittel bei Beibehaltung des Seitenverhältnisses entsprechend der Abmaße des Werbecontainers&lt;br /&gt;
*schließt das Werbemittel nach 5s&lt;br /&gt;
*positioniert und zentriert das Werbemittel&lt;br /&gt;
*zeigt in einer Ecke einen Close-Button an, mit dem der Nutzer jederzeit zum Content zurückkehren kann.&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: skaliert die Werbemittel enstprechend der neuen Maße. Dies kann mehrere hundert Millisekunden dauern, bis alle neuen Maße feststehen und vom Webviewbrowser zur Verfügung gestellt werden.&lt;br /&gt;
Durch die Skalierung können je nach Display am Rand schwarze oder weiße Balken entstehen. Dies passiert immer dann, wenn das Display ein anderes Seitenverhältnis als die Werbemittel hat.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet das Adrequest während des Splash-Screens&lt;br /&gt;
*im Falle einer Buchung: &lt;br /&gt;
**erzeugt das Interstitial mit Hilfe des GMA SDKs&lt;br /&gt;
**vergößert den Werbecontainers auf Display-Größe&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: passt die Werbeseite und den Werbecontainer an die neuen Display-Maße an&lt;br /&gt;
*bereitet im Hintergrund weiter den Content vor&lt;br /&gt;
*im Falle &#039;&#039;&#039;keiner&#039;&#039;&#039; Buchung: wird normal der Content geladen&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App wird vom Nutzer gestartet&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt das Interstitial&lt;br /&gt;
#Werbetemplate skaliert Werbemittel in dem Container&lt;br /&gt;
#nach 5s schließt sich das Ad automatisch und der Content dahinter wird sichtbar&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet, dass er keine Werbebuchung hat&lt;br /&gt;
#App lädt ganz normal den Content&lt;br /&gt;
|creativesizes=&lt;br /&gt;
;Smartphone:320x480 bzw. 480x320&lt;br /&gt;
;Tablet:768x1024 bzw. 1024x768&amp;lt;br /&amp;gt;(bei Android auch zusätzlich: 320x480 bzw. 480x320)&lt;br /&gt;
{{Warnung|text=Die Creativesizes sind Pseudogrößen, sie entsprechen nicht den tatsächlichen Abmaßen des Werbemittels.}}&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:iqadtilePre&lt;br /&gt;
;tile:0&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Fullscreen Anzeigen (auch Swipe Anzeigen oder Swipe-Ads genannt)==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist eine Display ausfüllende Anzeigen, die zwischen zwei regulären Content-Seiten in der App angezeigt wird. Sie lässt sich horizontal wie die übrigen Content-Seiten swipen und wird von keinen Teilen der App (wie App-Header oder -Footer) überlagert. Sollte der Nutzer ein Orientationchange-Event erzeugen, passt sich die Anzeige dem neuen Seitenverhältnis an.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fullscreen Ad 1.png|x300px]]&lt;br /&gt;
[[Datei:Fullscreen Ad 2.png|300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung ist dynamisch zwischen zwei Content-Seiten eingebettet. Dabei befindet sich die Werbeplatzierung immer rechts neben der Seite, die Ihr im Content zugeordnet ist, z.B. Politik/swipe_1 meint, dass zuerst die 1. Politik-Content-Seite angezeigt wird und beim nächsten Swipe die Werbe-Seite erscheint &lt;br /&gt;
|template=&lt;br /&gt;
*skaliert Werbemittel bei Beibehaltung des Seitenverhältnisses entsprechend der Abmaße des Werbecontainers&lt;br /&gt;
*positioniert und zentriert das Werbemittel&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: skaliert die Werbemittel enstprechend der neuen Maße. Dies kann mehrere hundert Millisekunden dauern, bis alle neuen Maße feststehen und vom Webviewbrowser zur Verfügung gestellt werden.&lt;br /&gt;
Durch die Skalierung können je nach Display am Rand schwarze oder weiße Balken entstehen. Dies passiert immer dann, wenn das Display ein anderes Seitenverhältnis als die Werbemittel hat.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet das Adrequest 1-2 Content-Seiten vor der Platzierung ab, damit der Adserver Zeit genug hat, die Werbung zu liefern&lt;br /&gt;
*erzeugt dynamisch eine Werbeseite im Seitenfluss rechts neben der zugeordneten Content-Seite&lt;br /&gt;
*im Falle einer Buchung: vergößert den Werbecontainers auf Display-Größe&lt;br /&gt;
*blendet App-Header und -Footer aus (falls erforderlich)&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: passt die Werbeseite und den Werbecontainer an die neuen Display-Maße an&lt;br /&gt;
*im Falle &#039;&#039;&#039;keiner&#039;&#039;&#039; Buchung: entfernt die Werbeseite aus dem Seitenfluss&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt dynamisch die Werbeseite&lt;br /&gt;
#Werbecontainer wird auf die Display-Abmaße aufgezogen&lt;br /&gt;
#Werbetemplate skaliert Werbemittel in dem Container&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet, dass er keine Werbebuchung hat&lt;br /&gt;
#App erzeugt &#039;&#039;&#039;keine&#039;&#039;&#039; Werbeseite bzw. entfernt eine zuvor erzeugte Werbeseite aus dem Seitenfluss&lt;br /&gt;
|creativesizes=&lt;br /&gt;
;Smartphone:310x480 bzw. 480x310&lt;br /&gt;
;Tablet:750x1024 bzw. 1024x750&amp;lt;br /&amp;gt;(bei Android auch zusätzlich: 310x480 bzw. 480x310)&lt;br /&gt;
{{Warnung|text=Die Creativesizes sind Pseudogrößen, sie entsprechen nicht den tatsächlichen Abmaßen des Werbemittels.}}&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:iqadtileFull&lt;br /&gt;
;tile:1&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Banner-Anzeigen==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist ein Banner innerhalb einer Content-Seite. Je nach Werbeform kann diese Anzeige mehr oder weniger Interaktivität für den Endnutzer besitzen. Sie kann anmiert oder eine komplexe HTML-Anzeige sein. Es ist auch möglich dass die Anzeige durch bestimmte Ereignisse sich in der Größe verändert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Mobile High Impact Ad.png|x300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung ist zwischen Content-Elemente einer Seite platziert und erfordert eine Anzeigenkennzeichnung &amp;quot;Anzeige&amp;quot; oberhalb der Platzierung. Üblicherweise befinden sich mehrere Platzierungen innerhalb einer Seite.&lt;br /&gt;
|template=&lt;br /&gt;
*kümmert sich um die Funktionalität, welche je nach Werbeform simpel oder komplex sein kann.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet die Adrequests für alle Platzierungen einer Seite&lt;br /&gt;
*baut für jede Platzierung eine Anzeigenkennzeichnung &amp;quot;Anzeige&amp;quot; oberhalb der Platzierung ein&lt;br /&gt;
*erstellt den Werbecontainer mit Größe, welche in der Antwort vom Andserver auf das Adrequest mitgeliefert wird&lt;br /&gt;
*lauscht mit dem EventListener auf mögliche setsize- oder noad-Events und verändert den Werbecontainer entsprechend.&lt;br /&gt;
*im Falle einer Ausbuchung:&lt;br /&gt;
**empfängt sie ein setsize-Event muss sie die Werbeplatzierung und den Werbecontainer an die neue Größe anpassen, sofern sich diese von der aktuellen Größe unterscheidet&lt;br /&gt;
**empfängt sie ein noad-Event, muss sie die Werbeplatzierung und die zugehörige Anzeigenkennzeichnung komplett entfernen bzw. ausblenden&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt Werbecontainer mit der Größe, die in der Response des Adservers enthalten ist&lt;br /&gt;
#eventuell muss der Werbecontainer auf Grund eines setsize-Events angepasst werden&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Ausbuchung als Werbebuchung&lt;br /&gt;
#App empfängt eine Response mit der Größe 99x1 und erhält kurze Zeit später ein noad-Event&lt;br /&gt;
#App blendet Werbeplatzierung und Anzeigenkennzeichnung bis zum nächsten Pagerequest aus&lt;br /&gt;
|creativesizes=&lt;br /&gt;
320x50, 320x53, 320x80, 320x106, 320x160, 320x320, 320x416, 320x460, 300x50, 300x75, 300x100, 300x150, 300x200, 300x250, 300x600&lt;br /&gt;
Weitere Größen sind möglich. Je nach Platzierung wird nur ein Auszug der Größenliste im Adrequest verwendet. Eine genaue Zuordnung erfolgt in einem separaten Dokument.&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:nospa, enozqi, digtransform, iqadtileX*&lt;br /&gt;
;tile:X*&lt;br /&gt;
X entspricht dabei der Nummer der Platzierung, z.B. iqadtile1, iqadtile3, iqadtile4, iqadtile99, iqadtile8&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Dokumentation der iq digital App Events==&lt;br /&gt;
Die App Events bestehen aus dem Namen und einem &amp;quot;data&amp;quot;-String&lt;br /&gt;
&lt;br /&gt;
===setsize – Event===&lt;br /&gt;
Das setsize-Event wird von den Werbetemplates der iq digital aufgerufen, um die Größe des Adviews der Werbeplatzierung zu verändern.&lt;br /&gt;
Der &amp;quot;data&amp;quot;-String hat das Format &#039;&#039;&#039;&amp;quot;width:height&amp;quot;&#039;&#039;&#039; für eine sofortige Änderung der Größe.&lt;br /&gt;
&lt;br /&gt;
=====Parameter=====&lt;br /&gt;
Die Parameter werden mit einem Doppelpunkt von einander getrennt.&lt;br /&gt;
;width:Die neue Breite des Adviews in Pixel  (Device-Independent-Pixel) als ganze Zahl.&lt;br /&gt;
;height:Die neue Höhe des Adviews in Pixel  (Device-Independent-Pixel) als ganze Zahl.&lt;br /&gt;
{{Warnung|text=Ausnahme: Für eine Anpassung auf die maximal verfügbare Breite oder Höhe wird der Wert &#039;&#039;&#039;max&#039;&#039;&#039; verwendet.}}&lt;br /&gt;
&lt;br /&gt;
Beispielaufrufe:&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;320:80&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview bekommt die neue Größe 320x80 Pixel&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;320:240&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview bekommt die neue Größe 320x240 Pixel&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;max:160&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview wird auf die maximal verfügbare Breite und eine Höhe von 160 Pixel angepasst&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;max:max&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview wird auf die maximal verfügbare Breite und die maximal verfügbare Höhe angepasst&lt;br /&gt;
&lt;br /&gt;
===noad – Event===&lt;br /&gt;
Das noad-Event wird von den Werbetemplates der iq digital aufgerufen, um der App zu signalisieren, dass für die Platzierung keine Buchung vorliegt und die App die Werbeplatzierung &#039;&#039;&#039;und die zugehörige Anzeigenkennzeichnung&#039;&#039;&#039; entfernen soll.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;data&amp;quot;-String hat für dieses Event keine Bedeutung und kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Ad Technology]][[Kategorie:APP]]&lt;br /&gt;
[[en:Integration of the Google Mobile Ads SDK]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
	<entry>
		<id>http://docs.iqd-ao.de/de/index.php?title=Einbau_des_Google_Mobile_Ads_SDK&amp;diff=193</id>
		<title>Einbau des Google Mobile Ads SDK</title>
		<link rel="alternate" type="text/html" href="http://docs.iqd-ao.de/de/index.php?title=Einbau_des_Google_Mobile_Ads_SDK&amp;diff=193"/>
		<updated>2021-11-11T13:29:48Z</updated>

		<summary type="html">&lt;p&gt;Efeigegernoth: /* Begriffserklärung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Offizielle Dokumentation zum Google Mobile Ads SDK==&lt;br /&gt;
Das Google Mobile Ads SDK (GMA SDK) bringt alles mit, was für eine Werbeausspielung in nativen Apps benötigt wird.&lt;br /&gt;
&lt;br /&gt;
===Getting Started zum Google Mobile Ads SDK===&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start GMA SDK iOS Getting Started]&lt;br /&gt;
&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/android/quick-start GMA SDK iOS Getting Started]&lt;br /&gt;
&lt;br /&gt;
===Download des Google Mobile Ads SDK===&lt;br /&gt;
====Android====&lt;br /&gt;
Das GMA SDK ist in den Android Play Services integriert und deshalb auf den Android Geräten vorhanden. &lt;br /&gt;
&lt;br /&gt;
====iOS====&lt;br /&gt;
Für iOS kann das GMA SDK hier heruntergeladen werden:&lt;br /&gt;
[https://developers.google.com/ad-manager/mobile-ads-sdk/ios/download Download iOS]&lt;br /&gt;
&lt;br /&gt;
===Ad-Manager vs. Admob===&lt;br /&gt;
Die Dokumentation zum Google Mobile Ads SDK gibt es in zwei Varianten: für Ad-Manager- und Admob-Nutzer. Die iq digital ist ein Ad-Manager Kunde, deswegen muss unbedingt darauf geachtet werden, dass in der Browser-URL https://developers.google.com/ad-manager/... enthalten ist. Die Admob Doku unterscheidet sich leicht von der Ad-Manager Doku.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kurze Einführung in den Lebens-Zyklus einer Werbeausspielung mit dem GMA SDK==&lt;br /&gt;
Am Beispiel einer Banner-Werbeausspielung wird hier kurz der Lebens-Zyklus einer Werbeausspielung erklärt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:GMA_SDK.png|800px|thumbnail|Übersicht Workflow der Werbeausspielung mit GMA SDK]]&lt;br /&gt;
&lt;br /&gt;
===Request===&lt;br /&gt;
Das Adrequest wird in der App zusammengestellt und besteht aus mehreren Komponenten. Für eine erfolgreiche Werbeausspielung sind folgende Komponenten wichtig:&lt;br /&gt;
;Consent String:Die App benötigt vom Nutzer einen gültigen Consent für die Werbeausspielung. Dabei sind neben mehreren relevanten Purposes auch der Vendor 755 Google Advertising Products notwendig (s.u.)&lt;br /&gt;
;Creative-Sizes:In den meisten Fällen benutzen wir &#039;&#039;&#039;multisize&#039;&#039;&#039;-Adrequests. Das bedeutet, dass das Adrequest mehrere Creative Größen enthält und der Adserver daraufhin prüft, ob er ein Creative für eine dieser Größen zur Verfügung hat. Beispiele sind z.B. 320x1, 320x53, 320x80, 320x106, 320x160 etc.&lt;br /&gt;
;Adunit:Die Adunit ist die Adresse der Werbeplatzierung. Damit weiß der Adserver, auf welcher Seite eine Werbeausspielung erfolgt. Die Adunit ist für alle Adrequests eines Pagerequests gleich. Beispiel: /183/Rheinischer_Kurier_ios_phone/homepage &lt;br /&gt;
;Keywords (optional):Keywords sind Key-Value Paare und können eine Werbeplatzierung um weitere Informationen anreichern, die für eine gezielte Werbeausspielung notwendig sind. Die Werbeplatzierungen der iq digital enthalten alle eine bestimmte Bezeichnung, welche über die Keywords dem Adserver mitgegeben wird. Beispiel: kw=iqadtile1,digtransfrom&amp;amp;tile=1&amp;amp;doc=homepage&lt;br /&gt;
&lt;br /&gt;
===Adserver Google Admanager 360===&lt;br /&gt;
Wenn der Adserver gültigen Consent besitzt, prüft ein Verteilungsalgorithmus, ob eine oder mehrere Werbebuchungen für die Adunit, Creative sizes und Keywords vorliegen. Ist dies der Fall wählt der Adserver die beste dafür aus. Sind mehrere Buchungen gleich wichtig, wählt er zufällig eine davon aus. Nur im Falle keiner Buchung würde er eine &#039;&#039;&#039;no ad&#039;&#039;&#039; oder &#039;&#039;&#039;no fill&#039;&#039;&#039; Meldung ausgeben, die besagt, dass für die Kombination aus adunit, creative size und Keywords keine Buchung existiert.&lt;br /&gt;
&lt;br /&gt;
===Ausspielung innerhalb der App===&lt;br /&gt;
Die App lädt die Response des Adservers, die aus dem Template-Code und den Creative Komponenten besteht. Dabei ist zu beachten, dass der Werbecontainer auf die creative size des ausgelieferten Creatives vergrößert wird. Für Fullscreen Ads muss diese Größe von der App nachträglich auf die Display Viewport Größe (also device independent pixel) angepasst werden. Im Falle einer Banner Anzeige bekommt die App meist nach dem Ladevorgang ein oder mehrere setsize-Events über den einzubauenden AppEventHandler und muss den Werbecontainer auf die neue Größe anpassen, sofern diese sich von der creative size unterscheidet.&lt;br /&gt;
&lt;br /&gt;
===Impression-Zählung===&lt;br /&gt;
Eine Impression Zählung, die misst, dass ein Ad angesehen wurde, wird vom GMA SDK automatisch abgeschickt, sobald mindestens 1px im sichtbaren Bereich des Displays ist.&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Informationen==&lt;br /&gt;
===Adunits (Zonierung)===&lt;br /&gt;
Der Google Ad Manager benutzt zur Adressierung der Seiten Adunits, die sich wie folgt zusammensetzen können:&lt;br /&gt;
*/netzwerkId/level1&lt;br /&gt;
*/netzwerkId/level1/seitentyp&lt;br /&gt;
*/netzwerkId/level1/level2/seitentyp&lt;br /&gt;
*/netzwerkId/level1/level2/level3/seitentyp&lt;br /&gt;
*usw.&lt;br /&gt;
&lt;br /&gt;
====Begriffserklärung====&lt;br /&gt;
;netzwerkId:Hier ist immer die Netzwerk ID der iq digital einzugeben: 183&lt;br /&gt;
;level1:Dies ist die Bezeichnung der App im Google Ad Manager und wird von der iq digital vorgegeben. Die Bezeichnung besteht aus &amp;lt;appname&amp;gt;_app_&amp;lt;plattform&amp;gt;_&amp;lt;gerätetyp&amp;gt;.&lt;br /&gt;
:;appname:Der Name der App&lt;br /&gt;
:;plattform:Das Betriebsystem, also &#039;&#039;ios&#039;&#039; oder &#039;&#039;android&#039;&#039;&lt;br /&gt;
:;gerätetyp:Der Gerätetyp, also &#039;&#039;&#039;phone&#039;&#039;&#039; oder &#039;&#039;tablet&#039;&#039;&lt;br /&gt;
;level2:Dies ist die Bezeichnung einer Rubrik der App, z.B. &#039;&#039;politik&#039;&#039;&lt;br /&gt;
;level3 (usw.):Dies ist die Bezeichnung für eine Unterrubrik, z.B. im Falle von &#039;&#039;politik&#039;&#039; als level2 wäre &#039;&#039;ausland&#039;&#039; eine Unterrubrik für level3. Level4 und höher sind weitere tiefere Verzweigungen der App, diese werden im Normalfall nicht also Adunits angelegt und solche Seiten würden unter dem level3 angelegt werden.&lt;br /&gt;
;seitentyp:In Apps mit Banner-Anzeigen (z.B. News Apps) bezeichnet &#039;&#039;seitentyp&#039;&#039; die unterschiedlichen Seitentypen, also ob es sich z.B. um eine Übersichts-, Artikel- oder Bildergalerieseite handelt. Übliche Werte dafür sind &#039;&#039;homepage&#039;&#039;, &#039;&#039;index&#039;&#039;, &#039;&#039;artikel&#039;&#039;, &#039;&#039;bildgal&#039;&#039;. In Apps mit Fullscreen-Anzeigen (z.B. epaper oder Zeitungs Apps) werden mit &#039;&#039;seitentyp&#039;&#039; die unterschiedlichen Anzeigeplätze innerhalb der Rubrik gemeint, also ob es sich z.B. erste, zweite oder dritte Swipe Anzeige handelt. Übliche Werte sind &#039;&#039;openingpage&#039;&#039;, &#039;&#039;swipe_1&#039;&#039;, &#039;&#039;swipe_2&#039;&#039;, &#039;&#039;swipe_3&#039;&#039; usw.&lt;br /&gt;
&lt;br /&gt;
====Beispiel für die fiktive Rheinischer Kurier News App mit Banner-Anzeigen:====&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone /homepage&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/index&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/artikel&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/politik/bildgal&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/index&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/artikel&lt;br /&gt;
*/183/Rheinischer_Kurier_app_ios_phone/sport/bildgal&lt;br /&gt;
&lt;br /&gt;
====Beispiel für die fiktive Rheinischer Kurier Epaper iPad App mit Fullscreen-Anzeigen:====&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/preloading_ad&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/openingpage&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_1&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_2&lt;br /&gt;
*/183/Rheinischer_Kurier_epaper_app_ios_tablet/politik/swipe_3&lt;br /&gt;
&lt;br /&gt;
{{Warnung|text=Der Adserver DFP erlaubt keine Sonderzeichen in den Adunits mit Ausnahme des Unterstrichs &amp;quot;_&amp;quot;. Auch Umlaute und ß sind nicht erlaubt. level2, level3 und seitentyp sollten auch komplett kleingeschrieben werden.&lt;br /&gt;
Generell sind die Adunits vom Google Ad Manager so gedacht, dass sie sich dynamisch aus dem CMS des Mandanten generieren lassen. Sollte das CMS so angelegt sein, dass eine andere Benennung sinnvoll erscheint, muss die iq digital frühzeitig kontaktiert werden, damit eine sinnvolle Lösung für alle Beteiligten gefunden werden kann.&lt;br /&gt;
Bei Rubriken mit einem &amp;quot;und&amp;quot; bzw. einem &amp;quot;&amp;amp;&amp;quot; im Namen, wie z.B. Wirtschaft &amp;amp; Politik, bietet es sich an, nur die Hauptwörter getrennt mit einem Unterstrich aufzuführen, also wirtschaft_politik.}}&lt;br /&gt;
&lt;br /&gt;
===Creative Sizes===&lt;br /&gt;
Im Google Ad Manager stehen die Creative Sizes für die Werbemittel-Größen. Dabei ist es möglich dass die tatsächlich ausgespielte Größe eines Werbemittels von der CreativeSize abweicht (in so einem Fall wird von Pseudogröße gesprochen). Die App muss für ein Adrequest der entsprechenden Platzierung alle zugehörigen Creative Sizes abfragen. Die oft lange Liste aus Größen ergibt sich aus den vielen möglichen unterschiedlichen Werbeformen und den unterschieden in direkter und programmatischer Vermarktung.&lt;br /&gt;
&lt;br /&gt;
Bei Fullscreen Ad und Preloading Ad Platzierungen werden meist Größen für Portrait- und Landscape-Modus gemeinsam abgefragt.&lt;br /&gt;
&lt;br /&gt;
====Beispiele für Creative Sizes einer Banner Platzierung:====&lt;br /&gt;
99x1, 320x1, 320x50, 320x53, 320x80, 320x160, 320x320, 300x50, 300x75, 300x100, 300x150, 300x250&lt;br /&gt;
(In diesem Beispiel sind 99x1 und 320x1 Pseudogrößen. 99x1 ruft eine Ausbuchung vom Adserver, die die Werbeplatzierung ausblenden lässt. 320x1 ist eine historische Pseudogröße, welche in seltenen Fällen für von der Norm abweichende Werbemittel auf der Platzierung iqadtile1 verwendet wird. Jede Banner-Platzierung hat eine vergleichbare Pseudogröße der Form 320xY mit Y als Platzierungsbezeichnung, z.B. 320x1, 320x3, 320x4, 320x8 etc.&lt;br /&gt;
&lt;br /&gt;
====Beispiele für Creative Sizes einer Fullscreen Platzierung auf einem Android Tablet:====&lt;br /&gt;
310x480, 480x310, 750x1024, 1024x750&lt;br /&gt;
&lt;br /&gt;
====Links zu Creative Sizes im Google Mobile Ads SDK:====&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#multiple_ad_sizes&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#multiple_ad_sizes&lt;br /&gt;
und&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner#custom_ad_sizes&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#custom_ad_sizes&lt;br /&gt;
&lt;br /&gt;
===Keywords (Anhängen von Key-Value-Paaren)===&lt;br /&gt;
Ein Adrequest bekommt als CustomTargeting immer eine Gruppe aus Key-Value Paaren. Dabei können mehrere Werte (Values) mit einem Komma separiert sein. &lt;br /&gt;
Diese Keywords haben mehrere Funktionen:&lt;br /&gt;
*bestimmte Buchungen liefern nur aus, wenn diese Keywords existieren (z.B. bei bestimmten Produkten oder auch bei Testschaltungen)&lt;br /&gt;
*Buchungen können über solche Keywords von der Auslieferung ausgeschlossen werden (z.B. um fehlerhafte Darstellungen einer Werbebuchung zu verhindern)&lt;br /&gt;
*solche Keywords erlauben detaillierte Auslieferungs-Berichte (Reports)&lt;br /&gt;
&lt;br /&gt;
Die iq digital benutzt dabei bestimmte Key-Value-Paare. Hier sind die wichtigsten Keys erklärt:&lt;br /&gt;
;kw:Generelle Keyword Liste. Hier sind meist mehrere Werte mit Komma separiert. Üblich sind einige Legacy-Werte (z.B. digtransform,nospa,enozqi). Hinzu kommen Bezeichner für die App oder die Seite (z.B. Rheinischer_Kurier_app_ios_phone), sowie die Werbeplatzierungsbezeichnung (z.B. iqadtile3).&lt;br /&gt;
;tile:Die Nummer der Werbeplatzierung. Im Falle eines iqadtile3 also als Wert 3.&lt;br /&gt;
;doc:Die Bezeichnung des Seitentyps. Gültige Werte sind homepage, index, artikel, bildgal&lt;br /&gt;
;iqadtype:Die Angabe der Plattform. Gültige Werte sind online, mew, app, amp&lt;br /&gt;
;appver:Die Bezeichnung der Appversions-Nummer (s.u.)&lt;br /&gt;
&lt;br /&gt;
Angaben welche Keywords für welche Platzierung verwendet werden sollen, finden sich in der creative_sizes_and_keywords.xlsc Tabelle, die von der iq digital zu Projektstart zur Verfügung gestellt wird.&lt;br /&gt;
&lt;br /&gt;
====Links zum CustomTargeting im Google Mobile Ads SDK====&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/ios/targeting#custom_targeting&lt;br /&gt;
*https://developers.google.com/ad-manager/mobile-ads-sdk/android/targeting#custom_targeting&lt;br /&gt;
&lt;br /&gt;
===Debugging===&lt;br /&gt;
[[Datei:Easteregg dialog.png|300px|thumbnail|Beispiel aus einer Android App mit Textfeld für Keywords und Checkbox für USB Debugging]]&lt;br /&gt;
Es muss eine &amp;quot;Easter-Egg&amp;quot;-Funktion in die App eingebaut werden, damit die iq digital Probleme und neue Werbeformen innerhalb der Live App (Version aus dem App- bzw. Playstore) testen kann. Der Adserver DFP bietet die Möglichkeiten Testschaltungen über ein Keyword in der App auszuspielen. &lt;br /&gt;
&lt;br /&gt;
In einem selten frequentierten Bereich der App, wie z.B. dem Impressum, sollte es daher die Möglichkeit für Eingeweihte geben, einen kleinen Dialog aufzurufen. Durch diesen kann man ein selbst gewähltes Keyword jedem zukünftigen Adrequest anhängen. Gleichzeitig oder durch das Aktivierung einer Checkbox kann der USB-Debug-Modus, um die Werbe Webviews in der Android App auf dem Desktop Chrome zu inspizieren, aktiviert werden. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WebView.setWebContentsDebuggingEnabled(true);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Danach kann man unter Android die Webviews der App im Desktop Chrome mit chrome://inspect einsehen. &lt;br /&gt;
Dies ermöglicht Fehler in der Werbedarstellung besser zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Ohne ein Debug Easter Egg in der App kann nach Livegang keine Testschaltung aufgesetzt werden und es können auch keine Probleme analysiert werden. Dies würde die Wartung der App von Seiten der iq digital verhindern und auch dem Mandanten keine Möglichkeit geben, selber seine App mit Testwerbung zu überprüfen.&lt;br /&gt;
Die Keyword-Funktion dient daher, den Personenkreis einzuschränken, der die Testschaltungen zu Gesicht bekäme. &lt;br /&gt;
&lt;br /&gt;
Das Anhängen der Keywords ist beim Punkt [[#Anhängen von Key-Value-Paaren]] genauer erklärt.&lt;br /&gt;
&lt;br /&gt;
Mehrfache Keywords werden durch Kommata separiert.&lt;br /&gt;
&lt;br /&gt;
Es gibt vielfältige Optionen, wie das Easter-Egg aktiviert werden kann. Mehrfache/unsinnige Taps auf UI-Elemente oder eine ganz spezielle Eingabe ins Suchfeld seien hier beispielhaft genannt. Die iq digital erlaubt sich aber die Vorgabe, dass unter Android und iOS das  Debug-Easter-Egg identisch aktiviert wird. Bei der Art der Aktivierung des Debug-Easter-Egg stehen wir gerne beratend zur Seite.&lt;br /&gt;
&lt;br /&gt;
===Wichtige Hinweise zu dieser Anleitung===&lt;br /&gt;
Die Adunits für die Werbeplatzierungen werden von uns erst zu Projektstart erstellt und mit Testwerbung belegt. Anschließend werden die Adunits an den Mandanten übermittelt.&lt;br /&gt;
Bitte nicht mit der im SDK fest eingebauten Logik für Test-Werbemittel arbeiten. Diese entspricht nicht der Art und Weise wie die von der iq digital vermarktete Werbung funktioniert und führt zu Missverständnissen.&lt;br /&gt;
Stattdessen sind auf den Adunits permanent Buchungen mit Test-Werbemitteln aktiv welche über ein spezielles Test-Keyword im Adrequest vom Adserver ausgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
===Ansprechpartner iq digital===&lt;br /&gt;
Die iq digital steht für Fragen und Kommentare gerne zur Verfügung. Sollten wir einmal nicht weiterhelfen können, ist es uns möglich einen Entwickler von Google als Ansprechpartner in die Diskussion mit einzubeziehen.&lt;br /&gt;
&lt;br /&gt;
====Tim Lohmann (Mobile Developer Ad Technology)====&lt;br /&gt;
;Telefon:+49 211 887 2336&lt;br /&gt;
;E-Mail:tim.lohmann@iqdigital.de&lt;br /&gt;
&lt;br /&gt;
===Wichtige Dokumente===&lt;br /&gt;
====Liste der Creative Sizes und Keywords für jede  Platzierung:====&lt;br /&gt;
*&amp;lt;datum&amp;gt;_dfp_creative_sizes.xlsx&lt;br /&gt;
====Liste der Adunits:====&lt;br /&gt;
(diese dienen nur als Orientierungshilfe. Die Apps sollten diese Zonen dynamisch aus dem CMS generieren)&lt;br /&gt;
&amp;lt;appname&amp;gt; muss durch den entsprechenden App Namen ersetzt werden.&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_android_tablet.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ios_tablet.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ android_phone.txt&lt;br /&gt;
*&amp;lt;datum&amp;gt;_adunits_&amp;lt;appname&amp;gt;_ios_phone.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==Preloading Ad==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist eine Display ausfüllende Anzeige, die während des Ladescreen (Splashscreen) der App angezeigt wird. Sie wird für 5s angezeigt und schließt dann automatisch. In einer Ecke wird ein Close-Button angezeigt, um vorzeitig zum Inhalt der App zu gelangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Preloading Ad 1.png|x300px]]&lt;br /&gt;
[[Datei:Preloading Ad 2.png|300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung legt sich wie ein Overlay über den Splash-Screen der App. Im Hintergrund kann die App den Content laden.&lt;br /&gt;
|template=&lt;br /&gt;
*skaliert Werbemittel bei Beibehaltung des Seitenverhältnisses entsprechend der Abmaße des Werbecontainers&lt;br /&gt;
*schließt das Werbemittel nach 5s&lt;br /&gt;
*positioniert und zentriert das Werbemittel&lt;br /&gt;
*zeigt in einer Ecke einen Close-Button an, mit dem der Nutzer jederzeit zum Content zurückkehren kann.&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: skaliert die Werbemittel enstprechend der neuen Maße. Dies kann mehrere hundert Millisekunden dauern, bis alle neuen Maße feststehen und vom Webviewbrowser zur Verfügung gestellt werden.&lt;br /&gt;
Durch die Skalierung können je nach Display am Rand schwarze oder weiße Balken entstehen. Dies passiert immer dann, wenn das Display ein anderes Seitenverhältnis als die Werbemittel hat.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet das Adrequest während des Splash-Screens&lt;br /&gt;
*im Falle einer Buchung: &lt;br /&gt;
**erzeugt das Interstitial mit Hilfe des GMA SDKs&lt;br /&gt;
**vergößert den Werbecontainers auf Display-Größe&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: passt die Werbeseite und den Werbecontainer an die neuen Display-Maße an&lt;br /&gt;
*bereitet im Hintergrund weiter den Content vor&lt;br /&gt;
*im Falle &#039;&#039;&#039;keiner&#039;&#039;&#039; Buchung: wird normal der Content geladen&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App wird vom Nutzer gestartet&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt das Interstitial&lt;br /&gt;
#Werbetemplate skaliert Werbemittel in dem Container&lt;br /&gt;
#nach 5s schließt sich das Ad automatisch und der Content dahinter wird sichtbar&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet, dass er keine Werbebuchung hat&lt;br /&gt;
#App lädt ganz normal den Content&lt;br /&gt;
|creativesizes=&lt;br /&gt;
;Smartphone:320x480 bzw. 480x320&lt;br /&gt;
;Tablet:768x1024 bzw. 1024x768&amp;lt;br /&amp;gt;(bei Android auch zusätzlich: 320x480 bzw. 480x320)&lt;br /&gt;
{{Warnung|text=Die Creativesizes sind Pseudogrößen, sie entsprechen nicht den tatsächlichen Abmaßen des Werbemittels.}}&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:iqadtilePre&lt;br /&gt;
;tile:0&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Fullscreen Anzeigen (auch Swipe Anzeigen oder Swipe-Ads genannt)==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist eine Display ausfüllende Anzeigen, die zwischen zwei regulären Content-Seiten in der App angezeigt wird. Sie lässt sich horizontal wie die übrigen Content-Seiten swipen und wird von keinen Teilen der App (wie App-Header oder -Footer) überlagert. Sollte der Nutzer ein Orientationchange-Event erzeugen, passt sich die Anzeige dem neuen Seitenverhältnis an.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fullscreen Ad 1.png|x300px]]&lt;br /&gt;
[[Datei:Fullscreen Ad 2.png|300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung ist dynamisch zwischen zwei Content-Seiten eingebettet. Dabei befindet sich die Werbeplatzierung immer rechts neben der Seite, die Ihr im Content zugeordnet ist, z.B. Politik/swipe_1 meint, dass zuerst die 1. Politik-Content-Seite angezeigt wird und beim nächsten Swipe die Werbe-Seite erscheint &lt;br /&gt;
|template=&lt;br /&gt;
*skaliert Werbemittel bei Beibehaltung des Seitenverhältnisses entsprechend der Abmaße des Werbecontainers&lt;br /&gt;
*positioniert und zentriert das Werbemittel&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: skaliert die Werbemittel enstprechend der neuen Maße. Dies kann mehrere hundert Millisekunden dauern, bis alle neuen Maße feststehen und vom Webviewbrowser zur Verfügung gestellt werden.&lt;br /&gt;
Durch die Skalierung können je nach Display am Rand schwarze oder weiße Balken entstehen. Dies passiert immer dann, wenn das Display ein anderes Seitenverhältnis als die Werbemittel hat.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet das Adrequest 1-2 Content-Seiten vor der Platzierung ab, damit der Adserver Zeit genug hat, die Werbung zu liefern&lt;br /&gt;
*erzeugt dynamisch eine Werbeseite im Seitenfluss rechts neben der zugeordneten Content-Seite&lt;br /&gt;
*im Falle einer Buchung: vergößert den Werbecontainers auf Display-Größe&lt;br /&gt;
*blendet App-Header und -Footer aus (falls erforderlich)&lt;br /&gt;
*bei Orientationchange- oder Resize-Event: passt die Werbeseite und den Werbecontainer an die neuen Display-Maße an&lt;br /&gt;
*im Falle &#039;&#039;&#039;keiner&#039;&#039;&#039; Buchung: entfernt die Werbeseite aus dem Seitenfluss&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt dynamisch die Werbeseite&lt;br /&gt;
#Werbecontainer wird auf die Display-Abmaße aufgezogen&lt;br /&gt;
#Werbetemplate skaliert Werbemittel in dem Container&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet, dass er keine Werbebuchung hat&lt;br /&gt;
#App erzeugt &#039;&#039;&#039;keine&#039;&#039;&#039; Werbeseite bzw. entfernt eine zuvor erzeugte Werbeseite aus dem Seitenfluss&lt;br /&gt;
|creativesizes=&lt;br /&gt;
;Smartphone:310x480 bzw. 480x310&lt;br /&gt;
;Tablet:750x1024 bzw. 1024x750&amp;lt;br /&amp;gt;(bei Android auch zusätzlich: 310x480 bzw. 480x310)&lt;br /&gt;
{{Warnung|text=Die Creativesizes sind Pseudogrößen, sie entsprechen nicht den tatsächlichen Abmaßen des Werbemittels.}}&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:iqadtileFull&lt;br /&gt;
;tile:1&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Banner-Anzeigen==&lt;br /&gt;
{{SDKAppInfo&lt;br /&gt;
|info=&lt;br /&gt;
Die Werbeplatzierung ist ein Banner innerhalb einer Content-Seite. Je nach Werbeform kann diese Anzeige mehr oder weniger Interaktivität für den Endnutzer besitzen. Sie kann anmiert oder eine komplexe HTML-Anzeige sein. Es ist auch möglich dass die Anzeige durch bestimmte Ereignisse sich in der Größe verändert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Mobile High Impact Ad.png|x300px]]&lt;br /&gt;
|position=&lt;br /&gt;
Die Platzierung ist zwischen Content-Elemente einer Seite platziert und erfordert eine Anzeigenkennzeichnung &amp;quot;Anzeige&amp;quot; oberhalb der Platzierung. Üblicherweise befinden sich mehrere Platzierungen innerhalb einer Seite.&lt;br /&gt;
|template=&lt;br /&gt;
*kümmert sich um die Funktionalität, welche je nach Werbeform simpel oder komplex sein kann.&lt;br /&gt;
|app=&lt;br /&gt;
*sendet die Adrequests für alle Platzierungen einer Seite&lt;br /&gt;
*baut für jede Platzierung eine Anzeigenkennzeichnung &amp;quot;Anzeige&amp;quot; oberhalb der Platzierung ein&lt;br /&gt;
*erstellt den Werbecontainer mit Größe, welche in der Antwort vom Andserver auf das Adrequest mitgeliefert wird&lt;br /&gt;
*lauscht mit dem EventListener auf mögliche setsize- oder noad-Events und verändert den Werbecontainer entsprechend.&lt;br /&gt;
*im Falle einer Ausbuchung:&lt;br /&gt;
**empfängt sie ein setsize-Event muss sie die Werbeplatzierung und den Werbecontainer an die neue Größe anpassen, sofern sich diese von der aktuellen Größe unterscheidet&lt;br /&gt;
**empfängt sie ein noad-Event, muss sie die Werbeplatzierung und die zugehörige Anzeigenkennzeichnung komplett entfernen bzw. ausblenden&lt;br /&gt;
|workflowad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Werbebuchung&lt;br /&gt;
#App erzeugt Werbecontainer mit der Größe, die in der Response des Adservers enthalten ist&lt;br /&gt;
#eventuell muss der Werbecontainer auf Grund eines setsize-Events angepasst werden&lt;br /&gt;
|workflownoad=&lt;br /&gt;
#App sendet Adrequest an Adserver&lt;br /&gt;
#Adserver antwortet mit Ausbuchung als Werbebuchung&lt;br /&gt;
#App empfängt eine Response mit der Größe 99x1 und erhält kurze Zeit später ein noad-Event&lt;br /&gt;
#App blendet Werbeplatzierung und Anzeigenkennzeichnung bis zum nächsten Pagerequest aus&lt;br /&gt;
|creativesizes=&lt;br /&gt;
320x50, 320x53, 320x80, 320x106, 320x160, 320x320, 320x416, 320x460, 300x50, 300x75, 300x100, 300x150, 300x200, 300x250, 300x600&lt;br /&gt;
Weitere Größen sind möglich. Je nach Platzierung wird nur ein Auszug der Größenliste im Adrequest verwendet. Eine genaue Zuordnung erfolgt in einem separaten Dokument.&lt;br /&gt;
|keywords=&lt;br /&gt;
;kw:nospa, enozqi, digtransform, iqadtileX*&lt;br /&gt;
;tile:X*&lt;br /&gt;
X entspricht dabei der Nummer der Platzierung, z.B. iqadtile1, iqadtile3, iqadtile4, iqadtile99, iqadtile8&lt;br /&gt;
|links=&lt;br /&gt;
;iOS:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
;Android:https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Dokumentation der iq digital App Events==&lt;br /&gt;
Die App Events bestehen aus dem Namen und einem &amp;quot;data&amp;quot;-String&lt;br /&gt;
&lt;br /&gt;
===setsize – Event===&lt;br /&gt;
Das setsize-Event wird von den Werbetemplates der iq digital aufgerufen, um die Größe des Adviews der Werbeplatzierung zu verändern.&lt;br /&gt;
Der &amp;quot;data&amp;quot;-String hat das Format &#039;&#039;&#039;&amp;quot;width:height&amp;quot;&#039;&#039;&#039; für eine sofortige Änderung der Größe.&lt;br /&gt;
&lt;br /&gt;
=====Parameter=====&lt;br /&gt;
Die Parameter werden mit einem Doppelpunkt von einander getrennt.&lt;br /&gt;
;width:Die neue Breite des Adviews in Pixel  (Device-Independent-Pixel) als ganze Zahl.&lt;br /&gt;
;height:Die neue Höhe des Adviews in Pixel  (Device-Independent-Pixel) als ganze Zahl.&lt;br /&gt;
{{Warnung|text=Ausnahme: Für eine Anpassung auf die maximal verfügbare Breite oder Höhe wird der Wert &#039;&#039;&#039;max&#039;&#039;&#039; verwendet.}}&lt;br /&gt;
&lt;br /&gt;
Beispielaufrufe:&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;320:80&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview bekommt die neue Größe 320x80 Pixel&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;320:240&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview bekommt die neue Größe 320x240 Pixel&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;max:160&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview wird auf die maximal verfügbare Breite und eine Höhe von 160 Pixel angepasst&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;&amp;quot;setsize&amp;quot;,&amp;quot;max:max&amp;quot;&amp;lt;/nowiki&amp;gt;:Adview wird auf die maximal verfügbare Breite und die maximal verfügbare Höhe angepasst&lt;br /&gt;
&lt;br /&gt;
===noad – Event===&lt;br /&gt;
Das noad-Event wird von den Werbetemplates der iq digital aufgerufen, um der App zu signalisieren, dass für die Platzierung keine Buchung vorliegt und die App die Werbeplatzierung &#039;&#039;&#039;und die zugehörige Anzeigenkennzeichnung&#039;&#039;&#039; entfernen soll.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;data&amp;quot;-String hat für dieses Event keine Bedeutung und kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Ad Technology]][[Kategorie:APP]]&lt;br /&gt;
[[en:Integration of the Google Mobile Ads SDK]]&lt;/div&gt;</summary>
		<author><name>Efeigegernoth</name></author>
	</entry>
</feed>