Programing

광고 차단기가 앱에서 광고를 차단하지 못하도록하는 방법

lottogame 2020. 12. 12. 09:54
반응형

광고 차단기가 앱에서 광고를 차단하지 못하도록하는 방법


내 사용자 중 한 명이 고양이를 가방에서 꺼내고 광고로 수익을 창출하는 무료 앱 중 하나를 사용하고 있지만 광고 차단기로 광고를 차단하고 있다고 말했습니다. 그들은 내가 그것에 대해 아무것도 할 수없는 것처럼 조롱하게 말했다.

그것에 대해 뭔가를 할 수 있습니까? 광고가 차단되고 있음을 감지하는 방법이 있습니까?


나는 광고 차단이 (실제로 모든 컴퓨터에서) 작동하는 한 가지 방법을 알고 있으며 알려진 모든 광고 서버에 대해 localhost를 가리 키도록 hosts 파일을 편집합니다. 안드로이드의 경우 "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)로 라우팅됩니다.

내 앱에서 내가하는 일은이 호스트 파일을 확인하고 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"라는 앱은 루트 액세스가 필요합니다. 즉, 목표를 달성하기 위해 호스트 파일을 변경할 가능성이 큽니다.


따라서이 문제에 대한 내 코드는 다음과 같습니다.-

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의 가시성을 View.GONE으로 설정하십시오. 사용자의 관심을 끌기 위해 여러 하우스 광고를 순환하는 타이머를 만들 수도 있습니다. 광고를 클릭하면 정식 버전을 구매할 수있는 마켓 페이지로 이동할 수 있습니다.


앱에 광고가로드되었는지 확인할 수 있습니까?

광고 차단기는 앱이 데이터를 다운로드하지 못하도록 차단합니다. 광고 프레임에서 데이터의 콘텐츠 길이를 확인하여 데이터가 있는지 확인할 수 있습니다.

데이터가 없으면 메시지를 표시하고 종료하거나 이메일로 경고합니다.

소수의 사람들 만 광고를 차단하기 때문에 생각만큼 큰 문제는 아닐 수 있습니다.


상위 2 개 답변은 광고를 차단하는 특정 (아마도 가장 인기있는) 방법에만 도움이됩니다. 루트 사용자는 장치에서 방화벽으로 광고를 차단할 수도 있습니다. WiFi 사용자는 업스트림 방화벽으로 광고를 차단할 수 있습니다.

나는 제안한다 :

  1. 광고 차단 사용자에게 보상하지 마십시오. 레이아웃이 광고를로드 할 수 없더라도 디스플레이의 일부를 예약해야합니다. 또는 잠시 동안 재생되는 전체 화면 광고가있는 경우 광고를 재생할 수없는 경우에도 앱이 잠시 기다려야합니다. 알림을 광고 (스컴)로 사용하는 경우 이러한 광고를받지 못한 경우 사용자에게 알립니다. 이것은 " 모든 사용자를 짜증나게한다"라고 읽을 수 있지만 일반 사용자는 자신이 무엇을 얻고 있는지 알고 있으며 광고 차단 '사용자'는 원하지 않습니다.

  2. 광고 차단기에 중지하도록 요청하십시오. 사용자가 원하는 것을 공급하는 산업이 덜 생산적 일수록 해당 산업은 사용자가 원하는 것을 공급하지 않을 것입니다. 개별 개발자는 다른 사용자에게 서비스를 제공하는 데 더 많은 수익을 올릴 수 있습니다. 당신은 이것을 알고 있고 당신의 사용자는 당신이 그들에게 말한 후에 그것이 명백하다고 생각할 것입니다. 그러나 그것은 여전히 ​​경제적 논쟁입니다. 그것은 직관적이지 않습니다. "이건 내 일이야. 돈을주지 않으면 다른 하나를 받게되며 이런 앱은 더 이상받지 못할 것입니다."와 같은 대체 광고가 있습니다.


개별 소프트웨어 설치 또는 수정 된 호스트 파일을 확인하는 대신, 내 접근 방식은 이와 같은 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가 콜백을 제공한다는 것을 알고 있습니다. 나는 당신이 이것에 등록 할 수있을 것이라고 생각한다. 그런 다음 콜백에서 연결을 확인한다.-만약 연결이 있고 당신이 광고를받지 못했다면-그것이 두 번 이상 발생한다면, 기회가 당신의 광고가 차단되고 있습니다. 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라고 알려주었습니다. 시장에서 찾을 수 있습니다. 이 앱은 "광고를 제공하는 알려진 호스트 이름에 대한 요청을 무효화"함으로써 작동한다고 말합니다.

광고로 앱으로 수익을 창출하는 경우 시작시이 프로그램을 확인하고 사용자에게 불쾌한 메시지를 표시 한 다음 앱을 종료하는 것이 좋습니다.


첫째, 응용 프로그램과 관련하여 광고 차단이 실제로 불법 복제의 한 형태라고 믿습니다. 이러한 앱은 광고에 의해 지원되며 때로는 광고를 끄거나 기능을 추가 할 수있는 "유료 라이선스"가 있습니다. 광고를 차단함으로써 사용자는 사용중인 앱을 만드는 데 시간이 걸린 개발자로부터 잠재적 인 수익을 훔치고 있습니다.

Anyhow, I want to add a way to help prevent the use of Ad Blockers. I use this method and I do not allow users to use the app if I detect an ad blocker. People get very angry and will give you poor ratings for it. But I also state very clearly in my applications descriptions that you will not be able to use the app if you have an adblocker.

I use the package manager to check if a specific package is installed. While this will not get all of the adblockers, if you keep "up to date" on some of the popular ones, you can get most of them.

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

Give your users a way to use the app without the ads. I personally find ads one of the most annoying things that could possibly happen on my computer, and I will gladly pay for an application if it spares me the insult of having ads thrown into my face. And I'm sure I'm not the only one.


For the case when there is no internet connection, I have followed this tutorial and I've build a "network state listener" like so:

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 and unregisterReceiver have to be called in onResume and onPause respectively, as described here.

In your layout xml set up the AdView and an ImageView of your own choice, like so:

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

Now, whenever the internet connection is available the ad will display and when its off the ImageView will pop-up, and vice-versa. This must be done in every activity in which you want ads to display.


As well as checking if admob can be resolved, what I do is present a page that basically advises that I have detected an adblocker, state that i understand the possible reasons why, then show some inbuilt ads of my own apps and ask for their kind support for continued development. :)


I'm sure this answer won't be entirely popular with certain segments of developers, however consider if you fall into this category that perhaps your app doesn't deserve to exist on the app store. Please note that these are all implementable as code changes, no hackery or spyware like behavior required.

Basically, change the economics of your app. The User is Always Right - this is the attitude taken by one of the most successful advertising companies ever (Google). If your ads are being blocked by users, its because you suck, not because ads or ad-blockers suck.

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

  • Make ads less annoying and in-your-face. Users react to poor/annoying advertisement, and the seedier your app looks and becomes, the more likely they are to ditch it anyways. I don't mind apps with ads in them as long as they aren't significantly impeding the functionality, and even better I like ads which are relevant to me. (http://www.nngroup.com/articles/most-hated-advertising-techniques/)
  • To detect that ads aren't being loaded, its not necessary to implement the spyware like activities mentioned by previous posters. Load an ad that has a confirmation code, and every once in awhile, insert a prompt asking for the confirmation code. The code doesn't have to be long or annoying, in fact it'd be enough to implement a captcha service with 3 or 4 letters/numbers. (http://textcaptcha.com/api)
  • In addition to detecting failure of ads to load, make better ads. Instead of using an API like mobads (Do you even realize how seedy that sounds? Mobs? Really? Are we developers, the Russian Mafia?), enter a partnership with an ad company that allows you to embed ads directly from your app. It will make your overall app larger to install, and no, you can't guard against manual modification, but the changes suggested above don't guard against that either. And this will better support any paid versions of your app, which will be much more lightweight (and faster).
  • Thoroughly vet the ads you are displaying to the user, be open and transparent about your ad policies, and even allow users to inspect your ads and ad sources. The primary reason I'm ever concerned about ads is not because I hate ads, but because I worry that the poor quality developer responsible for this app is letting in viruses or other malware as well. Ask that an exception be made to the installed adblocker. Team up with ad blockers like AdBlock to get on their exceptions list. If you are a legit application, this shouldn't be a problem. (http://www.cio.com/article/699970/6_Ways_to_Defend_Against_Drive_by_Downloads?page=1&taxonomyId=3089)

I re-iterate: all of the above changes are things you can legitimately do in code to prevent anti-ad behaviors. Ads are blocked for security reasons and visceral reactions, primarily, and sometimes bandwidth and performance, so make sure your ads don't invoke any of these problems, at the code level.

Finally I did want to touch on what Borealid said, which I re-iterated above; in the end it is a 'cat and mouse' game, because the user has ultimate authority and responsibility, both legally and morally, over their own property. A user can do whatever, including directly modify code on the fly. Of course, there are restrictions you can implement etc. but there are always ways to get around the problem. This is the ultimate problem (technically) with DRM (which is what you're trying to do). Rather than waste time and effort on this game, it is better to encourage users to keep ads around; they'll become your best, smartest anti-ad-blockers, for free.

참고URL : https://stackoverflow.com/questions/3452907/how-to-prevent-ad-blocker-from-blocking-ads-on-an-app

반응형