Миграция Adapty iOS SDK на v4.1
В Adapty iOS SDK 4.1 изменён способ включения Adapty Attribution, переименованы API внешней атрибуции и изменён формат резервного файла. Также возвращена поддержка продвигаемых встроенных покупок в App Store, которая была удалена в версии 4.0.
Переименованные API — это жёсткий разрыв. Старые имена удалены полностью — они не помечены как устаревшие, и никаких typealiases или аннотаций @available(renamed:) для совместимости нет. Код, который компилировался с 4.0.x, не скомпилируется на 4.1, пока вы не переименуете все точки вызова, перечисленные ниже.
Краткий справочник
| v4.0 | v4.1 |
|---|---|
| Атрибуция Adapty включена автоматически | Атрибуция Adapty отключена по умолчанию; включите с помощью .with(adaptyAttributionEnabled: true) |
Adapty.updateAttribution(_:source:) | Adapty.updateExternalAttribution(_:provider:) |
Adapty.updateAttribution(_ attributionJson: String, source:) | Удалено из публичного API; передавайте словарь вместо этого |
AdaptyAttributionSource | AdaptyExternalAttributionProvider, с новым значением .custom |
AdaptyProfile.appliedAttributionSources | AdaptyProfile.appliedExternalAttributionProviders |
Перечисление AdaptySubscriptionOfferType | Структура AdaptySubscriptionOfferType; .code удалён |
| Резервный файл загружен для 4.0 | Новый формат резервного файла; загрузите файл повторно |
| Promoted in-app purchases не поддерживаются | Метод делегата didReceivePromotedPurchase(_:) и AdaptyPromotedProduct |
⚠️ Атрибуция Adapty отключена по умолчанию
Если вы обновитесь до 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.
Этот шаг не вызывает ошибок компиляции. Если пропустить его, SDK отклонит устаревший файл и все плейсменты лишатся резервного пейвола.
Возврат поддержки продвигаемых встроенных покупок App Store
SDK 4.1 восстанавливает поддержку продвигаемых встроенных покупок App Store, которая была удалена в версии 4.0. Это новая функциональность, а не шаг миграции: поведение версии 4.0 не изменяется.
Если вы мигрируете с версии 3.x и использовали shouldAddStorePayment(for:) с AdaptyDeferredProduct, перейдите на новый метод делегата didReceivePromotedPurchase(_:) с AdaptyPromotedProduct. В отличие от shouldAddStorePayment, новый метод не возвращает значение: если вы его не реализуете, SDK немедленно начинает покупку; чтобы отложить её, реализуйте метод, сохраните продукт и передайте его в makePurchase позже. См. Встроенные покупки из App Store.
Новый механизм построен на StoreKit 2 и требует iOS 16.4 или выше. Метод shouldAddStorePayment в версии 3.x работал на более ранних версиях iOS. На устройствах ниже iOS 16.4 didReceivePromotedPurchase никогда не срабатывает, и продвигаемые покупки не доходят до приложения.