Совершение покупок в мобильном приложении в iOS SDK
Отображение пейволов в мобильном приложении — обязательный шаг для предоставления пользователям доступа к премиум-контенту или сервисам. Однако само по себе отображение пейволов достаточно для поддержки покупок только в том случае, если вы используете Paywall Builder для их настройки.
Если вы не используете Paywall Builder, для совершения покупки и открытия нужного контента необходимо вызвать отдельный метод .makePurchase(). Именно через него пользователи взаимодействуют с пейволами и проводят нужные транзакции.
Если ваш пейвол содержит активный promotional offer для продукта, который пользователь хочет купить, Adapty автоматически применит его в момент покупки.
Учтите, что introductory offer будет применён автоматически только при использовании пейволов, созданных с помощью Paywall Builder.
В остальных случаях нужно проверить право пользователя на introductory offer на iOS. Пропуск этого шага может привести к отклонению приложения при релизе, а также к списанию полной цены у пользователей, которым доступен introductory offer.
Убедитесь, что вы выполнили начальную настройку, не пропустив ни одного шага. Без неё мы не сможем валидировать покупки.
Совершить покупку
Используете Paywall Builder? Покупки обрабатываются автоматически — этот шаг можно пропустить.
Нужна пошаговая инструкция? Смотрите quickstart guide — там полный цикл реализации с контекстом.
Параметры запроса:
| Параметр | Наличие | Описание |
|---|---|---|
| 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, которое раскрывает его на 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 in-app purchases вовсе, а на устройствах ниже 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}