Как я могу использовать платную версию своего приложения в качестве «ключа» к бесплатной версии? - PullRequest
53 голосов
/ 17 июня 2010

Скажем, например, что у меня есть какое-то приложение для Android на X. В бесплатной версии есть реклама или базовые функции.Я хочу иметь платную версию, которая удаляет рекламу и добавляет дополнительные функции.

Как использовать платное приложение в качестве «лицензионного ключа» для разблокировки функций в бесплатном приложении?

Таким образом, пользователь установит бесплатное приложение, затем установит платное приложение, чтобы получить дополнительные функции, но он все равно будет запускать бесплатное приложение (которое теперь будет разблокировано).Какой лучший способ сделать это?

Ответы [ 9 ]

37 голосов
/ 18 июня 2010

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

Этот пост может помочь вам найти вашу подпись Определить, было ли приложение загружено с Android Market

20 голосов
/ 28 июня 2011

Я использую это:

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

Это довольно просто и работает.

8 голосов
/ 08 мая 2012

Вот простая функция, которая проверяет наличие 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 .

7 голосов
/ 24 июня 2011

Как заметил кто-то другой, да, вы можете использовать PackageManager для обнаружения присутствия платного «ключевого» приложения, но это проблематично, если кто-то только устанавливает платную версию, удаляет бесплатную версию и т. Д. Пользователи могут раздражаться необходимость сделать около двух загрузок, чтобы ваше приложение работало. FWIW, я думаю, DoubleTwist Air Sync делает это так. Я уверен, что приложение Air Sync ничего не делает, кроме включения функций в бесплатном приложении DoubleTwist.

Более практичный путь может состоять в том, чтобы иметь два отдельных приложения, а затем дать возможность импортировать префы и данные из одного в другое, используя ContentProvider и / или sharedUserId . Затем вы можете поделиться большей частью своего кода с помощью проекта общей библиотеки . Однако это означает, что оба приложения должны использовать разные URI контента, так как два приложения не могут использовать одни и те же права доступа, что является своего рода болью, потому что ваш код общей библиотеки не может просто иметь статический CONTENT_URI или Поле AUTHORITY, которое вы обычно находите в реализации ContentProvider.

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

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

РЕДАКТИРОВАТЬ лицензирование разрешено только для платных приложений (облом), поэтому не стоит предлагать бесплатную версию. Однако биллинг в приложении может быть "правильным" способом управления бесплатной / платной версией. Может быть, это нормально для ОП, но я не чувствую, что требуется, чтобы два приложения всегда были установлены на устройстве пользователя, идеально. Если платящий пользователь устанавливает приложение на новое устройство, представляется возможным загрузить предыдущие транзакции, поэтому им не нужно платить дважды.

3 голосов
/ 17 июня 2010

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

В любом случае, другой поворот этой идеи заключается в том, что вы можете «включить» несколько приложений с одной платой, если пожелаете. Ваше платное приложение будет простой «поддержкой этого разработчика», которое удалит рекламу из всех ваших приложений. Это интересная модель оплаты ИМХО.

1 голос
/ 19 октября 2014

Какой абсолют распространяет только бесплатное / демонстрационное приложение и внедряет в приложение, чтобы сделать его профессионалом? Таким образом, пользователю нужно будет установить только одно приложение, которое сможет протестировать основные функции, и появится кнопка типа «обновить до $ 1,99», которая будет вызывать покупку в приложении.

1 голос
/ 18 июня 2010

Вот один пример того, как это можно сделать:

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), и вам будет хорошо.

0 голосов
/ 26 февраля 2016

Очевидно, я не могу комментировать без 50 репутации, поэтому я добавлю это в свой ответ.

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

Однако - и я не пробовал этого, потому что я еще не опубликовал свое приложение - кажется, что вы можете оставить переменную, которая начинается с false, а затем обновляется до true, если она находит установленную версию Pro. Переменная не вернется к ложному только потому, что версия Pro не существует. Затем вы можете сообщить пользователю в обеих версиях, что ему нужно установить Pro, затем открыть пробную версию и нажать «Разблокировать». Как только это будет сделано, пробная версия станет полной версией и сообщит вам (если обнаружится, что версия 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 установленной до истечения определенного количества часов после этой временной метки, ПОТОМ чтобы они могли удалить ...

0 голосов
/ 17 июня 2010

Путь, по которому большинство разработчиков приложений выбирают этот вариант, заключается в том, чтобы иметь только одну версию приложения, но функции включаются (оплачиваются отдельно) или отключаются (реклама) в зависимости от наличия «лицензионного ключа».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...