web-dev-qa-db-fra.com

Comment empêcher le bloqueur de publicité de bloquer les annonces sur une application

Un de mes utilisateurs a laissé le chat sortir du sac et m'a dit qu'ils utilisaient l'une de mes applications gratuites, monétisées par des annonces, mais qu'ils bloquaient les annonces avec un bloqueur de publicité. Ils me l'ont dit moqueusement, comme si je ne pouvais rien faire à ce sujet.

Puis-je faire quelque chose à ce sujet? Existe-t-il un moyen de détecter que les annonces sont bloquées?

58
Christopher Perry

Je suis conscient d'une façon dont le blocage des publicités fonctionne (sur n'importe quel ordinateur): ils modifient le fichier hosts pour qu'il pointe vers localhost pour tous les serveurs de publicité connus. Pour Android, il se trouve dans le fichier "etc/hosts".

Par exemple, j'utilise des annonces admob et un fichier hôte extrait de la rom personnalisée répertorie les entrées admob suivantes:

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

Désormais, chaque fois qu'un processus tente de résoudre les adresses ci-dessus, ils sont routés vers l'adresse indiquée à leur gauche (localhost) dans ce cas.

Ce que je fais dans mes applications est de consulter ce fichier hôte et de rechercher les entrées d'admob. Si j'en trouve, je signale à l'utilisateur que j'ai détecté le blocage d'annonces et lui dis de supprimer les entrées d'admob de cet emplacement et de ne pas lui permettre d'utiliser. l'application. 

Après tout, à quoi me sert-il de ne pas voir les annonces? Inutile de les laisser utiliser l'application gratuitement.

Voici un extrait de code expliquant comment y parvenir:

        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;
            }
        }
    } 

Je jure que toutes les applications prises en charge par la publicité doivent vérifier ce fichier. Vous n’avez pas besoin d’être root pour pouvoir y accéder, mais y écrire pourrait être une autre histoire.

En outre, nous ne savons pas s’il existe d’autres fichiers qui fonctionnent de la même manière sur un système d’exploitation basé sur Linux, mais nous pouvons toujours vérifier tous ces fichiers.

Toutes les suggestions pour améliorer ceci sont les bienvenues.

En outre, l'application appelée "Ad Free Android" nécessite un accès root, ce qui signifie qu'elle modifie très probablement le fichier hosts afin d'atteindre son objectif.

59
Ivan

Mon code pour cette question est donc: -

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

J'espère que cela pourra aider.

25
Jonathan

En tant que développeurs, nous devons faire le difficile travail d'empathie avec les utilisateurs et trouver un juste milieu entre punir ceux qui essaient de tirer parti et ceux qui respectent les règles. La publicité mobile est un moyen raisonnable de permettre à quelqu'un d'utiliser gratuitement un logiciel fonctionnel. Les utilisateurs qui utilisent des techniques de blocage des publicités peuvent être considérés comme une perte de revenus, mais si vous jetez un œil à l’ensemble, vous pouvez également parler de votre application si elle l’aime. Une approche plus douce de l'exécution sur des systèmes avec des annonces bloquées consiste à afficher votre propre annonce "maison". Créez une ou plusieurs images de bannière et affichez-les au même endroit que votre annonce normale avec un ImageView de la même hauteur (50dp, par exemple). Si vous recevez une annonce, définissez la visibilité de votre ImageView sur View.GONE. Vous pouvez même créer une minuterie pour parcourir plusieurs annonces maison afin d'attirer l'attention de l'utilisateur. En cliquant sur votre annonce, l'utilisateur peut accéder à la page du marché pour acheter la version complète.

9
BitBank

Pouvez-vous vérifier si l'annonce est chargée dans votre application? 

Les bloqueurs de publicités empêchent votre application de télécharger des données. Vous pouvez vérifier la longueur du contenu des données dans votre bloc d'annonces pour vous assurer qu'il y a des données. 

S'il n'y a pas de données, envoyez un message et quittez ou vous avertir avec un email. 

Ce n'est peut-être pas un problème aussi important que vous le pensez, car seul un faible pourcentage de personnes bloquent les annonces.

4
Byron Whitlock

Les deux réponses principales ne vous aident qu'avec une méthode particulière (si, probablement, la plus populaire) de blocage d'annonces. Les utilisateurs root peuvent également bloquer les annonces avec un pare-feu sur l'appareil. Les utilisateurs WiFi peuvent bloquer les annonces avec un pare-feu en amont.

Je suggère:

  1. Ne récompensez pas les utilisateurs bloquant les publicités. Assurez-vous que votre mise en page réserve une partie de l'affichage pour une annonce même si elle ne peut pas être chargée. Si vous avez une annonce plein écran qui joue un peu, assurez-vous que votre application en attend un peu, même si elle ne peut pas être lue. Si vous utilisez des notifications en tant qu'annonces (vous en faites), avertissez l'utilisateur lorsque vous ne parvenez pas à obtenir une telle annonce. Cela pourrait être interprété comme "gêner tous de vos utilisateurs", mais vos utilisateurs normaux savent ce qu'ils obtiennent et les "utilisateurs" qui bloquent les publicités ne sont pas recherchés.

  2. Demandez aux bloqueurs de publicité de s'arrêter. Moins une industrie qui fournit ce que l'utilisateur veut est rentable, moins l'industrie fournira ce que l'utilisateur voulait. Un développeur individuel constatera qu'il gagne plus d'argent en servant d'autres utilisateurs. Vous le savez et vos utilisateurs penseront que c'est évident une fois que vous leur avez dit, mais cela reste un argument économique - ce n'est pas intuitif. Avoir une annonce de sauvegarde qui dit quelque chose comme: "Ceci est mon travail. Si vous ne me payez pas, j'en aurai un autre, et vous ne recevrez pas plus d'applications de ce type de ma part".

4
Julian Fondren

Plutôt que de rechercher des fichiers d’hôtes individuels installés ou modifiés dans les logiciels, mon approche utilise un AdListener comme ceci et, si la publicité ne parvient pas à se charger en raison de NETWORK_ERROR, je récupère simplement une page aléatoire en ligne ( Apple.com) et vérifiez si les pages se chargent correctement.

Si tel est le cas, boom accède à l'application.

Pour ajouter du code, la classe d'auditeur serait quelque chose comme:

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();
}

Et puis chaque activité avec un adView ferait quelque chose comme:

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

Je suis sûr que cette réponse ne sera pas entièrement appréciée de certains segments de développeurs. Toutefois, si vous tombez dans cette catégorie, considérez que votre application ne mérite peut-être pas d'exister sur l'App Store. Veuillez noter que ceux-ci sont tous implémentables lorsque le code change, aucun piratage ou logiciel espion n’est nécessaire.

Fondamentalement, modifiez les aspects économiques de votre application. L'utilisateur a toujours raison - telle est l'attitude adoptée par l'une des agences de publicité les plus performantes de tous les temps (Google). Si vos annonces sont bloquées par les internautes, c’est parce que vous craignez, pas parce que les annonces ou les bloqueurs de publicité craignent.

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

  • Rendez les publicités moins ennuyeuses et directes. Les utilisateurs réagissent aux publicités médiocres/gênantes. Plus votre application ressemble à une pépinière, plus elle est susceptible de la laisser tomber de toute façon. Les applications contenant des annonces ne me dérangent pas tant qu'elles ne gênent pas de manière significative les fonctionnalités, et encore mieux, j'aime les annonces qui me concernent. ( http://www.nngroup.com/articles/most-hated-advertising-techniques/ )
  • Pour détecter que les annonces ne sont pas en cours de chargement, il n'est pas nécessaire d'implémenter les logiciels espions comme les activités mentionnées par les précédentes. Chargez une annonce contenant un code de confirmation et insérez de temps en temps une invite demandant le code de confirmation. Le code ne doit pas nécessairement être long ou ennuyeux, en fait, il suffirait de mettre en œuvre un service captcha avec 3 ou 4 lettres/chiffres . ( http://textcaptcha.com/api )
  • En plus de détecter l'échec du chargement des annonces, créez de meilleures annonces. Au lieu d'utiliser une API telle que des mobads (réalisez-vous même à quel point cela sonne? Mobs? Vraiment? Sommes-nous des développeurs, la mafia russe?), Entrez dans un partenariat avec une agence de publicité vous permettant d'intégrer des publicités directement à partir de votre application. Cela rendra votre application plus grande à installer, et non, vous ne pouvez pas vous protéger contre les modifications manuelles, mais les modifications suggérées ci-dessus ne le protègent pas non plus. Et cela soutiendra mieux toutes les versions payantes de votre application, qui seront beaucoup plus légères (et plus rapides).
  • Vérifiez minutieusement les annonces que vous affichez auprès de l'utilisateur, soyez ouvert et transparent à propos de vos règles en matière d'annonce et permettez même aux utilisateurs d'inspecter vos annonces et vos sources d'annonces. La raison principale qui me préoccupe le plus à propos des annonces n’est pas parce que je déteste les annonces, mais parce que je crains que le développeur de mauvaise qualité responsable de cette application n'introduise également des virus ou d’autres logiciels malveillants. Demandez qu'une exception soit faite à l'adblocker installé. Faites équipe avec des bloqueurs de publicités comme AdBlock pour accéder à leur liste d'exceptions. Si vous êtes une application légitime, cela ne devrait pas poser de problème . ( http://www.cio.com/article/699970/6_Ways_to_Defend_Against_Drive_by_Downloads?page=1&taxonomyId=3089 )

Je répète: tous les changements ci-dessus sont des choses que vous pouvez légitimement faire dans le code pour prévenir les comportements anti-pub. Les annonces sont bloquées pour des raisons de sécurité et des réactions viscérales, principalement, parfois de la bande passante et des performances. Par conséquent, assurez-vous que vos annonces n'invoquent aucun de ces problèmes, au niveau du code.

Enfin, je voulais aborder ce que Borealid a dit, ce que j'ai répété ci-dessus; à la fin, c’est un jeu de «chat et souris», car l’utilisateur a l’autorité et la responsabilité ultimes, légalement et moralement, sur ses propres biens. Un utilisateur peut faire n'importe quoi, y compris modifier directement le code à la volée. Bien sûr, il existe des restrictions que vous pouvez appliquer, etc., mais il existe toujours des moyens de contourner le problème. C'est le problème ultime (techniquement) du DRM (c'est ce que vous essayez de faire). Plutôt que de perdre du temps et des efforts sur ce jeu, il est préférable d'encourager les utilisateurs à conserver leurs annonces. ils deviendront gratuitement votre meilleur anti-bloquant publicitaire le plus intelligent.

1
smaudet

Je pense que cela dépend du fournisseur de contenu pour les annonces. Je sais que le Kit de développement logiciel (SDK) AdMob fournit un rappel lorsqu'une demande d'annonce échoue. Je pense que vous pourrez peut-être vous enregistrer, puis vérifier la connexion dans le rappel - s'il existe une connexion et que vous n'avez pas reçu d'avis - prenez note, si cela se produit plusieurs fois les annonces sont bloquées. Je n'ai pas travaillé avec l'ensemble d'outils AdSense pour les mobiles de Google, mais cela ne me surprendrait pas s'il existait un mécanisme de rappel similaire.

1
nEx.Software

Un utilisateur peut ignorer une annonce de deux manières:

1) Utilisez l'application sans Internet sur.

2) Avec le téléphone enraciné et le fichier hôte modifié.

J'ai créé deux outils que vous pouvez implémenter, voir le code ci-dessous.

checkifonline (); est pour le problème 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 (); est pour le problème 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

Vous ne pouvez rien faire qui puisse empêcher vos utilisateurs de faire mieux.

La seule chose qui me vienne à l’esprit comme efficace à distance est de faire des annonces un élément inextricable du programme, de sorte que, si elles sont bloquées, l’utilisateur ne puisse pas comprendre/interagir avec l’application.

1
Borealid

En plus de vérifier si admob peut être résolu, je présente une page qui indique en principe que j'ai détecté un adblocker, déclare que je comprends les raisons possibles, puis affiche des annonces intégrées de mes propres applications et demande leur soutien au développement continu. :)

0
pvella

Tout d’abord, laissez-moi vous dire que je pense que le blocage des publicités, en ce qui concerne les applications, est en réalité une forme de piratage. Ces applications sont prises en charge par les annonces et, parfois, par une "licence payante" pour les désactiver et/ou ajouter des fonctionnalités. En bloquant les annonces, les utilisateurs volent des revenus potentiels au développeur qui a pris le temps de créer l'application que vous utilisez.

Quoi qu'il en soit, je souhaite ajouter un moyen d’empêcher l’utilisation de bloqueurs de publicité. J'utilise cette méthode et je n'autorise pas les utilisateurs à utiliser l'application si je détecte un bloqueur de publicité. Les gens se mettent très en colère et vous donneront de mauvaises notes. Mais j’indique aussi très clairement dans mes descriptions d’applications que vous ne pourrez pas utiliser l’application si vous avez un adblocker.

J'utilise le gestionnaire de paquets pour vérifier si un paquet spécifique est installé. Bien que cela n’obtienne pas tous les adblockers, si vous restez "à jour" sur certains des plus populaires, vous pouvez en obtenir la plupart.

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

Donnez à vos utilisateurs un moyen d'utiliser l'application sans les annonces. Personnellement, je trouve les annonces publicitaires comme l’une des choses les plus agaçantes qui puissent éventuellement se produire sur mon ordinateur, et je paierai volontiers une application si elle m’évite l’insulte de me la faire passer au visage. Et je suis sûr que je ne suis pas le seul.

0
drmirror

Pour le cas où il n'y a pas de connexion Internet, j'ai suivi ceci tutorial Et j'ai construit un "écouteur d'état du réseau" comme ceci:

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 et unregisterReceiver doivent être appelés respectivement dans onResume et onPause, comme décrit ici .

Dans votre mise en page XML, configurez AdView et une ImageView de votre choix, comme suit:

<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" />

Désormais, chaque fois que la connexion Internet est disponible, l’annonce s’affiche et l’imageView s’affiche automatiquement, et inversement. Cela doit être fait dans toutes les activités pour lesquelles vous souhaitez que les annonces soient affichées.

0
Goran Horia Mihail

Ceci est une extension d'une réponse précédente. L'utilisateur m'a informé que l'application qu'il utilise s'appelle AdFree Android. On peut le trouver sur le marché. L'application indique qu'elle fonctionne en "annulant les demandes adressées à des noms d'hôtes connus servant des annonces".

Je suggère que si vous monétisez l'une de vos applications avec des annonces, vous vérifiez au démarrage ce programme et donnez à l'utilisateur un message désagréable, puis mettez fin à votre application. 

0
Christopher Perry