@man_without_face
студент

Как поддерживать две версии приложения (платная и бесплатная)?

Делаю приложение и хочу выставлять две версии: платную и бесплатную. Но как их поддерживать? Т.е. репозитория делать два или один? Если один, то придётся делать какие-то вставки, типа если бесплатно, то эту штуку показываем, а если платно, то нет. Если же два, то тогда выходит что копировать куски кода придётся из одной в другую.

А как вы поступаете?
  • Вопрос задан
  • 1747 просмотров
Пригласить эксперта
Ответы на вопрос 9
onqu
@onqu
weasy
Конечно, можно использовать 2 ветки, конечно, можно делать все в одной ветке и понатыкать везде #ifdef FOR_NISCHEBROD, FOR_REGULAR_CLIENT, FOR_RICH_ONE, конечно, можно расставить тэги, чтобы было проще искать эти места в будущем.

Но, при увеличении объема логики придется прибегнуть к использованию шаманского бубна, ритуалу выстрела в свою ногу и мольбы праотцам. Добавлять/править логику в этих кусках будет очень непросто.

Другой вариант.
Делать приложение модульным, где основное приложение является лишь каркасом с базовой функциональностью, лежит в отдельной репе, тестируется отдельно от всего, и где модули это подключаемые расширения (Компоненты, DLC, LIB, Whatever), у которых есть API интерфейс для расширения функциональности основного приложения, и каждый лежит в своей репе.
Более того, их можно будет тестировать, как вкупе, так и отдельно от основного приложения. При сборке указываем только требуемые расширения. Нэкст лэвэл - подключать расширения динамически, то есть без сборки с приложением.
Ответ написан
@Tiberal
Одна ветка, но разные product flavors в билде. Изменяете какие то куски кода для разных флейворов. Так можно в одном проекте поддерживать и демо и платную версию
developer.android.com/intl/ru/tools/building/confi...
тут расписано все
Ответ написан
begemot_sun
@begemot_sun
Программист в душе.
Можно использовать 2 ветки в репозитории:
master, master2.

Но.

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

Т.е нужна платная версия - выставил опцию - получил платную.
Нужна бесплатная - выставил опцию - получил бесплатную.
Соответственно тестировать придется 2 версии одновременно.
Ответ написан
onepavel
@onepavel
Консультация и разработка мобильных приложений
У тебя одна ветка кода в репозитарии, один проект.
С помощью Gradle и productFlavors отделяешь платный
функционал от общего кода.
Пример разделения
https://github.com/bmuschko/gradle-android-example...
www.vogella.com/tutorials/AndroidBuild/article.html
www.sajmons.com/news/gradlebuildwithfreeandpaidflavors
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Достаточно использовать один репозиторий с подключением разных библиотек/модулей (с вынесенным/разделённым функционалом) к ядру (основная логика) при компиляции версий.
Ответ написан
Комментировать
zo0m
@zo0m
full stack developer
Вам выше предложили много хороших вариантов, лично я бы использовал все-таки банальный IF
это самый "дешевый" и простой вариант, и не нужно боятся что у вас будет рости количество кейсов, которые вы будете так же решать, ведь количество вариантов приложения вряд ли будет сильно расти.
Мой опыт таков: я пишу кроссплатформенные приложения, и у меня в коде переодически нужно дергать разное нативное АПИ, поэтому приходится вставлять if OS_ANDROID, if OS_IOS и т.п. никаких проблем или неудобств не испытываю. А в оверинжиниринге нет ничего хорошего.

В дополнение дополню еще одним вариантом(именно из разряда перемудрить):
ACL
т.е. вместо IF в коде
у вас будет один метод, вначале какого-то "ограниченного" вызова:
openView = function(viewName, params) {
    try {
      acl.checkAccess(user/system/status/type_of_app) // бросает эксепшен, поэтому можно удобно втыкать где угодно

      rootView = new View()
      if acl.hasAccess("pay_app")
          rootView.add(new Button("HD Quality"))
      ....
    } catch (ACLException e) {
           if (e.code = ACL_PAYMENT_CODE) {
                  showUserMessage("Это премиум контент, вам необходимо купить ... ")
           } else {
                  ...
           }
    }
}

дальше варианты на свой вкус,
например если авторизация не прошла, то метод бросит эксепшн
или джаваскрипт стайл, завернуть это в промис, или анонимную функцию

и например в зависимости от этих проверок рисоваться будет интерфейс, запускаться функции, лиснеры
единственно, чтобы этим делом управлять хоть "на лету" или "из админки", нужно будет организовать "секьюрити матрицу", грубо говоря такого типа:
_____________________| BUTTON_1 | VIEW_1 | VIEW_LOADING |
user_1(admin)............| default | enable | default
user_2...........................| hidden | default | default
pay_app.......................| default | enable | default
free_app......................| default | disable | default
status_loading..........| default | default | show

На мой взгляд - это не лучший вариант, это для проектов с большим количеством сущностей такое внедняют. Но может натолкнет на интересные мысли.
Ответ написан
Комментировать
@shomishinec
Software Developer
Вроде бы это называется Build Variants , не ?
Ответ написан
Комментировать
Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...
Обычно, платное от бесплатного отличается отдельными функциями (как раз теми которые платные). Так, что просто каждую функцию делаешь отдельным файлом (библиотекой, модулем и т.п. смотря на чем делается твое приложение). Далее делается командный файл который все это собирает (компилирует) в единое или платное или наоборот. Само собой во всех местах базового функционала, в которых может происходит вызов функционала платного, надо ставить проверки на их наличие, и буде их нет призывать перейти на платную версию.
Ответ написан
Комментировать
@kaftanati
Инженер-энтузиаст
Если Pro-функционал может быть разблокирован тем же InApp-ом, то однозначно в обеих версиях должен быть код и для Lite, и для Pro. Поэтому отключение Pro функционала по ключу, доступному после разблокировки - самый простой вариант. В качестве заглушки для Lite-пользователя имеет смысл показывать отдельный экран списка всех заблокированных возможностей, объяснения "что вы тоже есть хотите" и т.п. с большой кнопкой "Разблокировать".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы