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?
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.
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.
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.
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.
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:
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.
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."
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();
}
});
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
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.
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.
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();
}
}
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.
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. :)
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
}
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.
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.
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.