Совершение покупок в мобильном приложении с iOS SDK

Отображение пейволов в мобильном приложении — обязательный шаг для предоставления пользователям доступа к премиум-контенту или сервисам. Однако простого показа пейволов достаточно для поддержки покупок только в том случае, если вы используете Paywall Builder для их настройки. Если вы не используете Paywall Builder, для совершения покупки и открытия нужного контента необходимо использовать отдельный метод .makePurchase(). Он служит точкой входа для пользователей: через него они взаимодействуют с пейволами и совершают нужные транзакции.

Если для продукта, который пользователь хочет купить, на пейволе активен promotional offer, Adapty автоматически применит его в момент покупки.

Обратите внимание: introductory offer применяется автоматически только при использовании пейволов, настроенных в Paywall Builder. В остальных случаях нужно проверить право пользователя на introductory offer на iOS. Пропуск этого шага может привести к отклонению приложения при релизе, а также к списанию полной цены у пользователей, которым доступен introductory offer.

Убедитесь, что вы выполнили начальную настройку, не пропустив ни одного шага. Без неё мы не сможем валидировать покупки.

Совершить покупку

Используете Paywall Builder? Покупки обрабатываются автоматически — этот шаг можно пропустить.

Нужна пошаговая инструкция? Смотрите quickstart guide — там полный цикл реализации с контекстом.

Параметры запроса:

ПараметрНаличиеОписание
ProductrequiredОбъект AdaptyPaywallProduct, полученный из пейвола.

Параметры ответа:

ПараметрОписание
Profile

Если запрос выполнен успешно, ответ содержит этот объект. Объект AdaptyProfile предоставляет исчерпывающую информацию об уровнях доступа пользователя, подписках и разовых покупках внутри приложения.

Проверьте статус уровня доступа, чтобы убедиться, что пользователь имеет необходимый доступ к приложению.

Примечание: если вы используете Apple StoreKit версии ниже v2.0 и Adapty SDK версии ниже v2.9.0, вам нужно указать Apple App Store shared secret. Этот метод устарел и больше не рекомендуется Apple.

Встроенные покупки из App Store

Когда пользователь инициирует покупку в App Store и транзакция передаётся в ваше приложение, у вас есть два варианта:

  • Обработать транзакцию немедленно: Верните 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

Об офферных кодах

Офферные коды позволяют предоставлять скидки или бесплатные пробные периоды конкретным пользователям. В отличие от обычных офферов, которые применяются автоматически, офферные коды распространяются за пределами приложения — через email-рассылки, социальные сети или печатные материалы. Пользователи активируют их, вводя код в App Store, переходя по ссылке для активации или через диалог внутри приложения.

Чтобы настроить офферные коды, откройте подписку в App Store Connect и перейдите в раздел Offer Codes. Вы можете создать три вида офферных кодов:

  • Free — подписка бесплатна на заданный период, следующее продление — по полной цене.
  • Pay as you go — пользователь платит сниженную цену в каждом расчётном периоде на протяжении заданного срока, после чего подписка продлевается по полной цене.
  • Pay up front — пользователь единовременно платит сниженную цену за весь срок оффера, после чего подписка продлевается по полной цене.

Добавлять офферные коды в Adapty не нужно. Apple помечает каждую транзакцию в период действия оффера категорией офферного кода. Это касается как первоначальной активации, так и всех последующих продлений со скидкой. Adapty обнаруживает метку и записывает каждую транзакцию с категорией оффера offer_code. Как только период оффера заканчивается и подписка продлевается по полной цене, метка исчезает. Вы можете фильтровать аналитику по типу оффера Offer Code в дашборде Adapty.

Устранение расхождений в выручке

Если транзакция по офферному коду отображается в Adapty по полной цене продукта вместо сниженной цены оффера, проверьте следующее в App Store Connect:

  • Для офферного кода настроены корректные цены для всех регионов, где пользователи могут его активировать.
  • Цена оффера задана для конкретной страны или региона пользователя. Apple передаёт региональную цену в транзакции. Если для оффера не настроена региональная цена, Apple может передать полную цену продукта.

Вы можете фильтровать и проверять транзакции по офферным кодам в дашборде Adapty по фильтрам типа оффера Offer Code и Offer Discount Type.

Устаревшие промокоды (deprecated)

Apple прекратила поддержку промокодов для встроенных покупок в марте 2026 года. Офферные коды заменяют их с расширенными возможностями: настраиваемые условия применения, сроки действия и до 1 миллиона кодов в квартал. Если вы ранее использовали промокоды для встроенных покупок, перейдите на офферные коды в App Store Connect.

Устаревшие промокоды (не более 100 на приложение на версию) предоставляли бесплатный доступ к подписке. В отличие от офферных кодов, Apple не включала информацию о скидке в транзакции по промокодам — в чеке указывалась полная цена продукта. В результате Adapty записывал эти транзакции по полной цене, что приводило к расхождениям в выручке между аналитикой Adapty и App Store Connect.

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

Чтобы отобразить экран активации промокода в вашем приложении:

Adapty.presentCodeRedemptionSheet()

По нашим наблюдениям, экран активации промокода (Offer Code Redemption) в некоторых приложениях работает ненадёжно. Мы рекомендуем перенаправлять пользователя напрямую в App Store.

Для этого откройте URL в следующем формате: https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}