web-dev-qa-db-de.com

So verhindern Sie, dass Werbeblocker Anzeigen in einer App blockieren

Einer meiner Nutzer ließ die Katze aus der Tasche und sagte mir, dass sie eine meiner kostenlosen Apps verwendeten, die durch Anzeigen monetarisiert werden, aber sie blockierten die Anzeigen mit einem Werbeblocker. Das haben sie mir spöttisch gesagt, als könnte ich nichts dagegen tun.

Kann ich etwas dagegen unternehmen? Gibt es eine Möglichkeit zu erkennen, dass Anzeigen blockiert werden?

58

Mir ist bekannt, dass das Blockieren von Anzeigen funktioniert (wirklich auf jedem Computer). Sie bearbeiten die Hosts-Datei so, dass sie für alle bekannten Ad-Server auf localhost verweist. Bei Android befindet sich diese in der Datei "etc/hosts".

Beispielsweise verwende ich Admob-Anzeigen und eine Host-Datei, die ich aus benutzerdefinierten ROM-Listen mit den folgenden Admob-Einträgen genommen habe:

127.0.0.1 analytics.admob.com
127.0.0.1 mmv.admob.com
127.0.0.1 mm.admob.com
127.0.0.1 admob.com
127.0.0.1 a.admob.com
127.0.0.1 jp.admob.com
127.0.0.1 c.admob.com
127.0.0.1 p.admob.com
127.0.0.1 mm1.vip.sc1.admob.com
127.0.0.1 media.admob.com
127.0.0.1 e.admob.com

Immer wenn ein Prozess versucht, die oben genannten Adressen aufzulösen, werden sie in diesem Fall an die links von ihnen angegebene Adresse (localhost) geroutet.

Was ich in meinen Apps mache, ist diese Host-Datei zu überprüfen und nach Admob-Einträgen zu suchen. Wenn ich eines davon finde, benachrichtige ich den Benutzer, dass ich die Blockierung von Anzeigen festgestellt habe, und fordere ihn auf, Admob-Einträge von dort zu entfernen und deren Verwendung zuzulassen die App. 

Was nützt es mir, wenn sie keine Anzeigen sehen? Es macht keinen Sinn, dass sie die App kostenlos nutzen.

Hier ist ein Codeausschnitt, wie ich das erreichen kann:

        BufferedReader in = null;

    try 
    {
        in = new BufferedReader(new InputStreamReader(
                new FileInputStream("/etc/hosts")));
        String line;

        while ((line = in.readLine()) != null)
        {
            if (line.contains("admob"))
            {
                result = false;
                break;
            }
        }
    } 

Ich verspreche, dass alle von der Werbung unterstützten Apps diese Datei überprüfen sollen. Sie müssen nicht root sein, um darauf zugreifen zu können. Das Schreiben darauf kann jedoch eine andere Geschichte sein.

Nicht sicher, ob es andere Dateien gibt, die auf einem Linux-basierten Betriebssystem gleich funktionieren, aber auf jeden Fall können wir alle diese Dateien immer überprüfen.

Anregungen zur Verbesserung sind willkommen.

Auch die App "Ad Free Android" benötigt Root-Zugriff, was bedeutet, dass die Hosts-Datei höchstwahrscheinlich geändert wird, um ihr Ziel zu erreichen.

59
Ivan

Mein Code für diese Ausgabe lautet daher: -

try {
    if (InetAddress.getByName("a.admob.com").getHostAddress().equals("127.0.0.1") ||
        InetAddress.getByName("mm.admob.com").getHostAddress().equals("127.0.0.1") ||
        InetAddress.getByName("p.admob.com").getHostAddress().equals("127.0.0.1") ||
        InetAddress.getByName("r.admob.com").getHostAddress().equals("127.0.0.1")) {
        //Naughty Boy - Punishing code goes here.
        // In my case its a dialog which goes to the pay-for version 
        // of my application in the market once the dialog is closed.
    }
} catch (UnknownHostException e) { } //no internet

Hoffentlich hilft das.

25
Jonathan

Als Entwickler müssen wir die schwierige Aufgabe erfüllen, uns mit den Benutzern einzufühlen und einen Mittelweg zwischen der Bestrafung der wenigen, die versuchen, die Vorteile zu nutzen, und den vielen, die sich an die Regeln halten, zu finden. Mobile Werbung ist eine sinnvolle Möglichkeit, jemandem die kostenlose Nutzung einer funktionalen Software zu gestatten. Die Benutzer, die Werbeblocker-Techniken einsetzen, können als Ertragsverlust betrachtet werden. Wenn Sie sich jedoch das Gesamtbild ansehen, können dies auch diejenigen sein, die das Wort über Ihre Anwendung verbreiten, wenn sie es mögen. Ein schonenderer Ansatz bei der Ausführung auf Systemen mit blockierten Anzeigen ist die Anzeige Ihrer eigenen Hausanzeige. Erstellen Sie ein oder mehrere Bannerbilder und zeigen Sie diese an derselben Stelle wie Ihre normale Anzeige mit einem ImageView derselben Höhe (z. B. 50 dp) an. Wenn Sie erfolgreich eine Anzeige erhalten, legen Sie die Sichtbarkeit Ihrer ImageView auf View.GONE fest. Sie können sogar einen Timer erstellen, um mehrere Hausanzeigen zu durchlaufen, um die Aufmerksamkeit des Nutzers zu erlangen. Durch Klicken auf Ihre Anzeige kann der Benutzer auf die Marktseite gelangen, um die Vollversion zu kaufen.

9
BitBank

Können Sie prüfen, ob die Anzeige in Ihre App geladen wurde? 

Werbeblocker funktionieren, indem sie verhindern, dass Ihre App Daten herunterlädt. Sie können die Inhaltslänge der Daten in Ihrem Anzeigenrahmen überprüfen, um sicherzustellen, dass dort Daten vorhanden sind. 

Wenn keine Daten vorhanden sind, senden Sie eine Nachricht und verlassen Sie sie oder geben Sie eine Warnung per E-Mail. 

Es ist möglicherweise kein so großes Problem, wie Sie denken, da nur ein kleiner Prozentsatz der Nutzer Anzeigen blockiert.

4
Byron Whitlock

Die ersten beiden Antworten helfen Ihnen nur mit einer bestimmten (wenn auch wahrscheinlich populärsten) Methode zum Blockieren von Anzeigen. Root-Benutzer können auch Anzeigen mit einer Firewall auf dem Gerät blockieren. WiFi-Benutzer können Anzeigen mit einer Upstream-Firewall blockieren.

Ich schlage vor:

  1. Belohnen Sie keine werbeblockenden Nutzer. Stellen Sie sicher, dass Ihr Layout einen Teil der Anzeige für eine Anzeige reserviert, selbst wenn eine Anzeige nicht geladen werden kann. Wenn Sie eine Vollbildanzeige haben, die etwas abgespielt wird, stellen Sie sicher, dass Ihre App etwas wartet, auch wenn die Anzeige nicht abgespielt werden kann. Wenn Sie Benachrichtigungen als Werbung verwenden (Sie scum), benachrichtigen Sie den Benutzer, wenn Sie eine solche Anzeige nicht erhalten. Dies könnte als "nervig alle Ihrer Nutzer" gelesen werden, aber Ihre normalen Nutzer wissen, was sie bekommen, und Ihre "Werbeblocker" werden nicht gesucht.

  2. Bitten Sie Ad-Blocker um zu stoppen. Je weniger rentabel eine Branche ist, die das liefert, was ein Benutzer wünscht, desto weniger liefert diese Industrie das, was der Benutzer wollte. Ein einzelner Entwickler wird feststellen, dass er mit anderen Benutzern mehr Geld verdient. Sie wissen das, und Ihre Benutzer werden es offensichtlich finden, nachdem Sie es ihnen gesagt haben, aber es ist immer noch ein wirtschaftliches Argument - es ist nicht intuitiv. Habe eine Backup-Anzeige mit der Aufschrift "Dies ist mein Job. Wenn Sie mich nicht bezahlen, bekomme ich eine weitere, und Sie erhalten keine weiteren Apps von mir."

4
Julian Fondren

Anstatt nach installierter oder modifizierter Hosts-Datei zu suchen, verwende ich einen AdListener wie diesen . Wenn die Anzeige aufgrund von NETWORK_ERROR nicht geladen werden kann, rufe ich einfach eine zufällige Seite ( für die Kicks (Apple.com) und prüfen, ob die Seiten erfolgreich geladen wurden.

Wenn ja, geht boom die App.

Um etwas Code hinzuzufügen, würde Listener-Klasse ungefähr so ​​aussehen:

public abstract class AdBlockerListener implements AdListener {

    @Override
    public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
        if (arg1.equals(ErrorCode.NETWORK_ERROR)) {
            try {
                URL url = new URL("http://www.Apple.com/");
                URLConnection conn = url.openConnection();
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                reader.readLine();
                onAdBlocked();
            } catch (IOException e) {}
        }
    }

    public abstract void onAdBlocked();
}

Und dann würde jede Aktivität mit einem AdView etwas bewirken:

AdView adView = (AdView) findViewById(R.id.adView);
        adView.setAdListener(new AdBlockerListener() {
            @Override
            public void onAdBlocked() {
                AlertDialog ad = new AlertDialog.Builder(CalendarView.this)
                                    .setMessage("nono")
                                    .setCancelable(false)
                                    .setNegativeButton("OK", new OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                            System.exit(1);
                                        }
                                    })
                                    .show();
            }
        });
3
Filipe Pina

Ich bin mir sicher, dass diese Antwort bei bestimmten Entwicklersegmenten nicht ganz beliebt ist. Wenn Sie jedoch in diese Kategorie fallen, ist Ihre App vielleicht nicht im App Store vorhanden. Bitte beachten Sie, dass diese alle als Codeänderungen implementiert werden können und keine Hacker- oder Spyware-Verhalten erforderlich sind.

Ändern Sie grundsätzlich die Wirtschaftlichkeit Ihrer App. Der Nutzer hat immer Recht - dies ist die Haltung einer der erfolgreichsten Werbefirmen (Google). Wenn Ihre Anzeigen von Nutzern blockiert werden, liegt dies daran, dass Sie nicht so aussieht, als ob Anzeigen oder Werbeblocker ausfallen.

http://books.google.com/books/about/The_User_is_Always_Right.html?id=gLjPMUjVvs0C

  • Machen Sie Anzeigen weniger lästig und in-your-face. Benutzer reagieren auf schlechte/ärgerliche Werbung, und je satter die App aussieht und wird, desto wahrscheinlicher ist es, dass sie sie sowieso ablehnen. Ich kümmere mich nicht um Apps mit Anzeigen, solange sie die Funktionalität nicht wesentlich beeinträchtigen. Noch besser, ich mag Anzeigen, die für mich relevant sind. ( http://www.nngroup.com/articles/most-hated-advertising-techniques/ )
  • Um zu erkennen, dass Anzeigen nicht geladen werden, ist es nicht notwendig, die von früheren Postern erwähnten spionähnlichen Aktivitäten zu implementieren. Laden Sie eine Anzeige mit einem Bestätigungscode und fügen Sie ab und zu eine Aufforderung ein, in der Sie nach dem Bestätigungscode gefragt werden. Der Code muss nicht lang oder nervig sein, in der Tat reicht es aus, einen Captcha-Service mit 3 oder 4 Buchstaben/Zahlen zu implementieren. ( http://textcaptcha.com/api )
  • Neben dem Erkennen von Fehlern beim Laden von Anzeigen können Sie auch bessere Anzeigen erstellen. Anstatt eine API wie Mobads zu verwenden (ist Ihnen überhaupt bewusst, wie zwanghaft das klingt? Mobs? Wirklich? Sind wir Entwickler, die russische Mafia?), Gehen Sie eine Partnerschaft mit einer Anzeigenfirma ein, mit der Sie Anzeigen direkt aus Ihrer App einbetten können. Die App wird insgesamt umfangreicher installiert. Nein, Sie können sich nicht vor manueller Änderung schützen, aber die oben vorgeschlagenen Änderungen schützen auch nicht davor. Und dies wird besser alle kostenpflichtigen Versionen Ihrer App unterstützen, die wesentlich leichter (und schneller) sind.
  • Überprüfen Sie die von Ihnen für den Nutzer angezeigten Anzeigen gründlich, stellen Sie Ihre Anzeigenrichtlinien offen und transparent dar und erlauben Sie Nutzern sogar, Ihre Anzeigen und Anzeigenquellen einzusehen. Der Hauptgrund, warum ich mir Sorgen um Anzeigen mache, ist nicht, weil ich Anzeigen hasse, sondern weil ich mir Sorgen mache, dass der für diese App verantwortliche Entwickler von schlechter Qualität auch Viren oder andere Malware zulässt. Fordern Sie eine Ausnahme für den installierten Adblocker an. Arbeiten Sie sich mit Werbeblockern wie AdBlock zusammen, um auf ihre Ausnahmeliste zu gelangen. Wenn Sie eine seriöse Anwendung sind, sollte dies kein Problem sein. ( http://www.cio.com/article/699970/6_Ways_to_Defend_Against_Drive_by_Downloads?page=1&taxonomyId=3089 )

Ich wiederhole: Alle oben genannten Änderungen sind Dinge, die Sie legitimerweise im Code ausführen können, um Anti-Ad-Verhalten zu verhindern. Anzeigen werden aus Sicherheitsgründen und vor allem bei bestimmten Reaktionen und manchmal auch in Bezug auf Bandbreite und Leistung blockiert. Stellen Sie daher sicher, dass Ihre Anzeigen auf Codeebene keine dieser Probleme verursachen.

Schließlich wollte ich auf das eingehen, was Borealid sagte, was ich oben wiederholt habe. Am Ende handelt es sich um ein Katz- und Maus-Spiel, da der Benutzer die rechtliche und moralische Verantwortung für sein eigenes Eigentum hat. Ein Benutzer kann beliebige Aktionen ausführen, einschließlich des direkten Änderns von Code. Natürlich gibt es Einschränkungen, die Sie implementieren können usw. Es gibt jedoch immer Möglichkeiten, das Problem zu umgehen. Dies ist (technisch gesehen) das ultimative Problem mit DRM (was Sie versuchen). Anstatt Zeit und Mühe für dieses Spiel zu verschwenden, ist es besser, die Nutzer zu ermutigen, Werbung in der Nähe zu lassen. Sie werden kostenlos zu Ihren besten und intelligentesten Anti-Ad-Blockern.

1
smaudet

Ich denke, es hängt vom Content-Provider für die Anzeigen ab. Ich weiß, dass das AdMob-SDK einen Rückruf bereitstellt, wenn eine Anzeigenanforderung fehlschlägt. Ich vermute, dass Sie sich möglicherweise dafür registrieren können, und dann im Callback nach einer Verbindung suchen. Wenn eine Verbindung besteht und Sie keine Anzeige erhalten haben Anzeigen werden blockiert. Ich habe nicht mit dem AdSense für Mobile-Toolset von Google gearbeitet, aber es würde mich nicht wundern, wenn es einen ähnlichen Rückrufmechanismus gibt.

1
nEx.Software

Es gibt zwei Möglichkeiten für einen Benutzer, eine Werbung zu umgehen:

1) App ohne Internet verwenden.

2) Mit gerootetem Telefon und geänderter Host-Datei.

Ich habe zwei Tools erstellt, die Sie implementieren können, siehe Code unten.

checkifonline (); ist für Problem 1:

public void checkifonline() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }

    if(haveConnectedWifi==false && haveConnectedMobile==false){

        // TODO (could make massage and than finish();
    }
}

adblockcheck (); ist für problem 2

private void adblockcheck() {
    BufferedReader in = null;
    boolean result = true;

    try 
    {
        in = new BufferedReader(new InputStreamReader(
                new FileInputStream("/etc/hosts")));
        String line;

        while ((line = in.readLine()) != null)
        {
            if (line.contains("admob"))
            {
                result = false;
                break;
            }
        }
    } catch (UnknownHostException e) { }
      catch (IOException e) {e.printStackTrace();}  

    if(result==false){

        // TODO (could make massage and than finish();

    }
}
1
John

Es gibt nichts, was Sie tun können, was Ihre Benutzer nicht besser machen können.

Das Einzige, was Ihnen als fernwirkend in den Sinn kommt, ist, die Anzeigen zu einem untrennbaren Bestandteil des Programms zu machen, so dass der Nutzer, wenn er blockiert ist, keinen Sinn für die Anwendung haben kann.

1
Borealid

Neben der Überprüfung, ob Admob aufgelöst werden kann, präsentiere ich eine Seite, auf der im Wesentlichen darauf hingewiesen wird, dass ich einen Adblocker gefunden habe. Ich erkläre, dass ich die möglichen Gründe dafür verstehe. Anschließend werden einige eingebaute Anzeigen meiner eigenen Apps eingeblendet und nach deren Art gefragt Unterstützung für die Weiterentwicklung. :)

0
pvella

Lassen Sie mich zunächst sagen, dass ich glaube, dass Werbeblocker in Bezug auf Bewerbungen tatsächlich eine Form von Piraterie ist. Diese Apps werden von den Anzeigen unterstützt und manchmal auch eine "kostenpflichtige Lizenz", um Anzeigen auszuschalten und/oder Funktionen hinzuzufügen. Durch das Blockieren von Anzeigen stehlen Nutzer potenzielle Einnahmen des Entwicklers, die sich die Zeit genommen haben, um die von Ihnen verwendete App zu erstellen.

Trotzdem möchte ich eine Möglichkeit hinzufügen, um die Verwendung von Werbeblockern zu verhindern. Ich verwende diese Methode und erlaube Benutzern nicht, die App zu verwenden, wenn ich einen Werbeblocker finde. Die Leute werden sehr wütend und geben Ihnen schlechte Bewertungen dafür. Ich erkläre in meinen Applikationsbeschreibungen jedoch sehr deutlich, dass Sie die App nicht verwenden können, wenn Sie einen Adblocker haben.

Ich verwende den Paketmanager, um zu überprüfen, ob ein bestimmtes Paket installiert ist. Während dies nicht alle Adblocker erreichen wird, können Sie die meisten von ihnen erhalten, wenn Sie sich bei einigen der beliebtesten "auf dem Laufenden" halten.

PackageManager pm = activity.getPackageManager ();
Intent intent = pm.getLaunchIntentForPackage ( "de.ub0r.Android.adBlock" );
if ( Reflection.isPackageInstalled ( activity, intent ) ) {
  // they have adblock installed
}
0
Ryan Conrad

Geben Sie Ihren Benutzern die Möglichkeit, die App ohne Anzeigen zu verwenden. Ich persönlich finde Anzeigen eines der nervigsten Dinge, die möglicherweise auf meinem Computer passieren können, und ich werde gerne für eine Anwendung bezahlen, wenn mir die Beleidigung erspart wird, Anzeigen in mein Gesicht geworfen zu haben. Und ich bin sicher, dass ich nicht der einzige bin.

0
drmirror

Für den Fall, dass keine Internetverbindung besteht, habe ich diesem tutorial Gefolgt und habe einen "Netzwerkstatus-Listener" wie folgt erstellt:

private BroadcastReceiver mConnReceiver = new BroadcastReceiver() 
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);

        if (noConnectivity == true)
        {
            Log.d(TAG, "No internet connection");
            image.setVisibility(View.VISIBLE);
        }
        else
        {
            Log.d(TAG, "Interet connection is UP");
            image.setVisibility(View.GONE);
            add.loadAd(new AdRequest());
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState)
{
    //other stuff
    private ImageView image = (ImageView) findViewById(R.id.banner_main);
    private AdView add = (AdView) findViewById(R.id.ad_main);
    add.setAdListener(new AdListener());
}

@Override
protected void onResume()
{
    registerReceiver(mConnReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    super.onResume();
}

@Override
protected void onPause()
{
    unregisterReceiver(mConnReceiver);
    super.onPause();
}

registerReceiver und unregisterReceiver müssen in onResume und onPause aufgerufen werden, wie in here beschrieben.

Richten Sie in Ihrem Layout-XML die AdView und eine ImageView Ihrer Wahl ein:

<com.google.ads.AdView xmlns:googleads="http://schemas.Android.com/apk/lib/com.google.ads"
    Android:layout_alignParentBottom="true"
    Android:id="@+id/ad_main"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    googleads:adSize="BANNER"
    googleads:adUnitId="@string/admob_id" />

<ImageView
    Android:id="@+id/banner_main"
    Android:layout_centerInParent="true"
    Android:layout_alignParentBottom="true"
    Android:layout_width="379dp"
    Android:layout_height="50dp"
    Android:visibility="gone"
    Android:background="@drawable/banner_en_final" />

Wenn nun eine Internetverbindung verfügbar ist, wird die Anzeige eingeblendet, und bei ausgeschalteter ImageView-Anzeige wird ein Popup angezeigt, und umgekehrt. Dies muss in jeder Aktivität erfolgen, in der Anzeigen geschaltet werden sollen.

0

Dies ist eine Erweiterung einer vorherigen Antwort. Der Benutzer hat mir mitgeteilt, dass die von ihm verwendete App AdFree Android heißt. Es kann auf dem Markt gefunden werden. Die App sagt, dass sie funktioniert, indem sie "Anfragen an bekannte Hostnamen annulliert, die Anzeigen schalten."

Ich empfehle Ihnen, wenn Sie Ihre Apps mit Anzeigen monetarisieren, prüfen Sie beim Programmstart dieses Programm und geben dem Benutzer eine böse Nachricht. Beenden Sie dann Ihre App. 

0