簡體   English   中英

如何使用我的應用程序的付費版本作為免費版本的“密鑰”?

[英]How can I use the paid version of my app as a “key” to the free version?

比方說,我有一些做X的Android應用程序。免費版本有廣告或基本功能。 我想要一個支付版本,刪除廣告並添加額外的功能。

如何使用付費應用作為“許可證密鑰”來解鎖免費應用中的功能?

因此,用戶將安裝免費應用程序,然后安裝付費應用程序以獲得額外功能,但他們仍將運行免費應用程序(現在將解鎖)。 這樣做的最佳方法是什么?

使用PackageManager確保已安裝付費軟件包。 並確保您的免費包裹簽名與安裝的高級包裹簽名相匹配 否則,有人可以安裝未簽名的應用程序,其包名稱與您的付費包名稱相匹配,並以這種方式解鎖溢價。

如果從Android電子市場下載應用,此帖子可以幫助您找到您的簽名檢測

我正在使用這個:

PackageManager manager = getPackageManager();
if (manager.checkSignatures("core.package.name", "key.package.name")
    == PackageManager.SIGNATURE_MATCH) {
    //full version
}

它很簡單,很有效。

這是一個簡單的函數,它檢查Pro Key是否存在,並檢查包簽名是否與免費版本匹配:

protected static boolean isProInstalled(Context context) {
    PackageManager manager = context.getPackageManager();
    if (manager.checkSignatures(context.getPackageName(), "com.your.pro.key")
        == PackageManager.SIGNATURE_MATCH) {
        //Pro key installed, and signatures match
        return true;
    }
    return false;
}

代碼來自此論壇帖子 ,基於yoki.org上列出的方法。

正如其他人指出的那樣,是的,您可以使用PackageManager來檢測付費“密鑰”應用程序的存在,但如果有人只安裝付費版本,卸載免費版本等,則會出現問題。用戶可能會因為不得不保持不安而感到惱火大約兩次下載,讓你的一個應用程序工作。 FWIW,我認為DoubleTwist Air Sync就是這樣做的。 我很確定Air Sync應用程序除了在免費的DoubleTwist應用程序中啟用功能外什么都不做。

更實際的路線可能是擁有兩個獨立的應用程序,然后使用ContentProvider和/或sharedUserId將prefs和數據從一個導入到另一個。 然后,您可以使用共享庫項目共享大部分代碼。 然而,這意味着兩個應用程序都需要使用不同的內容URI,因為兩個應用程序不能使用相同的權限,這有點痛苦,因為您的共享庫代碼不能像您一樣擁有靜態CONTENT_URI或AUTHORITY字段通常在ContentProvider實現中找到。

我開始認為兩個單獨的應用程序有兩個或多或少的獨立代碼庫是可行的方法,因為在兩個項目之間復制代碼實際上可能比嘗試維護一個包含各種開關的共享庫以啟用或禁用免費版和付費版之間的功能。

實際上,edgman建議使用單個應用程序並 使用許可證可能是管理應用程序的免費和付費版本的 最佳方式。 它解決了上面列出的所有問題,雖然公平地說我還沒有使用許可證。

EDIT許可似乎只允許付費應用(無賴),所以如果你想提供免費版本,這是不可取的。 但是,應用內結算可能是您管理免費/付費版本的“正確”方式。 也許它對OP來說沒問題,但我覺得不需要總是在用戶的設備上安裝兩個應用程序是理想的。 如果付費用戶在新設備上安裝該應用程序,則似乎可以下載先前的交易,因此他們無需支付兩次。

如果這兩個應用程序都來自同一個開發人員並使用相同的密鑰簽名,則他們應該能夠私下共享信息。 您可以使用一個文件(存儲有MODE_PRIVATE),但我認為最簡單的方法是使用SharedPreferences - 在付費應用中設置一個標志,該標志將由免費的應用程序讀取。 看到 http://developer.android.com/guide/topics/data/data-storage.html 不知道是否容易規避,尤其是在有根設備上......

另一種方法是檢查是否安裝了付費應用程序,例如通過檢查它是否接受特定的意圖。 另見: http//developer.android.com/resources/articles/can-i-use-this-intent.html ; 在那個例子中,他們檢查ZXing的條形碼掃描儀是否可用。

在任何情況下,如果你願意的話,另一個想法是你可以“啟用”只有一個付費的多個應用程序。 您的付費應用將是一個簡單的“支持此開發者”,可以從您的所有應用中刪除廣告。 這是一個有趣的付費模式恕我直言。

什么absolut只分發一個免費/演示應用程序並實現在應用程序中使其成為專業? 因此,只有一個應用程序用戶必須安裝,他們可以測試基本功能,並將有一個按鈕,如“升級到親$ 1,99”,將調用應用程序內購買。

以下是如何完成的一個示例:

Intent unlockerAppPresence = null;
APP_LITE_VERSION = false;
try 
{
    unlockerAppPresence = context.getPackageManager().getLaunchIntentForPackage("nameofthepackagethatunlockyoursoftware");
} 
catch (Exception e1) 
{
    APP_LITE_VERSION  = true;
}
if (unlockerAppPresence == null)
    APP_LITE_VERSION  = true;

將此與檢查應用程序的開發人員簽名(如@Fedor所述)相結合,您應該很高興。

顯然我沒有50的聲譽就不能發表評論,所以我會把它放在自己的答案中。

其他人引用的PackageManager方法似乎是一種不錯的簡單方法,但正如hackbod所提到的,擁有兩個已安裝的應用程序對於用戶而言是令人討厭的(並且有點令人困惑)。

但是 - 我還沒試過這個,因為我還沒有發布我的應用程序 - 看起來你可以保留一個以false開頭的變量,然后如果發現安裝了Pro版本則更新為true。 該變量不會因為Pro版本不存在而恢復為false。 然后,您可以讓用戶知道他們需要安裝Pro的兩個版本,然后打開試用版並單擊解鎖。 完成此操作后,試用版將成為完整版,並通知您(如果找到安裝的Pro版本),您現在可以卸載專業版,並且您將繼續擁有完全訪問權限。

有點像這樣:

String msg = "";
boolean sigMatch = isProInstalled(context);
if (unlocked)
{
    // If you get here by clicking a button that goes away once the app is unlocked, then you may never see this.  Still, better safe than sorry.
    msg += "Thanks!  You already have access to the full game.";
}
else
{
    if (sigMatch)
    {
        unlocked = true;
        saveData(); // I assume you already know how to store variables.
        msg += "Unlock successful.  You now have access to the full game."
    }
    else
    {
        msg += "You are using a Trial version of this game.  (blah, blah).  To unlock the full version, please purchase XYZ Pro.  Install the application and then start this application again and go into this screen again.  You should get a message letting you know that the app has been successfully unlocked, after which you may uninstall the Pro version.  You do not have to keep it on your device after unlocking the game.";
    }
}
if (sigMatch)
{
    msg += "  If you like, you may now uninstall the Pro application.  You will continue to have full access to XYZ.";
}

現在,這無法告訴您用戶是否支付了Pro版本,然后在24小時內返回,因為hackbod也提到了。**但似乎這種情況可能不會經常發生。 如果有人支付然后退回(特別是如果你沒有收費),那么他們可能決定停止使用該應用......或者他們試圖竊取它,在這種情況下還有其他方法可以做到這一點。 如果這種可能性與您有關,那么應用內結算可能是您的最佳選擇。 但是,如果您只是想要一個簡單的措施來阻止臨時用戶,並且您不想強迫他們一直安裝兩個應用程序,那么這可能是一個選項。

**我想你可以保留一個時間戳與另一個變量,並要求用戶保持Pro版本安裝,直到該時間戳后的幾個小時,然后允許他們卸載...

大多數應用程序開發人員采用的路線是只有一個版本的應用程序,但根據“許可證密鑰”的存在啟用(附加)或禁用(廣告)功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM