Как предотвратить блокировку рекламы в приложении? - PullRequest
58 голосов
/ 10 августа 2010

Один из моих пользователей выпустил кошку из сумки и сказал, что использует одно из моих бесплатных приложений, которое превращается в деньги с помощью рекламы, но они блокировали рекламу с помощью блокировщика рекламы. Они сказали мне это насмешливо, как будто я ничего не могу с этим поделать.

Могу ли я что-нибудь с этим сделать? Есть ли способ определить, что реклама заблокирована?

Ответы [ 15 ]

60 голосов
/ 09 января 2011

Мне известно об одном способе блокировки рекламы (на любом компьютере): они изменяют файл hosts так, чтобы он указывал на localhost для всех известных рекламных серверов. Для Android это находится в файле "etc / hosts".

Например, я использую рекламные объявления admob, а в файле хоста, взятом из пользовательского раздела, перечислены следующие записи 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) в этом случае.

Что я делаю в своих приложениях, так это проверяю этот хост-файл и проверяю наличие записей 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;
            }
        }
    } 

Я клянусь, что все поддерживаемые рекламой приложения должны проверять этот файл. Вам не нужно быть пользователем root для доступа к нему, но запись в него может быть другой историей.

Кроме того, не уверен, есть ли какие-либо другие файлы, которые действуют так же в ОС на основе Linux, но в любом случае мы всегда можем проверить все эти файлы.

Любые предложения по улучшению этого приветствуются.

Кроме того, приложению «Ad Free android» необходим root-доступ, а это означает, что оно, скорее всего, изменяет файл hosts для достижения своей цели.

25 голосов
/ 17 апреля 2011

Мой код для этой проблемы, таким образом: -

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

Надеюсь, это поможет.

9 голосов
/ 27 февраля 2012

Как разработчики, нам нужно выполнить сложную работу по сопереживанию пользователям и найти золотую середину между наказанием тех, кто пытается воспользоваться, и тех, кто играет по правилам.Мобильная реклама - это разумный способ разрешить кому-то бесплатно использовать функциональную часть программного обеспечения.Пользователи, которые используют методы блокировки рекламы, могут считаться потерянным доходом, но если вы посмотрите на общую картину, то они также могут рассказать о вашем приложении, если оно им понравится.Более мягкий подход к работе в системах с заблокированной рекламой - это показ собственной «домашней» рекламы.Создайте одно или несколько изображений баннеров и разместите их в том же месте, что и обычное объявление, с ImageView такой же высоты (например, 50 точек на дюйм).Если вы успешно получили объявление, установите видимость вашего ImageView на View.GONE.Вы даже можете создать таймер для циклического просмотра нескольких рекламных объявлений, чтобы привлечь внимание пользователя.При нажатии на ваше объявление пользователь может перейти на страницу рынка, чтобы купить полную версию.

4 голосов
/ 27 февраля 2012

Два верхних ответа помогут вам только с определенным (если, возможно, самым популярным) способом блокировки рекламы.Корневые пользователи также могут блокировать рекламу с помощью брандмауэра на устройстве.Пользователи WiFi могут блокировать рекламу с помощью вышестоящего брандмауэра.

Я предлагаю:

  1. Не поощряйте пользователей, блокирующих рекламу. Убедитесь, что ваш макетрезервирует часть показа для рекламы, даже если она не может быть загружена.Или, если у вас есть полноэкранное объявление, которое воспроизводится немного, убедитесь, что ваше приложение немного ждет, даже если объявление не может быть воспроизведено.Если вы используете уведомления в качестве рекламы (вы мрази), уведомите пользователя, если вы не получите такую ​​рекламу.Это может быть прочитано как «раздражать всех ваших пользователей», но ваши обычные пользователи знают, что они получают, а блокирующие вас объявления «пользователи» не нужны.

  2. Попросите блокировщиков рекламы прекратить. Чем менее прибыльна отрасль, которая предоставляет то, что хочет пользователь, тем меньше отрасль будет поставлять то, что хотел пользователь.Индивидуальный разработчик обнаружит, что он зарабатывает больше денег, обслуживая других пользователей.Вы знаете это, и ваши пользователи будут считать это очевидным после того, как вы им скажете, но это все еще экономический аргумент - он не интуитивен.У меня есть резервное объявление с надписью: «Это моя работа. Если вы мне не заплатите, я получу еще одно, и вы не получите больше таких приложений от меня».

4 голосов
/ 11 августа 2010

Можете ли вы проверить, загружено ли объявление в ваше приложение?

Блокировщики рекламы работают, предотвращая загрузку данных вашим приложением. Вы можете проверить длину содержания данных в вашем рекламном фрейме, чтобы убедиться, что там есть данные.

Если данных нет, выведите сообщение и выйдите или предупредите вас по электронной почте.

Возможно, это не такая большая проблема, как вы думаете, поскольку только небольшой процент людей блокирует рекламу.

3 голосов
/ 17 сентября 2012

Вместо проверки для отдельного установленного программного обеспечения или измененного файла hosts мой подход заключается в использовании AdListener , например, , и, если не удается загрузить объявление из-за NETWORK_ERROR , я просто получаюкакую-нибудь случайную постоянно онлайн-страницу (для пинков, apple.com) и проверьте, успешно ли загружаются страницы.

Если это так, boom выходит из приложения .

Чтобы добавить некоторый код, класс слушателя будет выглядеть примерно так:

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();
            }
        });
1 голос
/ 23 марта 2012

Пользователь может пропустить объявление двумя способами:

1) Использовать приложение без подключения к Интернету.

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 голос
/ 11 августа 2010

Я думаю, это зависит от поставщика контента для рекламы.Я знаю, что AdMob SDK обеспечивает обратный вызов при сбое запроса объявления.Я подозреваю, что вы могли бы зарегистрироваться для этого, а затем проверить соединение в обратном вызове - если есть соединение, и вы не получили объявление - обратите внимание, если это происходит более одного или двух раз, скорее всего ваширеклама блокируется.Я не работал с набором инструментов AdSense для мобильных устройств от Google, но меня не удивит, если бы существовал аналогичный механизм обратного вызова.

1 голос
/ 11 августа 2010

Вы ничего не можете сделать, чтобы ваши пользователи не могли сделать лучше.

Единственное, что приходит на ум как удаленно эффективный, - это сделать рекламу неотъемлемой частью программы, чтобы в случае их блокировки пользователь не мог понять смысл / взаимодействовать с приложением.

0 голосов
/ 01 февраля 2017

Помимо проверки возможности устранения admob, я делаю, чтобы показать страницу, которая в основном сообщает о том, что я обнаружил блокировщик рекламы, заявляет, что я понимаю возможные причины этого, затем показываю несколько встроенных рекламных объявлений моих собственных приложений и спрашиваю за их добрую поддержку для дальнейшего развития. :)

...