Совершение покупок в мобильном приложении в iOS SDK
Отображение пейволов в мобильном приложении — необходимый шаг для предоставления пользователям доступа к премиум-контенту или сервисам. Однако сам по себе показ пейвола поддерживает покупки только в том случае, если экран рендерится самим Adapty — то есть это флоу или пейвол из старого Paywall Builder.
Если вы рендерите экран самостоятельно в собственном коде, для завершения покупки и открытия нужного контента необходимо использовать отдельный метод .makePurchase(). Именно через него пользователи взаимодействуют с пейволами и совершают нужные транзакции.
Если на вашем пейволе есть активный promotional offer для продукта, который пользователь пытается купить, Adapty автоматически применит его в момент покупки.
Имейте в виду, что introductory offer будет применён автоматически только в том случае, если экран отображает Adapty.
В остальных случаях нужно проверить право пользователя на introductory offer на iOS. Пропуск этого шага может привести к отклонению приложения при релизе, а также к списанию полной цены у пользователей, которым доступен introductory offer.
Убедитесь, что вы выполнили начальную настройку, не пропустив ни одного шага. Без неё мы не сможем валидировать покупки.
Совершение покупки
Adapty отображает ваш экран? Для флоу или пейвола, созданного в Paywall Builder, покупки обрабатываются автоматически — этот шаг можно пропустить.
Нужна пошаговая инструкция? Ознакомьтесь с гайдом по быстрому старту — там есть полное описание реализации с контекстом.
Параметры запроса:
| Параметр | Наличие | Описание |
|---|---|---|
| Product | required | Объект AdaptyPaywallProduct, полученный из пейвола. |
Параметры ответа:
| Параметр | Описание |
|---|---|
| Profile | Если запрос выполнен успешно, ответ содержит этот объект. Объект AdaptyProfile предоставляет исчерпывающую информацию об уровнях доступа пользователя, подписках и разовых покупках внутри приложения. Проверьте статус уровня доступа, чтобы убедиться, что пользователь имеет необходимый доступ к приложению. |
Примечание: если вы используете Apple StoreKit версии ниже v2.0 и Adapty SDK версии ниже v2.9.0, вам нужно указать Apple App Store shared secret. Этот метод устарел и больше не рекомендуется Apple.
Продвигаемые встроенные покупки из App Store
Когда пользователь инициирует покупку в App Store и транзакция передаётся в ваше приложение, SDK вызывает метод делегата didReceivePromotedPurchase с объектом AdaptyPromotedProduct. У вас есть два варианта:
- Немедленно обработать транзакцию: Не реализуйте
didReceivePromotedPurchase. Реализация по умолчанию запускает покупку сразу, и экран системы покупок Apple отображается автоматически. - Сохранить объект продукта для последующей обработки: Реализуйте
didReceivePromotedPurchase, сохраните продукт, а затем вызовитеmakePurchaseс сохранённым продуктом позже. Это может быть полезно, если нужно показать пользователю что-то нестандартное перед запуском покупки.
Если продвигаемый продукт содержит предложение подписки, SDK применяет его при покупке автоматически. Предложение считывается из намерения о покупке (App Store purchase intent), которое доступно на iOS 18.0 и выше. На iOS 16.4–17.x subscriptionOffer всегда равно nil, и покупка выполняется по базовой цене.
Полный фрагмент кода:
final class YourAdaptyDelegateImplementation: AdaptyDelegate {
// 1. Store the product object to defer the transaction.
// To process the transaction immediately instead, don't implement this method —
// the default implementation starts the purchase right away.
nonisolated func didReceivePromotedPurchase(_ product: AdaptyPromotedProduct) {
// store the product object
}
// 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate
func continueDeferredPurchase() async {
let storedProduct: AdaptyPromotedProduct = // get the product object from 1.
do {
let purchaseResult = try await Adapty.makePurchase(product: storedProduct)
// process the purchase result
} catch {
// handle the error
}
}
}
API didReceivePromotedPurchase доступен начиная с версии SDK 4.1 и требует iOS 16.4 или новее. SDK версии 4.0 вообще не поддерживает promoted встроенные покупки, а на устройствах ниже iOS 16.4 этот метод никогда не вызывается. Если вам нужны promoted покупки на более ранних версиях iOS, оставайтесь на SDK 3.x и используйте shouldAddStorePayment, как показано ниже.
Используете Adapty SDK 3.x?
В SDK 3.x вместо этого SDK вызывает делегатный метод shouldAddStorePayment:
- Немедленно обработать транзакцию: Верните
trueвshouldAddStorePayment. Это немедленно запустит экран покупки Apple. - Сохранить объект продукта для последующей обработки: Верните
falseвshouldAddStorePayment, затем позднее вызовитеmakePurchaseс сохранённым продуктом.
final class YourAdaptyDelegateImplementation: AdaptyDelegate {
nonisolated func shouldAddStorePayment(for product: AdaptyDeferredProduct) -> Bool {
// 1a.
// Return `true` to continue the transaction in your app. The Apple purchase system screen will show automatically.
// 1b.
// Store the product object and return `false` to defer or cancel the transaction.
false
}
// 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate
func continueDeferredPurchase() async {
let storedProduct: AdaptyDeferredProduct = // get the product object from 1b.
do {
try await Adapty.makePurchase(product: storedProduct)
} catch {
// handle the error
}
}
} Активация промокодов в iOS
Об offer-кодах
Offer-коды позволяют предоставлять скидки или бесплатные пробные периоды конкретным пользователям. В отличие от обычных предложений, которые применяются автоматически, offer-коды распространяются за пределами приложения — через email-рассылки, соцсети или печатные материалы. Пользователи активируют их, вводя код в App Store, переходя по ссылке для активации или через диалог внутри приложения.
Чтобы настроить offer-коды, откройте подписку в App Store Connect и перейдите в раздел Offer Codes. Вы можете создать три вида offer-кодов:
- Free — подписка бесплатна в течение заданного срока, следующее продление — по полной цене.
- Pay as you go — пользователь платит сниженную цену за каждый расчётный период в течение заданного срока, затем подписка продлевается по полной цене.
- Pay up front — пользователь единовременно платит сниженную цену за весь срок предложения, затем подписка продлевается по полной цене.
Добавлять offer-коды в Adapty не нужно. Apple помечает каждую транзакцию в течение периода предложения категорией offer-кода. Это касается как первоначальной активации, так и всех последующих продлений со скидкой. Adapty обнаруживает метку и записывает каждую транзакцию с категорией предложения offer_code. Когда период предложения заканчивается и подписка продлевается по полной цене, метка больше не проставляется. Вы можете фильтровать аналитику по типу предложения Offer Code в дашборде Adapty.
Устранение расхождений в выручке
Если транзакция по offer-коду отображается в Adapty по полной цене продукта вместо сниженной, проверьте следующее в App Store Connect:
- Для offer-кода настроены корректные цены для всех регионов, где пользователи могут его активировать.
- Цена предложения задана для конкретной страны или региона пользователя. Apple передаёт региональную цену в транзакции. Если для предложения не указана региональная цена, Apple может передать полную цену продукта.
Вы можете фильтровать и проверять транзакции по offer-кодам в дашборде Adapty с помощью фильтров по типу предложения Offer Code и Offer Discount Type.
Устаревшие промокоды (deprecated)
Apple отказалась от промокодов для встроенных покупок в марте 2026 года. Offer-коды заменяют их с расширенными возможностями: настраиваемые условия применения, сроки действия и до 1 миллиона кодов в квартал. Если вы ранее использовали промокоды для встроенных покупок, перейдите на offer-коды в App Store Connect.
Устаревшие промокоды (не более 100 на приложение на версию) предоставляли бесплатный доступ к подписке. В отличие от offer-кодов, Apple не включала информацию о скидке в транзакции по промокодам — в чеке передавалась полная цена продукта. В результате Adapty записывал эти транзакции по полной цене, что приводило к расхождениям в выручке между аналитикой Adapty и App Store Connect.
Если вы видите исторические транзакции по полной цене, которые должны были быть бесплатными, скорее всего, они относятся к устаревшим промокодам. Поскольку такие коды теперь устарели, переходите на offer-коды для точного учёта выручки.
Чтобы отобразить экран активации промокода в вашем приложении:
Adapty.presentCodeRedemptionSheet()
По нашим наблюдениям, экран активации промокода (Offer Code Redemption) в некоторых приложениях работает ненадёжно. Мы рекомендуем перенаправлять пользователя напрямую в App Store.
Для этого откройте URL в следующем формате:
https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}