---
metadata:
  - name: generator
    content: Diplodoc Platform v5.54.4
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/ios/release/8-0-0-migration.md
  - https://ads.yandex.com/helpcenter/ru/dev/ios/release/8-0-0-migration.md
  - https://ads.yandex.com/helpcenter/zh/dev/ios/release/8-0-0-migration.md
  - href: ru/dev/ios/release/8-0-0-migration.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/ru/llms.txt

<!--
Используется в Boost: boost/ru/ad-monetization/dev/ios
-->

# Руководство по миграции на версию 8

8-я версия Yandex Mobile Ads SDK вносит в API ряд изменений, направленных на улучшение пользовательского опыта разработчиков.

{% note tip "Миграция с помощью AI-инструментов" %}

Чтобы ускорить переход с SDK 7.x на 8.x, воспользуйтесь готовым скиллом миграции для AI-ассистентов — подробности в разделе [Миграция с помощью AI-инструментов](#ai).

{% endnote %}

{% note info "" %}

Если ваш проект реализован на Objective-C, обратите внимание на [пункт 14](#main-actor) с MainActor, для корректной обработки MainActor-изолированные классов. Осуществляйте работу с ними на главном потоке.

{% endnote %}

## Основные изменения

### 1. Изменения в AdRequest

- Используйте `AdRequest` для всех типов рекламы. 
- Классы `AdRequestConfiguration`, `NativeAdRequestConfiguration` и все Mutable-классы запросов удалены. 
- Свойство `adUnitID` теперь передается как обязательный параметр инициализации `AdRequest`.

#|
|| **Класс** | **Статус** ||
|| `AdRequestConfiguration` | Удален. Используйте `AdRequest` ||
|| `NativeAdRequestConfiguration` | Удален. Используйте `AdRequest` и `NativeAdOptions` ||
|| `MutableAdRequest` | Удален ||
|| `MutableAdRequestConfiguration` | Удален ||
|| `MutableNativeAdRequestConfiguration` | Удален ||
|#

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  let configuration = AdRequestConfiguration(adUnitID: "R-M-XXXXX-YY")
  loader.loadAd(with: configuration)
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  let request = AdRequest(adUnitID: "R-M-XXXXX-YY") loader.loadAd(with: request) { … }
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  YMAAdRequestConfiguration *configuration =
      [[YMAAdRequestConfiguration alloc] initWithAdUnitID:@"R-M-XXXXX-YY"];
  [loader loadAdWithConfiguration:configuration];
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  YMAAdRequest *request =
      [[YMAAdRequest alloc] initWithAdUnitID:@"R-M-XXXXX-YY"];
  [loader loadAdWithRequest:request
         completionHandler:^(YMAInterstitialAd * _Nullable ad,
                             NSError * _Nullable error) {
      if (ad) {
          // реклама загружена
      } else {
          // ошибка загрузки
      }
  }];
  ```
  ||
  |#

{% endlist %}

### 2. Изменения в Targeting

- Поля `age`, `gender`, `location`, `contextQuery` и `contextTags` удалены из `AdRequest`. 
- Для управления параметрами таргетинга используйте новый класс `AdTargeting`.

{% note info "" %}

Класс `AdTargetInfo` переименован в `AdTargeting`, поле `targetInfo` в `AdRequestTokenConfiguration` и `BidderTokenRequestConfiguration` переименовано в `targeting`.

{% endnote %}

#|
|| **Класс**  | **Статус** ||
|| `AdTargetInfo` | Переименован в `AdTargeting` ||
|#

#|
|| **Класс** | **Свойство** | **Статус** ||
|| `AdRequest` | `age` | Удалено. Используйте `AdTargeting.age` ||
|| ^ | `gender` | Удалено. Используйте `AdTargeting.gender` ||
|| ^ | `location` | Удалено. Используйте `AdTargeting.location` ||
|| ^ | `contextQuery` | Удалено. Используйте `AdTargeting.contextQuery` ||
|| ^ | `contextTags` | Удалено. Используйте `AdTargeting.contextTags` ||
|| ^ | `targeting` | Добавлено ||
|| `AdTargeting` |  `targetInfo` | Переименовано в `targeting` ||
|#

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  let request = AdRequest(
      adUnitID: "R-M-XXXXX-YY",
      age: 25,
      gender: kYMAGenderMale,
      location: location
  )
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  let targeting = AdTargeting(
      age: 25,
      gender: .male,
      location: location
  )
  let request = AdRequest(adUnitID: "R-M-XXXXX-YY", targeting: targeting)
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  YMAAdRequest *request = [[YMAAdRequest alloc] initWithAdUnitID:@"R-M-XXXXX-YY"
                                                             age:@(25)
                                                          gender:kYMAGenderMale
                                                        location:location];
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  YMAAdTargeting *targeting = [[YMAAdTargeting alloc] initWithAge:@(25)
                                                           gender:YMAGender.male
                                                         location:location
                                                     contextQuery:nil
                                                      contextTags:nil];
  YMAAdRequest *request = [[YMAAdRequest alloc] initWithAdUnitID:@"R-M-XXXXX-YY"
                                                        targeting:targeting];
  ```
  ||
  |#

{% endlist %}

### 3. Изменения в загрузчиках рекламы

- Делегаты загрузки удалены — вместо них результат загрузки приходит в `completion` handler. 
- Параметр `adUnitID` теперь передается через `AdRequest`.

#|
|| **Класс** | **Загрузчик** | **Статус** ||
|| `AppOpenAdLoader` | `loadAd(with:)` + делегат | Заменен на `loadAd(with:completion:)` ||
|| `InterstitialAdLoader` | `loadAd(with:)` + делегат | Заменен на `loadAd(with:completion:)` ||
|| `RewardedAdLoader` | `loadAd(with:)` + делегат | Заменен на `loadAd(with:completion:)` ||
|| `NativeAdLoader` | `loadAd(with:)` + делегат | Заменен на `loadAd(with:options:completion:)` ||
|| `NativeBulkAdLoader` | `loadAds(with:adsCount:)` + делегат | Заменен на `loadAds(with:adsCount:options:completion:)` ||
|| `SliderAdLoader` | `loadAd(with:)` + делегат | Заменен на `loadAd(with:options:completion:)`||
|#

#|
|| **Класс** | **Статус** ||
|| `AppOpenAdLoaderDelegate` | Удален ||
|| `InterstitialAdLoaderDelegate`| ^ ||
|| `RewardedAdLoaderDelegate`| ^ ||
|| `NativeAdLoaderDelegate`| ^ ||
|| `NativeBulkAdLoaderDelegate` | ^ ||
|| `SliderAdLoaderDelegate` | ^ ||
|#

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  // Interstitial Ads
  let configuration = AdRequestConfiguration(adUnitID: "R-M-XXXXX-YY")
  interstitialAdLoader.delegate = self
  interstitialAdLoader.loadAd(with: configuration)

  // Native Ads
  let nativeConfiguration = NativeAdRequestConfiguration(adUnitID: "R-M-XXXXX-YY")
  nativeAdLoader.delegate = self
  nativeAdLoader.loadAd(with: nativeConfiguration)
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  // Interstitial Ads
  let request = AdRequest(adUnitID: "R-M-XXXXX-YY")
  interstitialAdLoader.loadAd(with: request) { result in
      switch result {
      case .success(let ad):
          // ad loaded
      case .failure(let error):
          // load error
      }
  }

  // Native Ads
  let options = NativeAdOptions()
  nativeAdLoader.loadAd(with: request, options: options) { result in
      switch result {
      case .success(let ad):
          // ad loaded
      case .failure(let error):
          // load error
      }
  }
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  // Interstitial Ads
  YMAAdRequestConfiguration *configuration =
      [[YMAAdRequestConfiguration alloc] initWithAdUnitID:@"R-M-XXXXX-YY"];
  interstitialAdLoader.delegate = self;
  [interstitialAdLoader loadAdWithConfiguration:configuration];

  // Native Ads
  YMANativeAdRequestConfiguration *nativeConfig =
      [[YMANativeAdRequestConfiguration alloc] initWithAdUnitID:@"R-M-XXXXX-YY"];
  nativeAdLoader.delegate = self;
  [nativeAdLoader loadAdWithConfiguration:nativeConfig];
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  // Interstitial Ads
  YMAAdRequest *request =
      [[YMAAdRequest alloc] initWithAdUnitID:@"R-M-XXXXX-YY"];
  [interstitialAdLoader loadAdWithRequest:request
                        completionHandler:^(YMAInterstitialAd * _Nullable ad,
                                            NSError * _Nullable error) {
      if (ad) {
          // ad loaded
      } else {
          // load error
      }
  }];

  // Native Ads
  YMANativeAdOptions *options = [[YMANativeAdOptions alloc] init];
  [nativeAdLoader loadAdWithRequest:request
                            options:options
                  completionHandler:^(id<YMANativeAd> _Nullable ad,
                                      NSError * _Nullable error) {
      if (ad) {
          // ad loaded
      } else {
          // load error
      }
  }];
  ```
  ||
  |#

{% endlist %}

### 3.1 Поддержка Structured Concurrency

Добавлена поддержка Swift Structured Concurrency (async/await) во всех загрузчиках рекламы.

#|
|| **Загрузчик** | **Метод** | **Статус** ||
|| `AppOpenAdLoader` | `loadAd(with:)` | Добавлен ||
|| `InterstitialAdLoader` | `loadAd(with:)` | ^ ||
|| `RewardedAdLoader` | `loadAd(with:)` | ^ ||
|| `NativeAdLoader` | `loadAd(with:options:)` | ^ ||
|| `NativeBulkAdLoader` | `loadAds(with:adsCount:options:)` | ^ ||
|| `SliderAdLoader` | `loadAd(with:options:)` | ^ ||
|#

#### Примеры

{% list tabs %}

- Swift

  ```swift
  let request = AdRequest(adUnitID: "R-M-XXXXX-YY")

  // Interstitial Ads
  let interstitialAd = try await interstitialAdLoader.loadAd(with: request)

  // Rewarded Ads
  let rewardedAd = try await rewardedAdLoader.loadAd(with: request)

  // AppOpen Ads
  let appOpenAd = try await appOpenAdLoader.loadAd(with: request)

  // Native Ads
  let options = NativeAdOptions()
  let nativeAd = try await nativeAdLoader.loadAd(with: request, options: options)

  // Slider Ads
  let sliderAd = try await sliderAdLoader.loadAd(with: request, options: options)

  // Native Bulk Ads
  let nativeAds = try await nativeBulkAdLoader.loadAds(with: request, adsCount: 3, options: options)
  ```

- Objective-C

  *Structured Concurrency доступен только в Swift.*

{% endlist %}

### 4. Изменения в Banner API

- Класс `AdView` переименован в `BannerAdView`, протокол `AdViewDelegate` — в `BannerAdViewDelegate`. 
- Свойство `adUnitID` удалено из `BannerAdView` — теперь `adUnitID` передается в конструктор `AdRequest` перед каждой загрузкой. 
- Фабричные методы `BannerAdSize` переименованы.

#|
|| **Класс** | **Статус** ||
|| `AdView` | Переименован в `BannerAdView` ||
|| `AdViewDelegate` | Переименован в `BannerAdViewDelegate` ||
|#

#|
|| **Класс** | **Свойство** | **Статус** ||
|| `BannerAdView` | `adViewDidLoad` | Переименовано в `bannerAdViewDidLoad`  ||
|| ^ | `adViewDidFailLoading` | Переименовано в `bannerAdViewDidFailLoading`  ||
|| ^ | `adViewDidClick` | Переименовано в `bannerAdViewDidClick` ||
|| ^ | `adView(_:didTrackImpression:)` | Переименовано в `bannerAdView(_:didTrackImpression:)` ||
|| ^ | `AdView(adUnitID:adSize:)` | Заменено на `BannerAdView(adSize:)` ||
|| ^ | `AdView.adUnitID` | Заменено на `BannerAdView.adInfo?.adUnitID` ||
|| ^ | `AdView.loadAd()` |  Удалено ||
|| ^ | `AdView.loadAd(with: AdRequest?)` | Заменено на `BannerAdView.loadAd(with: AdRequest)` ||
|| `BannerAdSize` | `fixedSize(withWidth:height:)` | Переименовано в `fixed(width:height:)` ||
|| ^ | `inlineSize(withWidth:maxHeight:)` | Переименовано в `inline(width:maxHeight:)` ||
|| ^ | `stickySize(withContainerWidth:)` | Переименовано в `sticky(containerWidth:)` ||
|#

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  let adSize = BannerAdSize.stickySize(withContainerWidth: screenWidth)
  let adView = AdView(adUnitID: "R-M-XXXXX-YY", adSize: adSize)
  adView.delegate = self
  adView.loadAd()
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  let adSize = BannerAdSize.sticky(containerWidth: screenWidth)
  let bannerAdView = BannerAdView(adSize: adSize)
  bannerAdView.delegate = self
  let request = AdRequest(adUnitID: "R-M-XXXXX-YY")
  bannerAdView.loadAd(with: request)
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  YMABannerAdSize *adSize = [YMABannerAdSize stickySizeWithContainerWidth:screenWidth];
  YMAAdView *adView = [[YMAAdView alloc] initWithAdUnitID:@"R-M-XXXXX-YY"
                                                   adSize:adSize];
  adView.delegate = self;
  [adView loadAd];
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  YMABannerAdSize *adSize = [YMABannerAdSize stickyWithContainerWidth:screenWidth];
  YMABannerAdView *bannerAdView = [[YMABannerAdView alloc] initWithAdSize:adSize];
  bannerAdView.delegate = self;
  YMAAdRequest *request = [[YMAAdRequest alloc] initWithAdUnitID:@"R-M-XXXXX-YY"];
  [bannerAdView loadAdWithRequest:request];
  ```
  ||
  |#

{% endlist %}

### 5. Изменения в AdInfo

- Свойства рекламных объектов `info`, `adAttributes`, `creativeID`, `campaignID` удалены. 
- Используйте `adInfo`. Также изменены имена некоторых свойств `adInfo`.

#|
|| **Класс** | **Свойство** |  **Статус** ||
|| `AdInfo` | `adUnitId` | Переименовано в `adUnitID` ||
|| ^ | `data` | Переименовано в `extraData` ||
|| ^ | `adSize` | Удалено ||
|| ^ | `partnerText` | Добавлено ||
|| `BannerAdView`,<br>`NativeAd`,<br>`SliderAd`,<br>`AppOpenAd`,<br>`InterstitialAd`,<br>`RewardedAd` | `info` | Заменено на `adInfo.extraData` ||
|| ^ | `adAttributes` | Заменено на `adInfo.creatives`  ||
|| ^ | `creativeID` | Заменено на `adInfo.creatives[i].creativeID`  ||
|| ^ | `campaignID` | Заменено на `adInfo.creatives[i].campaignID`  ||
|| `Creative` | `placeID` | Добавлено   ||
|| ^ | `offerID` | Добавлено  ||
|#

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  // adAttributes и info
  let attributes = nativeAd.adAttributes
  let info = nativeAd.info

  // creativeID и campaignID
  let creativeID = interstitialAd.creativeID
  let campaignID = interstitialAd.campaignID

  // adUnitId
  let adUnitId = interstitialAd.adInfo.adUnitId

  // adSize (доступно)
  let size = bannerAdView.adInfo.adSize
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  // adInfo.creatives и adInfo.extraData
  let creatives = nativeAd.adInfo.creatives
  let extraData = nativeAd.adInfo.extraData

  // creativeID, campaignID, placeID, offerID через creatives
  if let creative = interstitialAd.adInfo.creatives.first {
      let creativeID = creative.creativeID
      let campaignID = creative.campaignID
      let placeID = creative.placeID
      let offerID = creative.offerID
  }

  // adUnitID (renamed)
  let adUnitID = interstitialAd.adInfo.adUnitID

  // partnerText (new)
  let partnerText = interstitialAd.adInfo.partnerText

  // adSize deleted — banner size is available in BannerAdView.adSize
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  // adAttributes and info
  NSArray *attributes = nativeAd.adAttributes;
  NSDictionary *info = nativeAd.info;

  // creativeID and campaignID
  NSString *creativeID = interstitialAd.creativeID;
  NSString *campaignID = interstitialAd.campaignID;

  // adUnitId
  NSString *adUnitId = interstitialAd.adInfo.adUnitId;

  // adSize (available)
  YMAAdSize *size = bannerAdView.adInfo.adSize;
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  // adInfo.creatives and adInfo.extraData
  NSArray<YMACreative *> *creatives = nativeAd.adInfo.creatives;
  NSDictionary *extraData = nativeAd.adInfo.extraData;

  // creativeID, campaignID, placeID, offerID via creatives
  YMACreative *creative = interstitialAd.adInfo.creatives.firstObject;
  if (creative != nil) {
      NSString *creativeID = creative.creativeID;
      NSString *campaignID = creative.campaignID;
      NSString *placeID = creative.placeID;
      NSString *offerID = creative.offerID;
  }

  // adUnitID (renamed)
  NSString *adUnitID = interstitialAd.adInfo.adUnitID;

  // partnerText (new)
  NSString *partnerText = interstitialAd.adInfo.partnerText;

  // adSize deleted — banner size is available in YMABannerAdView.adSize
  ```
  ||
  |#

{% endlist %}

### 6. Изменения в основном классе SDK

- Класс `MobileAds` переименован в `YandexAds`. 
- Privacy-методы и свойства перенесены в новый класс с обновленными именами.

#|
|| **Класс** | **Статус** ||
|| `MobileAds` | Переименован в `YandexAds` ||
|| `MobileAds.sdkVersion` | Заменен на `YandexAds.sdkVersion.stringValue` ||
|| `MobileAds.setLocationTrackingEnabled(_:)` | Переименован в `YandexAds.setLocationTracking(_:)` ||
|| `MobileAds.setAgeRestrictedUser(_:)` | Переименован в `YandexAds.setAgeRestricted(_:)` ||
|| `MobileAds.setUserConsent(_:)` | Перенесен в `YandexAds.setUserConsent(_:)` ||
|| `YMANativeAdView` | Переименован в `NativeAdView` ||
|| `YMANativeMediaView` | Переименован в `NativeMediaView` ||
|#

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  import YandexMobileAds
  MobileAds.setLocationTrackingEnabled(true)
  MobileAds.setAgeRestrictedUser(false)
  MobileAds.setUserConsent(true)
  let version = MobileAds.sdkVersion
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  import YandexMobileAds
  YandexAds.setLocationTracking(true)
  YandexAds.setAgeRestricted(false)
  YandexAds.setUserConsent(true)
  let version = YandexAds.sdkVersion.stringValue
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  [YMAMobileAds setLocationTrackingEnabled:YES];
  [YMAMobileAds setAgeRestrictedUser:NO];
  [YMAMobileAds setUserConsent:YES];
  NSString *version = YMAMobileAds.sdkVersion;
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  [YMAYandexAds setLocationTracking:YES];
  [YMAYandexAds setAgeRestricted:NO];
  [YMAYandexAds setUserConsent:YES];
  NSString *version = YMAYandexAds.sdkVersion.stringValue;
  ```
  ||
  |#

{% endlist %}

### 7. Изменения в делегатах рекламных объектов

Методы делегатов `AppOpenAdDelegate`, `InterstitialAdDelegate`, `RewardedAdDelegate`, `NativeAdDelegate`, `SliderAdDelegate` больше не опциональны — все методы теперь обязательны для реализации.

#### Методы показа

#|
|| **Класс** | **Метод** | **Статус** ||
|| `RewardedAdDelegate` | 
```
rewardedAdDelegate(
  _:didFailToShowWithError:)
``` 
| Переименован в 
```
rewardedAdDelegate(
  _:didFailToShow:)
```  
||
|| `InterstitialAdDelegate` | 
```
interstitialAdDelegate(
  _:didFailToShowWithError:)
``` 
| Переименован в 
```
interstitialAdDelegate(
  _:didFailToShow:)
``` 
||
|| `AppOpenAdDelegate` | 
```
appOpenAdDelegate(
  _:didFailToShowWithError:)
``` 
| Переименован в  

```
appOpenAdDelegate(
  _:didFailToShow:)
``` ||
|#

#### Методы отслеживания показов

#|
|| **Класс** | **Метод** |  **Статус** ||
|| `NativeAdDelegate` | 
```
nativeAd(
  _:didTrackImpressionWith:)
``` 
| Переименован в 
```
nativeAd(
  _:didTrackImpression:)
```
||
|| `RewardedAdDelegate` | 
```
rewardedAdDelegate(
  _:didTrackImpressionWith:)
``` 
| Переименован в 
```
rewardedAdDelegate(
  _:didTrackImpression:)
``` 
||
|| `InterstitialAdDelegate` | 
```
interstitialAdDelegate(
  _:didTrackImpressionWith:)
``` 
| Переименован в 
```
interstitialAdDelegate(
  _:didTrackImpression:)
``` 
||
|| `AppOpenAdDelegate` | 
```
appOpenAdDelegate(
  _:didTrackImpressionWith:)
``` 
| Переименован в 
```
appOpenAdDelegate(
  _:didTrackImpression:)
``` 
||
|| `SliderAdDelegate` | 
```
sliderAdDelegate(
  _:didTrackImpressionWith:)
``` 
| Переименован в 
```
sliderAdDelegate(
  _:didTrackImpression:)
``` 
||
|#

#### Удаленные методы делегатов

#|
|| **Делегат** | **Метод** | **Статус** ||
|| `AdViewDelegate` | `close(_:)` | Удален ||
|| ^ | `viewControllerForPresentingModalView()` | ^ ||
|| ^ | `adViewWillLeaveApplication` | ^ ||
|| ^ | `adView(_:willPresentScreen:)` | ^ ||
|| ^ | `adView(_:didDismissScreen:)` | ^ ||
|| `NativeAdDelegate` | `close(_:)` | ^ ||
|| ^ | `viewControllerForPresentingModalView()` | ^ ||
|| ^ | `nativeAdWillLeaveApplication` | ^ ||
|| ^ | `nativeAd(_:willPresentScreen:)` | ^ ||
|| ^ | `nativeAd(_:didDismissScreen:)` | ^ ||
|| `SliderAdDelegate` | `sliderAdDidClose(_:)` | ^ ||
|| ^ | `sliderAdWillLeaveApplication` | ^ ||
|| ^ | `sliderAd(_:willPresentScreen:)` | ^ ||
|| ^ | `sliderAd(_:didDismissScreen:)` | ^ ||
|#

### 8. Изменения в Native Ads: Warning

- Тип поля `warning` в `NativeAdAssets` изменен с `String?` на `NativeAdWarning?`. 
- Добавлено поле `minimumRequiredArea` в `NativeAdWarning`, которое содержит информацию о минимальной требуемой части рекламной области ассета `warning`.

#|
|| **Класс** | **Поле** | **Статус** ||
|| `NativeAdAssets` | `warning: String?` | Тип изменен на `warning: NativeAdWarning?` ||
|| `NativeAdWarning` | `value: String` | Добавлено  ||
|| ^ | `minimumRequiredArea: Double` | Добавлено  ||
|#

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  let warningText: String? = nativeAd.adAssets.warning
  label.text = warningText
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  let warning: NativeAdWarning? = nativeAd.adAssets.warning
  label.text = warning?.value
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  NSString *warningText = nativeAd.adAssets.warning;
  label.text = warningText;
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  YMANativeAdWarning *warning = nativeAd.adAssets.warning;
  label.text = warning.value;
  ```
  ||
  |#

{% endlist %}

### 9. Изменения в Native Ads: Media

Добавлено свойство `hasVideo` в `NativeAdMedia`.

#|
|| **Класс** | **Свойство** | **Статус** ||
|| `NativeAdMedia` | `hasVideo: Bool` | Добавлено ||
|#

#### Примеры

{% list tabs %}

- Swift

  ```swift
  // SDK 8
  if let media = nativeAd.adAssets.media, media.hasVideo {
      // Consider video content in ads
  }
  ```

- Objective-C

  ```objc
  // SDK 8
  if (nativeAd.adAssets.media != nil && nativeAd.adAssets.media.hasVideo) {
      // Consider video content in ads
  }
  ```

{% endlist %}

### 10. Изменения в NativeAd и SliderAd: loadImages

- Метод `loadImages()` переименован в `loadImages(completionHandler:)`. 
- Параметр `completionHandler` заменяет протокол-наблюдатель `NativeAdImageLoadingObserver`. 
- Добавлена асинхронная версия `loadImages()`.

#|
|| **Класс** | **Статус** ||
|| `NativeAdImageLoadingObserver` |  Удален ||
|#

#|
|| **Класс** | **Метод** | **Статус** ||
|| `NativeAd` | `loadImages()` + `NativeAdImageLoadingObserver` | Заменен на `loadImages(completionHandler:)` / `loadImages()` (async)  ||
|| `SliderAd` | `loadImages()` + `NativeAdImageLoadingObserver` | Заменен на `loadImages(completionHandler:)` / `loadImages()` (async)  ||
|#

**Применимо к**: `NativeAd`, `SliderAd`.

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  // NativeAd
  nativeAd.addImageLoadingObserver(self)
  nativeAd.loadImages()

  // SliderAd
  sliderAd.addImageLoadingObserver(self)
  sliderAd.loadImages()
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  // NativeAd (completion handler)
  nativeAd.loadImages { [weak self] in
      // resources loaded
  }

  // NativeAd (async/await)
  await nativeAd.loadImages()

  // SliderAd (completion handler)
  sliderAd.loadImages { [weak self] in
      // resources loaded
  }

  // SliderAd (async/await)
  await sliderAd.loadImages()
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  // NativeAd
  [nativeAd addImageLoadingObserver:self];
  [nativeAd loadImages];

  // SliderAd
  [sliderAd addImageLoadingObserver:self];
  [sliderAd loadImages];
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  // NativeAd
  [nativeAd loadImagesWithCompletionHandler:^{
      // resources loaded
  }];

  // SliderAd
  [sliderAd loadImagesWithCompletionHandler:^{
      // resources loaded
  }];
  ```
  ||
  |#

{% endlist %}

### 11. Удаление VideoController

Свойство `videoController` и связанные классы `VideoController`, `VideoDelegate` удалены.

#|
|| **Свойство** | **Статус** ||
|| `AdView.videoController`  | Удалено ||
|| `BannerAdView.videoController`  | ^ ||
|| `VideoController` | ^ ||
|| `VideoDelegate` | ^ ||
|#

### 12. Удаление нативных шаблонов

Нативные шаблоны полностью удалены. Все связанные классы больше не доступны.

#|
|| **Шаблон**| **Статус** ||
|| `NativeTemplateAppearance` | Удален ||
|| `MutableNativeTemplateAppearance` | ^ ||
|| `NativeTemplateHorizontalOffset`  | ^ ||
|| `NativeBannerView`  | ^ ||
|| `ButtonAppearance` | ^ ||
|| `MutableButtonAppearance`  | ^ ||
|| `ImageAppearance`  | ^ ||
|| `MutableImageAppearance` | ^ ||
|| `LabelAppearance`  | ^ ||
|| `MutableLabelAppearance` | ^ ||
|| `RatingAppearance`  | ^ ||
|| `MutableRatingAppearance`  | ^ ||
|| `SizeConstraint` | ^ ||
|| `MutableSizeConstraint`  | ^ ||
|| `SizeConstraintType` | ^ ||
|| `YMAHorizontalOffset`  | ^ ||
|#

### 13. Удаленные константы и типы ошибок

#|
|| **Константы и типы ошибок**| **Статус** ||
|| `kYMAAdsErrorDomain` | Удалено ||
|| `kYMANativeAdErrorDomain`  | Удалено ||
|| `kYMAGenderFemale`, `kYMAGenderMale` | Заменены классом `Gender` ||
|| Константы из `YMAVersion` | Заменено на `YandexAds.sdkVersion.stringValue` ||
|| `MobileAds.sdkVersion` | Заменено на `YandexAds.sdkVersion.stringValue`  ||
|| `AdErrorCode` | Удалено ||
|| `NativeErrorCode` | Удалено ||
|| `Version.prereleaseIdentifiers`  | Удалено ||
|| `Version.buildMetadataIdentifiers` | Удалено ||
|| `isYandexMobileAdsError` (на `Error`/`NSError`) | Удалено ||
|| `isYandexMobileNativeAdsError` (на `Error`/`NSError`)| Удалено ||
|#

### 14. Swift 6, MainActor и Sendable {#main-actor}

- SDK собирается с использованием Swift 6. 
- Ряд классов и протоколов теперь изолирован на `MainActor`, а один протокол требует `Sendable`.

#### MainActor-изолированные классы

#|
|| **Класс** ||
|| `AppOpenAd` ||
|| `InterstitialAd` ||
|| `RewardedAd` ||
|| `AudioSessionManager` ||
|| `NativeVideoPlaybackControls` ||
|#

#### MainActor-изолированные протоколы

#|
|| **Протокол** ||
|| `AppOpenAdDelegate` ||
|| `InterstitialAdDelegate` ||
|| `RewardedAdDelegate` ||
|| `NativeAd` ||
|| `NativeAdDelegate` ||
|| `SliderAd` ||
|| `SliderAdDelegate` ||
|| `BannerAdViewDelegate` ||
|#

Протокол `NativeAdImageLoadingObserver` удален — загрузка изображений обрабатывается через completion handler или async/await.

### 15. Другие изменения

#|
|| **Класс** | **Объект** | **Статус** ||
|| `Rating` | `setRating(_:)` / `rating()` | Заменен на свойство `Rating.rating` ||
|| `NativeAd` | `bind(toSliderView:)` | Перенесен в `SliderAd.bind(with:)` ||
|| `NativeVideoPlaybackProgressControl` | `reset` | Удален ||
|| `MobileAds` | `audioSessionManager()` | Заменен на свойство `YandexAds.audioSessionManager` ||
|#

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  rating.setRating(4.5)
  let value = rating.rating()

  let audioManager = MobileAds.audioSessionManager()
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  rating.rating = 4.5

  let audioManager = YandexAds.audioSessionManager
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  [rating setRating:4.5];
  CGFloat value = [rating rating];

  YMAAudioSessionManager *audioManager = [YMAMobileAds audioSessionManager];
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  rating.rating = 4.5;

  YMAAudioSessionManager *audioManager = YMAYandexAds.audioSessionManager;
  ```
  ||
  |#

{% endlist %}

## Изменения в API медиационных сетей

### 1. Изменения в AdapterIdentity для медиационных адаптеров

- Добавлен новый механизм идентификации медиационных адаптеров через `AdapterIdentity`. 
- Параметр `mediationNetworkName` больше не используется. 
- Идентификация адаптера задается глобально через `YandexAds.setAdapterIdentity(_:)` перед инициализацией SDK.

#|
|| **Класс** | **Параметр** | **Статус** ||
|| `BidderTokenLoader` | `BidderTokenLoader(mediationNetworkName:)` | Заменен на `BidderTokenLoader()` ||
|| `YandexAds` | `MobileAds.initialize()` | Заменен на `YandexAds.setAdapterIdentity(_:)` + `YandexAds.initializeSDK()` ||
|| `AdapterIdentity` | 
```
AdapterIdentity(
  adapterNetworkName:adapterVersion:adapterNetworkVersion:)
``` 
| Добавлен ||
|#

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  let tokenLoader = BidderTokenLoader(mediationNetworkName: "AdMob")
  let config = BidderTokenRequestConfiguration(adType: .interstitial)
  tokenLoader.loadBidderToken(requestConfiguration: config) { ... }

  MobileAds.initialize()
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  let tokenLoader = BidderTokenLoader()
  let request = BidderTokenRequest.interstitial()
  tokenLoader.loadBidderToken(request: request) { ... }

  let adapterIdentity = AdapterIdentity(
      adapterNetworkName: "AdMob",
      adapterVersion: "1.0.0",
      adapterNetworkVersion: "23.5.0"
  )
  YandexAds.setAdapterIdentity(adapterIdentity)
  YandexAds.initializeSDK()
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  YMABidderTokenLoader *tokenLoader =
      [[YMABidderTokenLoader alloc] initWithMediationNetworkName:@"AdMob"];
  YMABidderTokenRequestConfiguration *config =
      [[YMABidderTokenRequestConfiguration alloc] initWithAdType:YMAAdTypeInterstitial];
  [tokenLoader loadBidderTokenWithRequestConfiguration:config
                                   completionHandler:^(NSString *token) { ... }];

  [YMAMobileAds initialize];
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  YMABidderTokenLoader *tokenLoader = [[YMABidderTokenLoader alloc] init];
  YMABidderTokenRequest *request = [YMABidderTokenRequest interstitial];
  [tokenLoader loadBidderTokenWithRequest:request
                        completionHandler:^(NSString *token) { ... }];

  YMAAdapterIdentity *identity =
      [[YMAAdapterIdentity alloc] initWithAdapterNetworkName:@"AdMob"
                                             adapterVersion:@"1.0.0"
                                      adapterNetworkVersion:@"23.5.0"];
  [YMAYandexAds setAdapterIdentity:identity];
  [YMAYandexAds initializeSDK];
  ```
  ||
  |#

{% endlist %}

### 2. Изменения в BidderTokenRequest

- Класс `BidderTokenRequestConfiguration` переименован в `BidderTokenRequest`. 
- Инициализатор и публичные свойства (`targetInfo`, `bannerAdSize`, `parameters`) перенесены в параметры фабричных методов.

#|
|| **Класс** | **Статус** ||
|| `BidderTokenRequestConfiguration` | Переименован в `BidderTokenRequest` ||
|#

#|
|| **Класс** | **Свойство** | **Статус** ||
|| `BidderTokenRequestConfiguration` | `init(adType: .banner)` + `.bannerAdSize` | Заменено на 
```
BidderTokenRequest.banner(
  size:targeting:parameters:)
```  
||
|| `BidderTokenRequestConfiguration` | `init(adType: .interstitial)` + `.targetInfo` | Заменено на 
```
BidderTokenRequest.interstitial(
  targeting:parameters:)
```  
||
|| `BidderTokenRequestConfiguration` | `init(adType: .rewarded)` + `.targetInfo` | Заменено на 
```
BidderTokenRequest.rewarded(
  targeting:parameters:)
```  
||
|| `BidderTokenRequestConfiguration` | `init(adType: .native)` + `.targetInfo` | Заменено на 
```
BidderTokenRequest.native(
  targeting:parameters:)
``` 
||
|| `BidderTokenRequestConfiguration` | `init(adType: .appOpenAd)` + `.targetInfo` | Заменено на 
```
BidderTokenRequest.appOpenAd(
  targeting:parameters:)
``` 
||
|| `BidderTokenLoader` | 
```
loadBidderToken(
  requestConfiguration:completionHandler:)
``` 
| Переименовано в 
```
loadBidderToken(
  request:completionHandler:)
```
||
|#

**Применимо к**: Адаптеры медиации, использующие `BidderTokenLoader`.

#### Примеры

{% list tabs %}

- Swift

  #|
  || **SDK 7** ||
  ||
  ```swift
  let config = BidderTokenRequestConfiguration(adType: .banner)
  config.bannerAdSize = adSize
  config.targetInfo = adTargetInfo
  tokenLoader.loadBidderToken(requestConfiguration: config) { ... }
  ```
  ||

  || **SDK 8** ||
  ||
  ```swift
  let targeting = AdTargeting()
  let request = BidderTokenRequest.banner(
      size: adSize,
      targeting: targeting,
      parameters: ["key": "value"]
  )
  tokenLoader.loadBidderToken(request: request) { ... }

  // Other ad types:
  let interstitialRequest = BidderTokenRequest.interstitial()
  let rewardedRequest = BidderTokenRequest.rewarded()
  let nativeRequest = BidderTokenRequest.native()
  let appOpenRequest = BidderTokenRequest.appOpenAd()
  ```
  ||
  |#

- Objective-C

  #|
  || **SDK 7** ||
  ||
  ```objc
  YMABidderTokenRequestConfiguration *config =
      [[YMABidderTokenRequestConfiguration alloc] initWithAdType:YMAAdTypeBanner];
  config.bannerAdSize = adSize;
  config.targetInfo = adTargetInfo;
  [tokenLoader loadBidderTokenWithRequestConfiguration:config
                                   completionHandler:^(NSString *token) { ... }];
  ```
  ||

  || **SDK 8** ||
  ||
  ```objc
  YMAAdTargeting *targeting = [[YMAAdTargeting alloc] initWithAge:nil
                                                           gender:nil
                                                         location:nil
                                                     contextQuery:nil
                                                      contextTags:nil];
  YMABidderTokenRequest *request = [YMABidderTokenRequest bannerWithSize:adSize
                                                                 targeting:targeting
                                                               parameters:@{@"key": @"value"}];
  [tokenLoader loadBidderTokenWithRequest:request
                        completionHandler:^(NSString *token) { ... }];

  // Other ad types:
  YMABidderTokenRequest *interstitialRequest = [YMABidderTokenRequest interstitial];
  YMABidderTokenRequest *rewardedRequest = [YMABidderTokenRequest rewarded];
  YMABidderTokenRequest *nativeRequest = [YMABidderTokenRequest native];
  YMABidderTokenRequest *appOpenRequest = [YMABidderTokenRequest appOpenAd];
  ```
  ||
  |#

{% endlist %}

## SwiftUI интеграция

Поддержана интеграция через SwiftUI. См. раздел SwiftUI в конце меню документации iOS:

- [Адаптивный inline-баннер](https://ads.yandex.com/helpcenter/ru/dev/ios/swiftui/adaptive-inline-banner.md)
- [Адаптивный sticky-баннер](https://ads.yandex.com/helpcenter/ru/dev/ios/swiftui/adaptive-sticky-banner.md)
- [Межстраничная реклама](https://ads.yandex.com/helpcenter/ru/dev/ios/swiftui/interstitial.md)
- [Реклама с вознаграждением](https://ads.yandex.com/helpcenter/ru/dev/ios/swiftui/rewarded.md)
- [Реклама при открытии приложения](https://ads.yandex.com/helpcenter/ru/dev/ios/swiftui/app-open-ad.md)

## Миграция с помощью AI-инструментов {#ai}

Для упрощения процесса миграции с SDK 7.x на 8.x вы можете использовать AI-ассистентов с готовым скиллом миграции.

### Как использовать

1. **Загрузите скилл**

    Скилл для миграции доступен в [GitHub Yandex Ads SDK iOS](https://github.com/yandexmobile/yandex-ads-sdk-ios/tree/master/Skills/migrate-yandex-ads-sdk-from-7-to-8).

    - Для Claude Desktop     

        Cкопируйте папку скилла в директорию skills вашего агента, например:

        ```bash
        cp -r Skills/migrate-yandex-ads-sdk-from-7-to-8 .claude/skills/
        ```

    - Для Cursor IDE     
      
        Cкопируйте папку скилла в ваш проект и используйте ссылку на файл `SKILL.md` через `@`, например:

        ```
        @migrate-yandex-ads-sdk-from-7-to-8/SKILL.md
        ```

    - Альтернативный способ
    
        Cкопируйте содержимое `SKILL.md` и всех связанных файлов в диалог с AI-ассистентом (однако это может превысить лимиты сообщения).

2. **Используйте промпт**

    После загрузки скилла используйте следующий промпт в диалоге с AI-ассистентом:

    ```
    Мигрируй мой проект с Yandex Mobile Ads SDK 7.x на 8.x
    ```

{% note warning "" %}

Всегда тщательно проверяйте изменения, сгенерированные AI.

Хотя скиллы помогают AI-ассистентам корректно выполнять задачи, вы должны лично проверять и верифицировать все изменения, внесенные агентом. AI-ассистенты могут допускать ошибки, поэтому ручная проверка кода необходима.

{% endnote %}

## SKAdNetwork

Актуализирован список идентификаторов SKAdNetwork и добавлены инструменты для автоматизации его обновления. Подробнее о способах внедрения и использовании см. в разделе [SKAdNetwork](https://ads.yandex.com/helpcenter/ru/dev/ios/skadnetwork.md).

## Требования

- **Xcode**: 16.4 и выше
- **AppMetricaCore**: 6.0.0 и выше
- **AppMetricaLibraryAdapter**: 6.0.0 и выше
- **AppMetricaAdSupport**: 6.0.0 и выше
- **AppMetricaIDSync**: 6.0.0 и выше


