web-dev-qa-db-ja.com

広告ブロッカーがアプリの広告をブロックしないようにする方法

ユーザーの1人が猫を袋から出して、広告で収益化されている無料アプリの1つを使用していると告げましたが、広告ブロッカーで広告をブロックしていました。私はそれについて何もできないかのように、彼らは私にこれをあざけりました。

それについて何かできますか?広告がブロックされていることを検出する方法はありますか?

58

広告のブロックが機能する1つの方法を知っています(実際、どのコンピューターでも)、既知のすべての広告サーバーのlocalhostを指すようにホストファイルを編集します。 Androidの場合、これは「etc/hosts」ファイルにあります。

たとえば、私はadmob広告を使用し、カスタムROMから取得したホストファイルには、次のadmobエントリがリストされています。

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

これで、プロセスが上記のアドレスを解決しようとするたびに、この場合それらの左側にリストされたアドレス(localhost)にルーティングされます。

アプリで行うことは、このHostファイルをチェックしてadmobエントリを探すことです。何か見つかった場合は、広告のブロックを検出したことをユーザーに通知し、そこからadmobエントリを削除し、アプリ。

結局のところ、広告が表示されない場合、それは何の役に立つのでしょうか?無料でアプリを使用できるようにする意味はありません。

これを実現する方法のコードスニペットを次に示します。

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

すべての広告サポートアプリがこのファイルをチェックすることを誓います。あなたはそれにアクセスするためにルートである必要はありませんが、それに書き込むことは別の話かもしれません。

また、LinuxベースのOSで同じように動作する他のファイルがあるかどうかはわかりませんが、いずれにしても、それらのファイルを常にチェックできます。

これを改善するための提案を歓迎します。

また、「Ad Free Android」というアプリにはルートアクセスが必要です。つまり、目的を達成するためにホストファイルを変更する可能性が高いということです。

60
Ivan

したがって、この問題の私のコードは次のとおりです。-

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

お役に立てば幸いです。

25
Jonathan

開発者として、私たちはユーザーに共感するという難しい仕事をする必要があり、利用しようとする少数の人とルールに従って遊ぶ多くの人を罰することの間の中間点を見つける必要があります。モバイル広告は、誰かが機能するソフトウェアを無料で使用できるようにする合理的な方法です。広告ブロック技術を使用しているユーザーは収益の損失と見なされる可能性がありますが、全体像を見ると、気に入った場合はアプリケーションについてWordを広めることもできます。広告がブロックされたシステムで実行するより穏やかなアプローチは、独自の「ハウス」広告を表示することです。 1つ以上のバナー画像を作成し、通常の広告と同じ場所に、同じ高さ(例:50dp)のImageViewを使用して表示します。広告を正常に受信したら、ImageViewの可視性をView.GONEに設定します。ユーザーの注意を引くために、いくつかのハウス広告を循環するタイマーを作成することもできます。広告をクリックすると、ユーザーはマーケットページに移動して完全版を購入できます。

9
BitBank

アプリに広告が読み込まれたかどうかを確認できますか?

広告ブロッカーは、アプリがデータをダウンロードできないようにすることで機能します。広告フレームのデータのコンテンツの長さをチェックして、そこにデータがあることを確認できます。

データがない場合は、メッセージをスローして終了するか、電子メールで警告します。

広告をブロックする人はごく一部であるため、あなたが考えるほど大きな問題ではないかもしれません。

4
Byron Whitlock

上位2つの回答は、広告をブロックする特定の(おそらく最も人気のある)方法のみで役立ちます。ルートユーザーは、デバイス上のファイアウォールで広告をブロックすることもできます。 WiFiユーザーは、アップストリームファイアウォールで広告をブロックできます。

私は提案します:

  1. 広告をブロックするユーザーに報酬を与えないでください。たとえロードできない場合でも、レイアウトが広告の表示の一部を確保するようにしてください。または、少しの間再生されるフルスクリーン広告がある場合は、広告が再生できない場合でもアプリが少し待つようにしてください。通知を広告として使用する場合(スカム)、そのような広告を取得できない場合はユーザーに通知します。これは「annoy all your users」と読むこともできますが、通常のユーザーは何を取得しているのかを知っており、広告をブロックする「ユーザー」は望んでいません。

  2. 広告ブロッカーを停止するように依頼してください。ユーザーが望むものを提供する業界の収益性が低いほど、その業界はユーザーが望んでいたものを提供しなくなります。個々の開発者は、他のユーザーにより多くのお金を稼いでいることに気付くでしょう。あなたはこれを知っており、あなたのユーザーはあなたに彼らに言った後にそれが明白だと思うでしょうが、それはまだ経済的な議論です-それは直観的ではありません。 「これは私の仕事です。もしあなたが私にお金を払わなければ、私は別のものを手に入れます。あなたは私からこのようなアプリをこれ以上手に入れることはありません。」

4
Julian Fondren

個々のソフトウェアがインストールまたは変更されたホストファイルをチェックするのではなく、AdListener like this を使用し、NETWORK_ERROR、ランダムな常時オンラインページ(キックの場合はApple.com)をフェッチし、ページが正常にロードされるかどうかを確認します。

その場合、ブームがアプリに行きます

コードを追加するには、リスナークラスは次のようになります。

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

そして、adViewを使用した各アクティビティは次のようになります。

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

この回答は特定の開発者セグメントに完全に人気があるわけではありませんが、このカテゴリに該当する場合は、アプリがアプリストアに存在するに値しない可能性があることを考慮してください。これらはすべてコードの変更として実装可能で、ハッカーや動作のようなスパイウェアは必要ありません。

基本的に、アプリの経済性を変えます。 ユーザーは常に正しい-これは、これまでで最も成功した広告会社の1つ(Google)が取った態度です。広告がユーザーによってブロックされている場合、それはyouが原因であり、広告や広告ブロッカーが原因ではありません。

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

  • 広告の煩わしさをなくし、顔を出します。ユーザーは貧弱な/迷惑な広告に反応し、アプリの見た目や仕上がりが悪いほど、とにかくそれを捨てる可能性が高くなります。機能を大幅に妨げない限り、広告が含まれるアプリを気にしません。さらに、自分に関連する広告が好きです。 ( http://www.nngroup.com/articles/most-hated-advertising-techniques/
  • 広告が読み込まれていないことを検出するために、以前の投稿者が言及したアクティビティのようなスパイウェアを実装する必要はありません。確認コードを持つ広告を読み込み、時々、確認コードを要求するプロンプトを挿入します。コードは長かったり迷惑である必要はありません。実際には、3文字または4文字の数字のキャプチャサービスを実装すれば十分です。 ( http://textcaptcha.com/api
  • 広告の読み込みの失敗を検出することに加えて、より良い広告を作成します。 mobadsのようなAPIを使用する代わりに(いかに怪しげな音なのか、Mobなのか?本当に開発者なのか、ロシアのマフィアなのか?)、アプリから広告を直接埋め込むことができる広告会社と提携します。インストールするアプリ全体が大きくなります。いいえ、手動での変更を防ぐことはできませんが、上記で提案した変更はそれを防ぐことはできません。また、これはアプリの有料版をよりよくサポートし、はるかに軽量(かつ高速)になります。
  • ユーザーに表示する広告を徹底的に吟味し、広告ポリシーについてオープンで透明性を保ち、ユーザーが広告や広告ソースを検査できるようにします。広告が気になる主な理由は、広告が嫌いだからではなく、このアプリを担当する低品質の開発者がウイルスやその他のマルウェアも入れているのではないかと心配しているためです。インストールされたadblockerに例外を作成するよう依頼してください。 AdBlockなどの広告ブロッカーと協力して、例外リストに登録します。正当なアプリケーションであれば、これは問題になりません。 ( http://www.cio.com/article/699970/6_Ways_to_Defend_Against_Drive_by_Downloads?page=1&taxonomyId=3089

繰り返しになりますが、上記の変更はすべて、コード内で合法的に実行できることです。広告は、セキュリティ上の理由と内臓反応、主に、場合によっては帯域幅とパフォーマンスのためにブロックされます。そのため、広告がこれらの問題をコードレベルで引き起こさないようにしてください。

最後に、ボレアリードが言ったことに触れたいと思いました。ユーザーは自分の財産に対して法的および道徳的に究極の権限と責任を持っているため、最終的には「ネコとネズミ」ゲームです。ユーザーは、コードをその場で直接変更するなど、何でもできます。もちろん、実装できる制限などはありますが、常に問題を回避する方法があります。これは(技術的に)DRMの究極の問題です(これはあなたがやろうとしていることです)。このゲームに時間と労力を費やすよりも、ユーザーに広告を維持するように勧める方がよいでしょう。彼らはあなたの最高の、最も賢いアンチ広告ブロッカーに無料でなります。

1
smaudet

広告のコンテンツプロバイダーに依存すると思います。 AdMob SDKは、広告リクエストが失敗したときにコールバックを提供することを知っています。これに登録して、コールバックで接続を確認できる可能性があります-接続があり、広告を受信しなかった場合-それが複数回発生する場合は、可能性が高い可能性があります広告がブロックされています。 Googleのモバイル向けAdSenseツールセットを使用したことはありませんが、同様のコールバックメカニズムがあれば驚かないでしょう。

1
nEx.Software

ユーザーが広告を渡すには2つの方法があります。

1)インターネットなしでアプリを使用します。

2)ルート化された電話と変更されたホストファイル。

実装できる2つのツールを作成しました。以下のコードを参照してください。

checkifonline();問題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();問題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

ユーザーが上手くできないことは何もできません。

リモートで効果的であると思い浮かぶのは、広告をプログラムの不可分な部分にすることです。これにより、広告がブロックされた場合、ユーザーはアプリケーションの意味を理解したり操作したりできなくなります。

1
Borealid

Admobが解決できるかどうかを確認するだけでなく、基本的にアドブロッカーを検出したことを通知するページを表示し、考えられる理由を理解し、自分のアプリの組み込み広告をいくつか表示して、種類を尋ねます継続的な開発のサポート。 :)

0
pvella

まず、アプリケーションに関して言えば、広告のブロックは実際には著作権侵害の一種であると考えていると言えます。これらのアプリは広告でサポートされており、広告をオフにしたり機能を追加したりするための「有料ライセンス」もあります。広告をブロックすることで、ユーザーは、使用しているアプリの作成に時間がかかった開発者から潜在的な収益を奪っています。

とにかく、広告ブロッカーの使用を防ぐ方法を追加したいと思います。この方法を使用し、広告ブロッカーを検出した場合、ユーザーがアプリを使用することを許可しません。人々は非常に怒って、それに対してあなたに悪い評価を与えます。しかし、アプリケーションの説明では、アドブロッカーを使用している場合はアプリを使用できないことも明記しています。

パッケージマネージャーを使用して、特定のパッケージがインストールされているかどうかを確認します。これはすべてのアドブロッカーを取得するわけではありませんが、人気のあるもののいくつかを「最新」に保つと、ほとんどのアドブロッカーを取得できます。

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

ユーザーに広告なしでアプリを使用する方法を提供します。個人的には、広告は私のコンピューターで発生する可能性のある最も厄介なものの1つであり、広告が私の顔に投げつけられるというin辱を免れれば、喜んでアプリケーションに支払います。そして、私は私だけではないと確信しています。

0
drmirror

インターネットに接続されていない場合は、次のようにしました tutorial そして、次のような「ネットワーク状態リスナー」を構築しました。

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

here で説明されているように、registerReceiverとunregisterReceiverをそれぞれonResumeとonPauseで呼び出す必要があります。

レイアウトxmlで、次のようにAdViewと独自の選択のImageViewを設定します。

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

これで、インターネット接続が利用可能な場合はいつでも広告が表示され、ImageViewから離れるとポップアップが表示され、その逆も同様です。これは、広告を表示するすべてのアクティビティで実行する必要があります。

0

これは以前の回答の延長です。ユーザーは、使用しているアプリがAdFree Androidと呼ばれていることを通知しました。市場で見つけることができます。このアプリは、「広告を配信する既知のホスト名へのリクエストを無効にする」ことで機能すると述べています。

広告でアプリを収益化する場合は、起動時にこのプログラムを確認し、ユーザーに不快なメッセージを伝えてからアプリを終了することをお勧めします。

0