Как предотвратить блокировка рекламы блокировать рекламы в приложении


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

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

15 58

15 ответов:

Я знаю об одном способе блокировки рекламы (на любом компьютере действительно), они редактируют файл 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" нуждается в корневом доступе, что означает, что он, скорее всего, изменяет файл hosts для достижения его цель.

мой код для этой проблемы таков: -

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

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

как разработчики, мы должны сделать трудную работу сопереживания с пользователями и найти золотую середину между наказанием немногих, кто пытается воспользоваться и многие, кто играет по правилам. Мобильная реклама является разумным способом, чтобы позволить кому-то использовать функциональную часть программного обеспечения бесплатно. Пользователи, которые используют методы блокировки рекламы, могут считаться потерянными доходами, но если вы посмотрите на общую картину, также могут быть те, кто распространяет информацию о вашем приложении, если им нравится оно. Более щадящий подход к работе на системах с заблокированной рекламой-это отображение собственного" домашнего " объявления. Создайте одно или несколько изображений баннера и отобразите их в том же месте, что и обычное объявление с помощью ImageView той же высоты (например, 50dp). Если вы успешно получаете объявление, то установите видимость вашего ImageView для просмотра.УШЕДШИЙ. Вы даже можете создать таймер для циклического просмотра нескольких домашних объявлений, чтобы привлечь внимание пользователя. Нажатие на ваше объявление может привести пользователя на страницу рынка, чтобы купить полная версия.

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

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

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

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

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

Я предлагаю:

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

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

вместо того, чтобы проверять наличие отдельного установленного программного обеспечения или измененного файла hosts, мой подход использует AdListener такой и, если объявление не загружается из-за 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();
            }
        });

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

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

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

есть два способа для пользователя, чтобы передать объявление:

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

    }
}

Это расширение предыдущего ответа. Пользователь сообщил мне, что приложение, которое они используют, называется AdFree Android. Его можно найти на рынке. Приложение говорит, что оно работает путем "аннулирования запросов к известным именам хостов, обслуживающих рекламу."

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

в любом случае, я хочу добавить способ, чтобы помочь предотвратить использование блокировщиков рекламы. Я использую этот метод, и я не позволяю пользователям использовать приложение, если я обнаружу блокировщик рекламы. Люди очень злятся и дадут вам плохие оценки за это. Но я также очень четко заявляю в своих описаниях приложений, что вы не сможете использовать приложение, если у вас есть adblocker.

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

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

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

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

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

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

  • сделайте рекламу менее раздражающей и в вашем лице. Пользователи реагируют на плохую / раздражающую рекламу, и чем более семенным выглядит и становится ваше приложение, тем более вероятно, что они в любом случае бросят его. Я не против приложений с рекламой в них до тех пор, как они не значительно затрудняют функциональность, и даже лучше мне нравятся объявления, которые имеют отношение ко мне. (http://www.nngroup.com/articles/most-hated-advertising-techniques/)
  • чтобы обнаружить, что объявления не загружаются, его не нужно реализовывать шпионские программы, как действия, упомянутые в предыдущих плакатах. Загрузите объявление с кодом подтверждения и время от времени вставляйте приглашение с запросом кода подтверждения. Код не должен быть длинным или раздражает, на самом деле было бы достаточно реализовать службу captcha с 3 или 4 буквами/цифрами. (http://textcaptcha.com/api)
  • в дополнение к обнаружению сбоя рекламы для загрузки, сделать лучше объявления. Вместо того, чтобы использовать API, такой как mobads (вы даже не понимаете, как это звучит? Мобы? Правда? Мы разработчики, русская мафия?), войти в партнерство с рекламной компанией, которая позволяет размещать рекламу непосредственно из вашего приложения. Это сделает ваше общее приложение больше для установки, и нет, вы не можете защититься от ручного изменения, но изменения, предложенные выше, также не защищают от этого. И это позволит лучше поддерживать любые платные версии вашего приложения, которые будут намного легче (и быстрее).
  • тщательно проверяйте объявления, которые вы показываете пользователю, будьте открыты и прозрачны в отношении ваших рекламных политик и даже позволяйте пользователям проверять ваши объявления и источники объявлений. Основная причина, по которой я когда-либо беспокоился о рекламе, заключается не в том, что я ненавижу рекламу, а потому, что я беспокойство о том, что разработчик низкого качества, ответственный за это приложение, также пропускает вирусы или другие вредоносные программы. Спросите, что исключение будет сделано в установленный Антибаннер. Объединитесь с блокировщиками рекламы, такими как AdBlock, чтобы попасть в их список исключений. Если вы являетесь законным приложением, это не должно быть проблемой. (http://www.cio.com/article/699970/6_Ways_to_Defend_Against_Drive_by_Downloads?page=1&taxonomyId=3089)

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

наконец, я хотел коснуться того, что сказал Бореалид, который я повторил выше; в конце концов, это игра "кошки-мышки", потому что пользователь имеет окончательные полномочия и ответственность, как юридически, так и морально свое имущество. Пользователь может делать что угодно, в том числе непосредственно изменять код на лету. Конечно, есть ограничения, которые вы можете реализовать и т. д. но всегда есть способы обойти проблему. Это конечная проблема (технически) с DRM (что вы и пытаетесь сделать). Вместо того, чтобы тратить время и усилия на эту игру, лучше поощрять пользователей держать рекламу вокруг; они станут вашими лучшими, умными анти-блокировщиками рекламы бесплатно.

для случая, когда нет подключения к интернету, я следил за этим учебник и я построил "прослушиватель состояния сети" Вот так:

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 и 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 появится, и наоборот. Это должно быть сделано в каждом действии, в котором вы хотите, чтобы объявления отображались.

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