android - ptt - blokada設定




如何防止廣告攔截器阻止應用上的廣告 (10)

我的一個用戶讓貓從袋子裡拿出來告訴我他們正在使用我的一個免費應用程序,這個應用程序通過廣告貨幣化,但是他們用廣告攔截器阻止了廣告。 他們嘲弄地告訴我,好像我對此無能為力。

我能為此做些什麼嗎? 有沒有辦法檢測廣告被阻止?


作為開發人員,我們需要做出與用戶同情的艱難工作,並找到懲罰試圖利用的少數人和遵守規則的許多人之間的中間立場。 移動廣告是允許某人免費使用功能軟件的合理方式。 使用廣告攔截技術的用戶可能會被視為收入損失,但如果您看一下大局,也可以是那些在您喜歡的情況下宣傳您的應用程序的人。 在阻止廣告的系統上運行更溫和的方法是顯示您自己的“住宅”廣告。 創建一個或多個橫幅圖像,並使用相同高度的ImageView (例如50dp)將其顯示在與普通廣告相同的位置。 如果您成功收到廣告,請將ImageView的可見性設置為View.GONE。 您甚至可以創建一個計時器來循環瀏覽多個自家廣告以引起用戶的注意。 點擊您的廣告可以將用戶帶到市場頁面以購買完整版本。


前兩個答案僅幫助您了解阻止廣告的特定(如果可能是最受歡迎的)方法。 Root用戶還可以使用設備上的防火牆阻止廣告。 WiFi用戶可以使用上游防火牆阻止廣告。

我建議:

  1. 不要獎勵廣告攔截用戶。 即使無法加載廣告,也請確保您的佈局保留廣告的部分顯示內容。 或者,如果您有一個可以播放的全屏廣告,請確保即使廣告無法播放,您的應用也會等待一段時間。 如果您使用通知作為廣告(您是渣滓),請在未能獲得此類廣告時通知用戶。 這可能會被視為“惹惱所有用戶”,但您的普通用戶知道他們會得到什麼,並且不希望您的廣告攔截“用戶”。

  2. 讓廣告攔截者停下來。 提供用戶需求的行業利潤越低,行業供應的用戶就越少。 個別開發人員會發現他為其他用戶提供更多資金。 你知道這一點,你告訴他們後你的用戶會認為這很明顯,但這仍然是一個經濟論據 - 它並不直觀。 有一個備用廣告,上面寫著“這是我的工作。如果你不給我付款,我會再收到一個,你就不會從我那裡獲得更多這樣的應用程序。”


您可以查看廣告是否已加載到您的應用中?

廣告攔截器的工作原理是阻止您的應用下載數據。 您可以檢查廣告框架中數據的內容長度,以確保其中包含數據。

如果沒有數據拋出消息並退出或通過電子郵件發出警告。

它可能不像您想像的那麼大,因為只有一小部分人阻止廣告。


您無法做任何事情,您的用戶無法做得更好。

唯一讓人想到的遠程效果就是讓廣告成為程序中不可分割的一部分,這樣如果它們被阻止,用戶就無法理解/與應用程序交互。


我知道廣告攔截的一種方式(實際上在任何計算機上),他們編輯hosts文件以指向所有已知廣告服務器的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)。

我在我的應用程序中執行的操作是檢查此主機文件並查找任何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文件以實現其目標。


我確信這個答案不會完全受到某些開發人員的歡迎,但考慮一下你是否屬於這個類別,或許你的應用程序不應該存在於應用程序商店中。 請注意,這些都可以實現代碼更改,沒有hackery或間諜軟件需要的行為。

基本上,改變你的應用程序的經濟性。 用戶永遠是對的 - 這是有史以​​來最成功的廣告公司之一(Google)採取的態度。 如果您的廣告被用戶阻止,那是因為您很糟糕,而不是因為廣告或廣告攔截器很糟糕。

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(你甚至意識到聽起來多麼骯髒?Mobs?真的嗎?我們是開發人員,俄羅斯黑手黨嗎?),與廣告公司建立合作夥伴關係,允許您直接從您的應用中嵌入廣告。 這將使您的整體應用程序安裝更大,不,您無法防範手動修改,但上面提到的更改也不能防止這種情況。 這將更好地支持您的應用程序的任何付費版本,這將更輕量級(和更快)。
  • 徹底審核您向用戶展示的廣告,對廣告政策保持公開透明,甚至允許用戶檢查您的廣告和廣告來源。 我一直關注廣告的主要原因不是因為我討厭廣告,而是因為我擔心負責此應用的劣質開發人員也會放入病毒或其他惡意軟件。 要求對已安裝的廣告攔截器進行例外處理。 與AdBlock等廣告攔截者合作,以獲取他們的例外列表。 如果您是合法的應用程序,這應該不是問題。 ( http://www.cio.com/article/699970/6_Ways_to_Defend_Against_Drive_by_Downloads?page=1&taxonomyId=3089

我重新迭代:以上所有更改都是您可以在代碼中合法執行的操作以防止反廣告行為。 廣告因安全原因和內心反應而受阻,主要是帶寬和性能,因此請確保您的廣告不會在代碼級別調用任何這些問題。

最後我確實想談談Borealid所說的內容,我在上面重複了一遍; 最終它是一個“貓捉老鼠”遊戲,因為用戶在法律和道德上對自己的財產擁有最終的權力和責任。 用戶可以做任何事情,包括直接修改代碼。 當然,您可以實施限制,但總有辦法解決問題。 這是DRM(技術上)的最終問題(這是您正在嘗試做的事情)。 而不是浪費時間和精力在這個遊戲上,最好是鼓勵用戶保持廣告; 他們將免費成為您最好,最聰明的反廣告攔截器。


我這個問題的代碼是: -

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

希望有所幫助。


為您的用戶提供在沒有廣告的情況下使用該應用的方法。 我個人認為廣告是我計算機上可能發生的最令人煩惱的事情之一,如果它讓我免受廣告投入到我臉上的侮辱,我很樂意為我付費。 我相信我不是唯一一個。


通過廣告,用戶有兩種方式:

1)使用沒有互聯網的應用程序。

2)使用root電話和修改後的主機文件。

我製作了兩個可以實現的工具,請參閱下面的代碼。

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

    }
}

除了檢查admob是否可以解決之外,我所做的是提供一個頁面,它基本上建議我檢測到一個廣告攔截器,說明我可能的原因,然後顯示我自己的應用程序的一些內置廣告並詢問他們的類型支持持續發展。 :)





adblock