Скажем, например, что у меня есть какое-то приложение для Android, которое поддерживает X. В бесплатной версии есть реклама или основные функции. Я хочу иметь платную версию, которая удаляет рекламу и добавляет дополнительные функции.
Как я могу использовать платное приложение в качестве «лицензионного ключа», чтобы разблокировать функции бесплатного приложения?
Таким образом, пользователь установит бесплатное приложение, затем установит платное приложение, чтобы получить дополнительные функции, но он все равно будет запускать бесплатное приложение (которое теперь будет разблокировано). Какой лучший подход к этому?
user396 17 июн ’10 в 15:13 2010-06-17 15:13
2010-06-17 15:13
9 ответов
Используйте PackageManager, чтобы убедиться, что ваш платный пакет установлен. И убедитесь, что ваша подпись бесплатного пакета соответствует установленной подписи премиум-пакета. В противном случае кто-то сможет установить неподписанное приложение с именем пакета, совпадающим с именем платного пакета, и разблокировать премиум таким образом.
Где брать софт для macOS
user95313 18 июн ’10 в 13:27 2010-06-18 13:27
2010-06-18 13:27
Я использую это:
PackageManager manager = getPackageManager(); if (manager.checkSignatures(«core.package.name», «key.package.name») == PackageManager.SIGNATURE_MATCH) < //full version >
Это довольно просто, и это работает.
user560358 28 июн ’11 в 15:12 2011-06-28 15:12
2011-06-28 15:12
Вот простая функция, которая проверяет наличие 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.
user663469 07 май ’12 в 22:59 2012-05-07 22:59
2012-05-07 22:59
Как заметил кто-то другой, да, вы можете использовать PackageManager для обнаружения наличия платного «ключевого» приложения, но это проблематично, если кто-то только устанавливает платную версию, удаляет бесплатную версию и т. Д. Пользователи могут раздражаться из-за необходимости сохранять около двух загрузок, чтобы ваше приложение работало. FWIW, я думаю, что DoubleTwist Air Sync делает это таким образом. Я уверен, что приложение Air Sync ничего не делает, кроме включения функций в бесплатном приложении DoubleTwist.
Более практичный путь может состоять в том, чтобы иметь два отдельных приложения, а затем дать возможность импортировать префы и данные из одного в другое, используя ContentProvider и / или sharedUserId. Затем вы можете поделиться большей частью своего кода с помощью проекта общей библиотеки. Однако это означает, что оба приложения должны использовать разные URI контента, поскольку два приложения не могут использовать одни и те же права доступа, что является проблемой, потому что код вашей общей библиотеки не может просто иметь статическое поле CONTENT_URI или AUTHORITY, как вы обычно находят в реализации ContentProvider.
Полезный софт для вашего MacBook!
Я начинаю думать, что два отдельных приложения с двумя более или менее отдельными кодовыми базами — это путь, потому что копирование кода между двумя проектами может быть проще, чем попытка поддерживать общую библиотеку со всеми видами переключателей для включения или отключения. особенности между бесплатной и платной версией.
На самом деле, рекомендация edgman по использованию одного приложения и лицензированию, вероятно, является наилучшим способом управления бесплатной и платной версией приложения. Это решает все проблемы, перечисленные выше, хотя, если честно, я еще не использовал лицензирование.
Лицензирование EDIT, по-видимому, разрешено только для платных приложений (облом), поэтому не стоит предлагать бесплатную версию. Однако биллинг в приложении может быть «правильным» способом управления бесплатной / платной версией. Может быть, это нормально для OP, но я не чувствую, что идеально, когда требуется всегда устанавливать два приложения на устройстве пользователя. Если платящий пользователь устанавливает приложение на новое устройство, представляется возможным загрузить предыдущие транзакции, поэтому им не нужно платить дважды.
Источник: stackru.com
Как установить платную версию программы
Для перехода на платную программу «Лаборатории Касперского» вам нужно купить лицензию для выбранной программы.
Если вы купили лицензию на Kaspersky Internet Security, Kaspersky Anti-Virus или Kaspersky Total Security, выполните следующие действия:
- Скопируйте код активации из письма, которое мы отправили вам на электронную почту.
- Откройте главное окно программы Kaspersky Free.
- По ссылке Лицензия в правом нижнем углу программы перейдите в окно Лицензирование .
- В окне Лицензирование нажмите на кнопку Ввести код активации .
- Вставьте код активации и нажмите на кнопку Активировать .
Будет автоматически выполнен переход на платную программу «Лаборатории Касперского».
Если вы купили подписку на Kaspersky Security Cloud, выполните следующие действия:
- Следуйте инструкциям в письме, которое мы отправили вам на электронную почту.
- Скачайте и установите программу Kaspersky Security Cloud.
- Войдите в учетную запись My Kaspersky.
Будет автоматически выполнен переход на Kaspersky Security Cloud.
Источник: support.kaspersky.com
Как я могу использовать платную версию своего приложения в качестве «ключа» к бесплатной версии?
Скажем, например, что у меня есть приложение для Android, которое делает X. В бесплатной версии есть объявления или основные функции. Я хочу иметь платную версию, которая удаляет рекламу и добавляет дополнительные функции. Как я могу использовать платное приложение в качестве «лицензионного ключа», чтобы разблокировать функции в бесплатном приложении? Таким образом, пользователь установит бесплатное приложение, а затем установит платное приложение, чтобы получить дополнительные функции, но они все равно будут запускать бесплатное приложение (которое теперь будет разблокировано). Какой лучший подход к этому?
Bryan Denny 17 июнь 2010, в 17:42
Поделиться
Зачем это делать? Если бесплатная версия будет иметь те же функции, что и платная, когда она разблокирована, то вы также можете просто использовать одно приложение, потому что в противном случае у вас было бы два приложения, которые выполняют одно и то же.
JAB 17 июнь 2010, в 17:53
Bryan Denny 17 июнь 2010, в 18:09
О, я вижу. Теперь я понимаю.
JAB 17 июнь 2010, в 18:21
Это означает, что пользователю потребуется установить как бесплатное, так и платное приложение, что довольно неприятно для тех, кто знает, что он просто хочет купить приложение. Я действительно рекомендовал бы против этого.
hackbod 17 июнь 2010, в 19:42
Bryan Denny 17 июнь 2010, в 20:23
Вы не можете предположить, что они начали с бесплатной версии. Поскольку у нас есть 24-часовой период возврата, люди часто могут свободно покупать полную версию, если они хотят опробовать ее, прежде чем решат связать ее.
hackbod 18 июнь 2010, в 19:54
(Кроме того, мы надеемся, что люди полюбят ваше программное обеспечение, и это даст вам все больше людей, которые достаточно доверяют вам, чтобы автоматически покупать что-то новое у вас, не испытывая его.)
hackbod 18 июнь 2010, в 19:56
Показать ещё 5 комментариев
Поделиться:
9 ответов
Используйте PackageManager для обеспечения установки вашего платного пакета. И убедитесь, что в ваших бесплатных подписях подпадает подпись пакета премиум-пакета. В противном случае кто-то сможет установить неподписанное приложение с именем пакета, соответствующим имени вашего платного пакета, и разблокировать премию таким образом.
Fedor 18 июнь 2010, в 15:19
Поделиться
Хорошая точка зрения. Спасибо за это предложение.
Bryan Denny 18 июнь 2010, в 13:43
Подпись — самая важная вещь. Это сделает невозможным подделку ключа без хранилища ключей, с которым вы подписываете приложение.
Janusz 18 июнь 2010, в 14:02
Я реализовал это, но учтите, что, если пользователь не платит за лицензию APK? Все, что им нужно сделать, — это найти пиратскую копию и установить ее, здесь нет никакого лицензирования . Как вы справляетесь с этим?
AutoM8R 05 янв. 2013, в 07:16
Существует метод: PackageManager.getInstallerPackageName (String packageName) ( developer.android.com/reference/android/content/pm/… ). С помощью этого метода вы можете проверить, какое приложение установлено по указанному packageName. Название пакета Google Play — com.android.vending
franta kocourek 22 апр. 2014, в 15:15
Показать ещё 2 комментария
Я использую это:
PackageManager manager = getPackageManager(); if (manager.checkSignatures(«core.package.name», «key.package.name») == PackageManager.SIGNATURE_MATCH) < //full version >
Это довольно просто и работает.
David Vávra 28 июнь 2011, в 16:11
Поделиться
Что это делает, если пакет ключей не установлен? Возвращает ли оно значение, повторяющее эти строки, или выдает исключение?
eidylon 25 янв. 2012, в 21:35
Когда пакет ключей не установлен, подписи не совпадают.
David Vávra 26 янв. 2012, в 15:18
Круто . было интересно, нужно ли его оборачивать в блок try. catch чтобы поймать этот экземпляр или нет. Похоже, нет. Спасибо!
eidylon 26 янв. 2012, в 16:28
Показать ещё 1 комментарий
Здесь простая функция, которая проверяет наличие 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.
David 07 май 2012, в 23:05
Поделиться
Как заметил кто-то другой, да, вы можете использовать PackageManager для обнаружения присутствия платного «ключа», но это проблема, если кто-то только устанавливает платную версию, удаляет бесплатную версию и т.д. Пользователи могут раздражаться чтобы сохранить одно приложение, чтобы обойти две загрузки. FWIW, я думаю, DoubleTwist Air Sync делает это так. Я уверен, что приложение Air Sync ничего не делает, кроме возможности включить функциональность в бесплатном приложении DoubleTwist.
Более практичный маршрут может состоять в том, чтобы иметь два отдельных приложения, а затем дать возможность импортировать префы и данные от одного к другому с помощью ContentProvider и/или sharedUserId. Затем вы можете поделиться большей частью своего кода с помощью проекта общей библиотеки. Однако это означает, что обе приложения должны использовать другой URI контента, поскольку два приложения не могут использовать один и тот же авторитет, что является своего рода болью, потому что ваш код общей библиотеки не может иметь только статический CONTENT_URI или AUTHORITY, как вы обычно находите в реализации ContentProvider.
Я начинаю думать, что два отдельных приложения с двумя более или менее раздельными кодовыми базами — это путь, потому что копирование кода между двумя проектами может быть проще, чем попытка поддерживать общую библиотеку со всеми типами переключателей для включить или отключить функции между бесплатной и платной версией.
На самом деле, рекомендация edgman для использования одного приложения и с использованием лицензирования, вероятно, является лучшим способом чтобы управлять бесплатной и платной версией приложения. Он решает все перечисленные выше проблемы, хотя, честно говоря, я еще не использовал лицензирование.
Лицензия EDIT, по-видимому, разрешена только для платных приложений (bummer), поэтому она не работает, если вы хотите предложить бесплатную версию. Однако биллинг в приложении может быть «правильным» способом управления бесплатной/платной версией. Возможно, это нормально для OP, но мне не хочется, чтобы два приложения всегда были установлены на пользовательском устройстве. Если платный пользователь устанавливает приложение на новом устройстве, представляется возможным загрузить предыдущие транзакции, чтобы они не платили дважды.
thom_nic 24 июнь 2011, в 15:36
Поделиться
Этот ответ очень старый, но с течением времени биллинг приложений для разблокировки профессиональных функций в бесплатном приложении теперь определенно является правильным способом решения этой проблемы. Несколько версий вашего приложения (платная и бесплатная) просто приводят к разделению показателей загрузки и головной боли для пользователей, которые хотят перейти на платную версию. Предложите разблокировку про-версии в вашем приложении!
thom_nic 26 июнь 2017, в 16:20
Это было бы неплохо, за исключением того факта (пожалуйста, исправьте меня, если не так!), Что невозможно загрузить бесплатное приложение, которое использует LVL. (Я бы хотел сделать это иначе.) ТАК, нет проверки лицензии Google Play .
Photovore 28 авг. 2017, в 00:18
Если оба приложения принадлежат одному разработчику и подписываются одним и тем же ключом, они должны иметь возможность обмениваться конфиденциальной информацией. Вероятно, вы можете использовать файл (хранящийся в 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 таким образом.
В любом случае, другой поворот в идее состоял бы в том, что вы могли бы «включить» несколько приложений с оплатой только одной, если хотите. Ваше платное приложение будет простым «поддержкой этого разработчика», которое удалит объявления из всех ваших приложений. Это интересная платная модель ИМХО.
Joubarc 17 июнь 2010, в 19:49
Поделиться
Брайан, спасибо за редактирование ссылки в!
Joubarc 18 июнь 2010, в 04:41
Я думаю, что хранить флаг в любом файле ресурсов не очень хорошая идея; люди смогут получить к нему доступ на рутированных устройствах, поэтому до декомпиляции приложения, изменения флага и распространения приложения в измененном виде в Интернете будет только вопрос времени — ваши деньги
slinden77 22 дек. 2012, в 09:06
Ну, я говорю , что понятия не имел , если бы легко обойти, особенно на укорененных устройств . но да, вероятно , лучше всего предположить , что это на самом деле очень легко сделать.
Joubarc 22 дек. 2012, в 19:50
Я пропустил эту часть 🙂 Но да, это очень просто, даже люди без навыков программирования смогут это сделать
slinden77 22 дек. 2012, в 21:22
Показать ещё 2 комментария
Что абсолют распространяет только бесплатное/демонстрационное приложение и внедряет в приложение, чтобы сделать его про? Поэтому будет установлен только один пользователь приложения, он может протестировать основные функции, и появится кнопка типа «upgrade to pro 1,99», которая будет вызывать покупку через приложение.
almisoft 19 окт. 2014, в 09:50
Поделиться
В настоящее время покупки в приложении определенно будут работать. Этот вопрос датирован до того, как IAP были доступны в то время.
Bryan Denny 20 окт. 2014, в 14:21
Вот пример того, как это можно сделать:
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;
Bryan Denny 18 июнь 2010, в 14:59
Поделиться
По-видимому, я не могу комментировать без 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)
Теперь это не может сказать вам, заплатил ли пользователь за версию Pro, а затем возвратил его в течение 24 часов, так как упоминается hackbod. ** Но похоже, что этот сценарий может не произойти очень часто.
Если кто-то заплатил, а затем вернул его (особенно если вы не очень много взимаете плату), они, вероятно, решили прекратить использовать приложение. или они пытаются его украсть, и в этом случае есть другие способы сделать это в любом случае. Если эта возможность относится к вам, то вы можете выбрать In-App Billing. Но если вы ищете только простую меру, чтобы не допустить случайного пользователя, и вы не хотите заставлять их поддерживать все установленные приложения на все время, это может быть вариант.
** Я полагаю, вы могли бы сохранить временную метку с другой переменной и потребовать от пользователя, чтобы версия Pro была установлена до некоторого количества часов после этой отметки времени, затем разрешите их удалить.
Источник: overcoder.net