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’il utilisait une de mes applications gratuites, monétisée par les annonces, mais qu’il bloquait les publicités avec un bloqueur de publicité. Ils m’ont dit cela de façon moqueuse, comme si je ne pouvais rien y faire.

Puis-je faire quelque chose à ce sujet? Est-il possible de détecter que les annonces sont bloquées?

Je sais qu’il existe un moyen de bloquer les publicités (sur n’importe quel ordinateur): elles modifient le fichier des hôtes pour qu’il pointe sur localhost pour tous les serveurs publicitaires connus. Pour Android, cela se trouve dans le fichier “etc / hosts”.

Par exemple, j’utilise les annonces AdMob et un fichier hôte que j’ai pris à partir de rom personnalisé répertorie les entrées 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, elles sont routées vers l’adresse indiquée à gauche (localhost) dans ce cas.

Qu’est-ce que je fais dans mes applications est de vérifier ce fichier hôte et de rechercher toutes les entrées d’admob, si je trouve à informer l’utilisateur que j’ai détecté le blocage des annonces et leur dire de supprimer les entrées d’admob et ne leur permet pas d’utiliser l’application.

Après tout, à quoi cela sert-il si les annonces ne sont pas diffusées? Inutile de les laisser utiliser l’application gratuitement.

Voici un extrait de code de la façon dont je réalise cela:

  BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader( new FileInputStream("/etc/hosts"))); Ssortingng line; while ((line = in.readLine()) != null) { if (line.contains("admob")) { result = false; break; } } } 

Je promets que toutes les applications sockets en charge par les annonces devraient vérifier ce fichier. Vous n’avez pas besoin d’être root pour y accéder, mais l’écrire peut être une autre histoire.

De plus, je ne suis pas sûr qu’il y ait d’autres fichiers qui agissent de la même manière sur un système d’exploitation Linux, mais en tout cas nous pouvons toujours vérifier tous ces fichiers.

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

De plus, l’application appelée “Ad Free android” a besoin d’un access root, ce qui signifie qu’elle modifie très probablement le fichier hosts afin d’atteindre son objective.

Mon code pour ce problème 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.

En tant que développeurs, nous devons faire preuve d’empathie avec les utilisateurs et trouver un terrain d’entente entre punir les quelques-uns qui tentent d’en tirer profit et ceux qui respectent les règles. La publicité mobile est un moyen raisonnable de permettre à quelqu’un d’utiliser un logiciel fonctionnel gratuitement. Les utilisateurs qui utilisent des techniques de blocage des publicités peuvent être considérés comme des revenus perdus, mais si vous examinez la situation dans son ensemble, vous pouvez également parler de votre application si elle vous plaît. Une approche plus douce de l’exécution sur des systèmes dont les annonces sont 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 même hauteur (par exemple, 50dp). Si vous recevez avec succès une annonce, définissez la visibilité de votre ImageView sur View.GONE. Vous pouvez même créer une timer pour parcourir plusieurs annonces pour 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.

Pouvez-vous vérifier si l’annonce a été 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 cadre publicitaire pour vous assurer qu’il contient des données.

S’il n’y a pas de données, lancez un message et quittez ou vous avertissez par un email.

Cela pourrait ne pas être un problème aussi important que vous le pensez, car seul un faible pourcentage de personnes bloque les publicités.

Les deux premières réponses vous aident uniquement avec une méthode de blocage des annonces (si probablement la plus populaire). Les utilisateurs root peuvent également bloquer les annonces avec un pare-feu sur le périphérique. 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 conserve une partie de l’affichage pour une annonce même s’il est impossible de la charger. Ou, si vous diffusez une annonce en plein écran, assurez-vous que votre application attend un peu, même si l’annonce ne peut pas être lue. Si vous utilisez des notifications en tant qu’annonces, vous avertissez l’utilisateur lorsque vous ne parvenez pas à obtenir une telle annonce. Cela pourrait être lu comme “ennuyer tous vos utilisateurs”, mais vos utilisateurs normaux savent ce qu’ils obtiennent, et vos “utilisateurs” bloquant les publicités ne sont pas recherchés.

  2. Demandez aux bloqueurs de publicité d’arrêter. Moins une indussortinge fournit ce que veut un utilisateur, moins cette indussortinge fournit ce que l’utilisateur souhaite. Un développeur individuel trouvera qu’il gagne plus d’argent au service des autres utilisateurs. Vous le savez, et vos utilisateurs le trouveront évident après leur avoir dit, mais c’est toujours un argument économique – ce n’est pas intuitif. Ayez 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 comme celle-ci.”

Plutôt que de vérifier si le fichier hosts est installé ou modifié par un logiciel individuel, mon approche utilise un AdListener comme celui-ci et si l’annonce ne parvient pas à se charger à cause de NETWORK_ERROR , je récupère une page aléatoire en ligne (apple.com). et vérifiez si les pages se chargent avec succès.

Si oui, le boom va l’application .

Pour append du code, la classe d’écoute 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(); } }); 

Vous ne pouvez rien faire pour que vos utilisateurs ne puissent pas faire mieux.

La seule chose qui me vient à l’esprit est de faire des annonces une partie inexsortingcable du programme, de sorte que si elles sont bloquées, l’utilisateur ne peut pas comprendre / interagir avec l’application.

Je pense que cela dépend du fournisseur de contenu pour les annonces. Je sais que le SDK AdMob fournit un rappel lorsqu’une demande d’annonce échoue. Je soupçonne que vous pourriez être en mesure de vous inscrire pour cela, puis vérifiez la connexion dans le rappel – s’il y a une connexion et que vous n’avez pas reçu d’annonce – prenez note, si cela se produit plus d’une fois ou deux, votre les annonces sont bloquées. Je n’ai pas travaillé avec le jeu d’outils AdSense pour mobile de Google, mais cela ne me surprendrait pas s’il existait un mécanisme de rappel similaire.

Donnez à vos utilisateurs un moyen d’utiliser l’application sans les annonces. Je trouve personnellement que les annonces sont l’une des choses les plus ennuyeuses qui pourraient se produire sur mon ordinateur, et je serai ravi de payer pour une application si cela ne me permet pas de recevoir des annonces. Et je suis sûr que je ne suis pas le seul.

Il existe deux manières pour un utilisateur de passer une annonce:

1) Utilisez l’application sans internet sur.

2) Avec téléphone rooté et 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"))); Ssortingng 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(); } } 

Ceci est une extension d’une réponse précédente. L’utilisateur m’a informé que l’application utilisée s’appelle AdFree Android. On peut le trouver sur le marché. L’application dit que cela fonctionne en “annulant les demandes de noms d’hôtes connus diffusant des annonces”.

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

Tout d’abord, permettez-moi de dire que je pense que le blocage des publicités, lorsqu’il s’agit d’applications, est en réalité une forme de piratage. Ces applications sont sockets en charge par les annonces et, parfois, par une “licence payante” pour désactiver les annonces et / ou append des fonctionnalités. En bloquant les annonces, les utilisateurs volent les revenus potentiels du développeur qui a pris le temps de créer l’application que vous utilisez.

Quoi qu’il en soit, je veux append un moyen d’empêcher l’utilisation des 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 sont très en colère et vous donneront de mauvaises notes. Mais je déclare également 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 tous les adblockers ne soient pas disponibles, si vous restz à 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 } 

Je suis sûr que cette réponse ne sera pas très populaire auprès de certains segments de développeurs, mais considérez si vous tombez dans cette catégorie que votre application ne mérite peut-être pas d’exister sur l’App Store. S’il vous plaît noter que ceux-ci sont tous réalisables que les changements de code, pas de piratage ou de comportement de type spyware requirejs.

Fondamentalement, changez l’économie de votre application. L’utilisateur a toujours raison – c’est l’attitude de l’une des agences de publicité les plus performantes de l’histoire (Google). Si vos annonces sont bloquées par les utilisateurs, c’est parce que vous êtes nul, non pas parce que les publicités ou les bloqueurs de publicité sont vains.

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

  • Faites en sorte que vos annonces soient moins ennuyantes Les utilisateurs réagissent à une publicité médiocre / ennuyeuse et, plus votre application est appétissante, plus elle risque de la laisser tomber. Les applications avec des publicités ne me dérangent pas tant qu’elles n’entravent pas de manière significative les fonctionnalités, et même mieux les annonces qui me concernent. ( http://www.nngroup.com/articles/most-hated-advertising-techniques/ )
  • Pour détecter que les annonces ne sont pas chargées, il n’est pas nécessaire d’implémenter les activités de type «spyware» mentionnées par les affiches précédentes. Chargez une annonce contenant un code de confirmation et, de temps en temps, insérez une invite demandant le code de confirmation. Le code n’a pas besoin d’être long ou agaçant, en fait, il suffirait d’implémenter un service captcha avec 3 ou 4 lettres / chiffres. ( http://textcaptcha.com/api )
  • En plus de détecter les défaillances des annonces, effectuez de meilleures annonces. Au lieu d’utiliser une API comme les mobads (vous rendez-vous compte à quel point cela peut vous paraître désagréable? Mobs? Vraiment? Nous sums des développeurs, la mafia russe?), Entrez dans un partenariat avec une société de publicité qui Cela rendra votre application plus grande à installer, et non, vous ne pouvez pas vous prémunir contre la modification manuelle, mais les modifications suggérées ci-dessus ne le protègent pas non plus. Et cela permettra de mieux prendre en charge toutes les versions payantes de votre application, qui seront beaucoup plus légères (et plus rapides).
  • Passez au crible les annonces que vous affichez, restz ouvert et transparent sur vos règles d’annonce et autorisez même les utilisateurs à inspecter vos annonces et vos sources d’annonces. La principale raison pour laquelle je suis préoccupé par les annonces, ce n’est pas parce que je déteste les publicités, mais parce que je crains que le développeur de mauvaise qualité responsable de cette application ne laisse également passer des virus ou 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 empêcher les comportements anti-publicité. Les publicités sont bloquées pour des raisons de sécurité et des réactions viscérales, principalement, et parfois sur la bande passante et les performances. Assurez-vous donc que vos annonces n’invoquent aucun de ces problèmes, au niveau du code.

Finalement, je voulais parler de ce que Borealid a dit, que j’ai réitéré ci-dessus; en fin de compte, il s’agit d’un jeu «chat et souris», car l’utilisateur a l’autorité et la responsabilité ultimes, à la fois légalement et moralement, sur ses propres biens. Un utilisateur peut faire tout, y compris modifier directement le code à la volée. Bien sûr, il existe des ressortingctions que vous pouvez mettre en œuvre, etc., mais il existe toujours des moyens de contourner le problème. C’est le problème ultime (techniquement) avec les DRM (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 vos meilleurs anti-bloqueurs, les plus intelligents, gratuitement.

Dans le cas où il n’y a pas de connexion Internet, j’ai suivi ce tutoriel et j’ai créé un “écouteur d’état du réseau” comme suit:

 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 layout xml, configurez AdView et une ImageView de votre choix, comme ceci:

   

Désormais, chaque fois que la connexion Internet est disponible, l’annonce s’affiche et s’il est désactivé, ImageView s’affiche, et inversement. Cela doit être fait dans chaque activité dans laquelle vous souhaitez que les annonces s’affichent.

En plus de vérifier si l’admob peut être résolu, je présente une page qui indique 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 type. soutien au développement continu. 🙂