Подтвердить что ты не робот

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

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

Как я могу использовать платное приложение в качестве "лицензионного ключа", чтобы разблокировать функции в бесплатном приложении?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Здесь простая функция, которая проверяет наличие Pro-ключа и проверяет, соответствует ли подпись пакета свободной версии:

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.

Ответ 4

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

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

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

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

Лицензия EDIT, по-видимому, разрешена только для платных приложений (bummer), поэтому она не работает, если вы хотите предложить бесплатную версию. Однако биллинг в приложении может быть "правильным" способом управления бесплатной/платной версией. Возможно, это нормально для OP, но мне не хочется, чтобы два приложения всегда были установлены на пользовательском устройстве. Если платный пользователь устанавливает приложение на новом устройстве, представляется возможным загрузить предыдущие транзакции, чтобы они не платили дважды.

Ответ 5

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

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

Ответ 6

Что абсолют распространяет только бесплатное/демонстрационное приложение и внедряет в приложение, чтобы сделать его про? Поэтому будет установлен только один пользователь приложения, он может протестировать основные функции, и появится кнопка типа "upgrade to pro 1,99", которая будет вызывать покупку через приложение.

Ответ 7

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

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), и вам должно быть хорошо идти.

Ответ 8

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

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

Однако - и я не пробовал этого, потому что еще не опубликовал мое приложение - кажется, что вы можете сохранить переменную, которая начинается как false, а затем обновляется до true, если она обнаружит установленную версию Pro. Переменная не вернется к false только потому, что версии 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. ** Но похоже, что этот сценарий может не произойти очень часто. Если кто-то заплатил, а затем вернул его (особенно если вы не очень много взимаете плату), они, вероятно, решили прекратить использовать приложение... или они пытаются его украсть, и в этом случае есть другие способы сделать это в любом случае. Если эта возможность относится к вам, то вы можете выбрать In-App Billing. Но если вы ищете только простую меру, чтобы не допустить случайного пользователя, и вы не хотите заставлять их поддерживать все установленные приложения на все время, это может быть вариант.

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

Ответ 9

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