Миграция Adapty iOS SDK на v4.1

В Adapty iOS SDK 4.1 изменён способ включения Adapty Attribution, переименованы API внешней атрибуции и изменён формат резервного файла. Также возвращена поддержка продвигаемых встроенных покупок в App Store, которая была удалена в версии 4.0.

Warning

Переименованные API — это жёсткий разрыв. Старые имена удалены полностью — они не помечены как устаревшие, и никаких typealiases или аннотаций @available(renamed:) для совместимости нет. Код, который компилировался с 4.0.x, не скомпилируется на 4.1, пока вы не переименуете все точки вызова, перечисленные ниже.

Краткий справочник

v4.0v4.1
Атрибуция Adapty включена автоматическиАтрибуция Adapty отключена по умолчанию; включите с помощью .with(adaptyAttributionEnabled: true)
Adapty.updateAttribution(_:source:)Adapty.updateExternalAttribution(_:provider:)
Adapty.updateAttribution(_ attributionJson: String, source:)Удалено из публичного API; передавайте словарь вместо этого
AdaptyAttributionSourceAdaptyExternalAttributionProvider, с новым значением .custom
AdaptyProfile.appliedAttributionSourcesAdaptyProfile.appliedExternalAttributionProviders
Перечисление AdaptySubscriptionOfferTypeСтруктура AdaptySubscriptionOfferType; .code удалён
Резервный файл загружен для 4.0Новый формат резервного файла; загрузите файл повторно
Promoted in-app purchases не поддерживаютсяМетод делегата didReceivePromotedPurchase(_:) и AdaptyPromotedProduct

⚠️ Атрибуция Adapty отключена по умолчанию

Warning

Если вы обновитесь до SDK 4.1 и не подключите эту функцию явно, атрибуция Adapty перестанет работать без каких-либо предупреждений — установки перестанут регистрироваться.

В версии 4.0 и более ранних SDK автоматически регистрировал установки для Атрибуции Adapty. Начиная с версии 4.1, это отключено по умолчанию: SDK не регистрирует установки, а callback-делегаты onInstallationDetailsSuccess и onInstallationDetailsFail никогда не вызываются. getCurrentInstallationStatus() возвращает .notAvailable.

Если вы используете Атрибуцию Adapty, включите её при активации SDK:

let configurationBuilder = AdaptyConfiguration
    .builder(withAPIKey: "YOUR_PUBLIC_SDK_KEY")
+   .with(adaptyAttributionEnabled: true)

Если вы не используете атрибуцию Adapty, никаких изменений не требуется.

Переименованные внешние API атрибуции

updateAttribution(:source:) → updateExternalAttribution(:provider:)

Метод, передающий данные атрибуции от внешнего провайдера (Adjust, AppsFlyer, Branch, Tenjin или пользовательского), переименован, а параметр source переименован в provider:

- try await Adapty.updateAttribution(attribution, source: .adjust)
+ try await Adapty.updateExternalAttribution(attribution, provider: .adjust)

Перегрузка с JSON-строкой удалена

В версии 4.0 данные атрибуции принимались либо как словарь [AnyHashable: Any], либо как JSON-строка String. В версии 4.1 публичным остался только вариант со словарём — перегрузка с JSON-строкой зарезервирована для кросс-платформенных SDK Adapty. Десериализуйте JSON перед передачей данных:

- try await Adapty.updateAttribution(attributionJson, source: .adjust)
+ guard let attribution = try JSONSerialization.jsonObject(
+     with: Data(attributionJson.utf8)
+ ) as? [AnyHashable: Any] else { return }
+ try await Adapty.updateExternalAttribution(attribution, provider: .adjust)

AdaptyAttributionSource → AdaptyExternalAttributionProvider

Тип переименован. Предопределённые провайдеры сохраняют прежние имена: .appleAds, .adjust, .appsflyer, .branch, .tenjin. Тип по-прежнему соответствует ExpressibleByStringLiteral, поэтому строковые литералы продолжают компилироваться. Если провайдер хранится в переменной String, оберните его: AdaptyExternalAttributionProvider(rawValue: yourProvider).

В версии 4.1 добавлено предопределённое значение .custom для провайдеров, с которыми Adapty не интегрируется напрямую. В версии 4.0 то же значение было доступно только в виде строкового литерала "custom".

AdaptyProfile.appliedAttributionSources → appliedExternalAttributionProviders

Свойство профиля, которое перечисляет провайдеры атрибуции, применённые к профилю, переименовано. Тип его элементов изменяется соответственно:

- if profile.appliedAttributionSources.contains(.appleAds) {
+ if profile.appliedExternalAttributionProviders.contains(.appleAds) {
      // Apple Ads attribution has been applied
  }

AdaptySubscriptionOfferType теперь является структурой

AdaptySubscriptionOfferType — тип свойства AdaptySubscriptionOffer.offerType — меняется с перечисления на структуру RawRepresentable, чтобы бэкенд мог добавлять новые типы офферов без обновления SDK:

- public enum AdaptySubscriptionOfferType: String, Sendable { ... }
+ public struct AdaptySubscriptionOfferType: Sendable, RawRepresentable, Equatable, Hashable { ... }

Это затрагивает ваш код в трёх аспектах:

  • Исчерпывающие операторы switch больше не компилируются. У структуры нет фиксированного набора кейсов, поэтому компилятор не может подтвердить полноту switch. Добавьте ветку default:

    switch offer.offerType {
    case .introductory: // ...
    case .promotional: // ...
    case .winBack: // ...
    + default: // handle offer types added later
    }
  • .code удалён. Промокоды офферов больше не передаются через AdaptySubscriptionOffer.offerType. Удалите все ветки case .code. Подробнее см. в разделе Погашение промокодов на iOS.

  • Поддержка Codable удалена. Если вы кодировали или декодировали AdaptySubscriptionOfferType напрямую, сохраняйте offerType.rawValue (тип String) и восстанавливайте значение через AdaptySubscriptionOfferType(rawValue:).

Сравнения с предопределёнными значениями работают без изменений: .introductory, .promotional и .winBack по-прежнему можно использовать в проверках == и в качестве паттернов case.

Резервные файлы

Формат резервного файла изменился в SDK 4.1. Скачайте файл заново в разделе Placements > Fallbacks и добавьте его в приложение, даже если вы уже скачивали его для версии 4.0.

Warning

Этот шаг не вызывает ошибок компиляции. Если пропустить его, SDK отклонит устаревший файл и все плейсменты лишатся резервного пейвола.

Возврат поддержки продвигаемых встроенных покупок App Store

SDK 4.1 восстанавливает поддержку продвигаемых встроенных покупок App Store, которая была удалена в версии 4.0. Это новая функциональность, а не шаг миграции: поведение версии 4.0 не изменяется.

Если вы мигрируете с версии 3.x и использовали shouldAddStorePayment(for:) с AdaptyDeferredProduct, перейдите на новый метод делегата didReceivePromotedPurchase(_:) с AdaptyPromotedProduct. В отличие от shouldAddStorePayment, новый метод не возвращает значение: если вы его не реализуете, SDK немедленно начинает покупку; чтобы отложить её, реализуйте метод, сохраните продукт и передайте его в makePurchase позже. См. Встроенные покупки из App Store.

Warning

Новый механизм построен на StoreKit 2 и требует iOS 16.4 или выше. Метод shouldAddStorePayment в версии 3.x работал на более ранних версиях iOS. На устройствах ниже iOS 16.4 didReceivePromotedPurchase никогда не срабатывает, и продвигаемые покупки не доходят до приложения.