App Store поддерживает множество способов монетизации приложений. У вас есть широкий выбор вариантов, от предварительной оплаты приложения до регулярных подписок.
Подписки обычно используются, когда пользователи платят на регулярной основе, например, за доступ к премиум-функциям, постоянно обновляемому контенту или услугам, которые поддерживаются непрерывно.
В этом руководстве мы рассмотрим, как начать работу с подписками с помощью StoreKit 2. Вы создадите группу подписок с несколькими вариантами подписки и представите собственный магазин подписок Apple внутри своего приложения.
Цель этого руководства — помочь вам создать, настроить и протестировать встроенные покупки подписок в App Store Connect через Xcode. В конце вы реализуете полную систему покупок по подписке с использованием StoreKit 2.
Перед началом работы
Для успешного выполнения этого руководства полезно иметь базовые знания Xcode и SwiftUI, хотя предварительные знания StoreKit не требуются.
Сначала создайте новый проект, назовем его PhotoEditor. Теперь добавьте новую папку под названием Store. Здесь будут храниться все ваши файлы управления покупками. В iOS Apple предоставляет вам фреймворк StoreKit. Это фреймворк, который предоставляет все необходимое для продажи контента в ваших приложениях с помощью встроенных покупок. Чтобы StoreKit знал о доступных встроенных покупках в вашем приложении, вам нужен файл конфигурации StoreKit.
Для этого руководства не требуется никаких дополнительных ресурсов или стартовых проектов.
Шаг 1 – Создание файла конфигурации StoreKit
Выберите «Создать файл из шаблона», затем найдите «StoreKit» в строке поиска в правом верхнем углу. В нашем примере мы выбираем имя PhotoEditor.storekit. Убедитесь, что не выбрана опция «Синхронизировать этот файл с приложением в App Store Connect». Она не нужна для локального тестирования, а её включение только усложняет процесс.
После создания файла нажмите кнопку «+» в левом нижнем углу, а затем выберите «Add Subscription Group» из всплывающего меню. Теперь вам нужно присвоить вашей новой группе подписок «Reference Name», которое является простым и понятным именем, чтобы вы могли легко идентифицировать группу позже. Вы можете ввести «PhotoEditor Plus», поскольку эта группа подписок будет содержать все варианты подписки для PhotoEditor+.
Далее выберите группу подписок, снова нажмите кнопку «+», а затем выберите «Add Auto-Renewable Subscription» из всплывающего меню. Теперь вам нужно присвоить вашей первой подписке «Reference Name». Вы можете выбрать «PhotoEditor Plus Monthly», поскольку это будет ежемесячный вариант. Вам также необходимо добавить «Product ID», который должен быть уникальным во всем App Store — аналогично тому, как работает идентификатор пакета вашего приложения. Хорошее эмпирическое правило — взять идентификатор пакета вашего приложения и добавить к нему еще один компонент, например, .Plus.Monthly.
Теперь повторите тот же шаг и добавьте вторую автоматически продлеваемую подписку в ту же группу подписок. Выберите «PhotoEditor Plus Yearly» в качестве имени ссылки. В качестве «Product ID» вы снова берете идентификатор пакета вашего приложения и добавляете еще один компонент, например, .Plus.Yearly.
Теперь вы успешно создали группу с двумя подписками. Последнее, что вам нужно сделать, чтобы показать это как опцию пользователю в вашем приложении, — это установить «Отображаемое имя» и «Описание». Для группы подписок я выбираю «PhotoEditor+» в качестве отображаемого имени и «Экспортируйте столько фотографий, сколько хотите» в качестве описания. Для ежемесячной подписки я выбираю «PhotoEditor+ Monthly» в качестве отображаемого имени и «Экспортируйте столько фотографий, сколько хотите» в качестве описания. Для годовой подписки я выбираю «PhotoEditor+ Annual» в качестве отображаемого имени и «Экспортируйте столько фотографий, сколько хотите» в качестве описания.
Шаг 2 – Отображение подписок в ContentView
Теперь вы можете перейти в файл ContentView.swift, удалить все лишнее и добавить этот блок кода.
// 1
import StoreKit
import SwiftUI
struct ContentView: View {
// 2
@State private var showSubscriptionStore: Bool = false
var body: some View {
// 3
Button {
showSubscriptionStore.toggle()
} label: {
Text("Subscribe to PhotoEditor+")
}
// 4
.buttonStyle(.borderedProminent)
// 5
.sheet(isPresented: $showSubscriptionStore) {
SubscriptionStoreView(groupID: "4C765C93")
}
}
}
- Для доступа к представлениям StoreKit, таким как
SubscriptionStoreView, требуетсяimport StoreKit. - Свойство state управляет отображением окна магазина подписок.
- Кнопка запускает отображение магазина подписок.
- Выразительный стиль кнопки делает призыв к действию хорошо видимым.
SubscriptionStoreView(groupID: ...)отображает все подписки, принадлежащие указанной группе подписок.
Шаг 3 – Подключение файла конфигурации StoreKit
Когда холст предварительного просмотра справа завершит перерисовку, вы увидите, что ваши подписки не отображаются, даже несмотря на то, что вы правильно передали идентификатор группы подписок в SubscriptionStoreView. Это происходит потому, что ваше приложение еще не знает, что у вас есть локальный файл конфигурации StoreKit, где определена группа подписок и ее подписки. Вместо этого оно пытается загрузить подписки из App Store Connect, где их еще нет, поэтому отображается представление-заполнитель.
Чтобы исправить это, нажмите на PhotoEditor на верхней панели, а затем выберите «Edit Scheme». В «Options» вы найдете выпадающее меню «StoreKit Configuration», где можно выбрать созданный ранее файл конфигурации. Если закрыть окно и вернуться к предварительному просмотру, ваши подписки должны автоматически отобразиться с их названиями, описаниями и ценами.
Шаг 4 – Тестирование подписки на устройстве
Теперь вы можете запустить приложение на своем устройстве, чтобы протестировать подписку. При нажатии на кнопку «Подписаться на PhotoEditor+» появится окно магазина подписок с доступными вариантами подписки.
Если вы выберете одну из подписок и нажмете кнопку «Подписаться», появится стандартная форма оплаты, в которой будет указано, что с вас не будет взиматься плата и что это только для целей тестирования.
После подтверждения покупки появляется еще одно диалоговое окно, подтверждающее успешное оформление подписки.
При повторном запуске приложения на вашем устройстве вы заметите, что подписка теперь помечена как активная. Если вы хотите протестировать различные сценарии, вам, вероятно, понадобится возможность сбросить состояние подписки. Одним из решений может быть удаление и повторная установка приложения. Но это не очень удобно делать каждый раз, когда вы хотите протестировать что-то, что вы изменили. К счастью, Xcode включает в себя удобный инструмент для проверки и управления всеми транзакциями StoreKit, совершаемыми в вашем приложении. Он находится в меню «Debug». Вам нужно выбрать «StoreKit», а затем нажать «Manage Transactions».
Откроется новое окно, где вы увидите ваше устройство и приложение «PhotoEditor» справа. При нажатии на него все транзакции подписки будут отображены в центральной части. Если вы выберете одну из подписок, вы сможете увидеть более подробную информацию слева.
Выберите подписку и используйте доступные действия для ее аннулирования, отмены или возврата средств. Это сбросит состояние подписки вашего приложения, чтобы вы могли снова протестировать процесс. Особенно при тестировании подписок, синхронизированных с App Store Connect, этот инструмент становится незаменимым для быстрого переключения между различными состояниями подписки.
Шаг 5 – Создание подписки в App Store Connect
После завершения локального тестирования пришло время создать реальные подписки в App Store Connect.
Откройте App Store Connect, перейдите к своему приложению и в раздел «Subscriptions».
Здесь вам нужно повторить все те же шаги по созданию подписок, что вы делали в Xcode — создать группу, создать подписки и т.п.
Шаг 6 – Возвращаемся к продуктам App Store Connect
Теперь ваши подписки готовы к использованию в вашем приложении. Для этого нажмите на PhotoEditor в верхней панели, а затем выберите «Edit Scheme». В разделе «Options» вы найдете выпадающее меню рядом с «Конфигурация StoreKit», где снова выберите «Нет». С этого момента ваше приложение будет загружать продукты подписки непосредственно из App Store Connect, а не из локального файла конфигурации StoreKit.
Теперь вы можете снова запустить приложение и протестировать подписки, загруженные из App Store Connect. Как и при локальном тестировании подписок, во время тестирования никаких реальных платежей взиматься не будет.
Итоговый результат
Вот и все, теперь вы знаете, как настроить и протестировать покупки подписок внутри приложения с помощью StoreKit 2. Мы начали с локальной конфигурации StoreKit в Xcode, создали группу подписок с несколькими вариантами подписки и безопасно протестировали процесс подписки на устройстве без каких-либо платежей. Затем мы перешли к App Store Connect, воссоздали там те же подписки, назначили цены, добавили локализацию и переключили приложение на загрузку продуктов непосредственно из App Store Connect.
Рабочий процесс, начинающийся с использования локальной конфигурации StoreKit, а затем дублирования настройки в App Store Connect, является основой для любой системы монетизации на основе подписок, которую вы будете создавать в будущем. Как только вы поймете, как эти компоненты взаимодействуют, работа с подписками станет гораздо более предсказуемой.
С этим вы можете начать расширять свои предложения по подпискам и совершенствовать ценообразование и представление. И самое лучшее — ничего из этого не требует сложной работы на бэкэнде. StoreKit предоставляет вам все необходимое для начала работы.

