# iOS용 커스텀 어댑터 빌드

> 지지대 어댑터 클래스와 광고 유닛 클래스를 생성하고 네트워크 SDK를 초기화하고 광고 유닛 로직을 구현하여 iOS에서 네트워크를 위한 커스텀 어댑터를 개발할 수 있습니다.

이 문서에서는 커스텀 어댑터 빌드 단계와 Unity 레벨플레이 네트워크를 연동하는 데 필요한 리소스 퍼블리셔에게 제공합니다.

## 필수 조건

1. 커스텀 어댑터 등록 [ 양식](https://ironsrc.formtitan.com/Custom-Adapter#/) 작성
2. 사용 가능한 정보가 다음과 같습니다.
   * 어댑터 클래스명
   * 네트워크 설정 키
3. 최신 레벨플레이 SDK 다운로드 [여기](/grow/levelplay/sdk/ios/sdk-integration.md.md)

또한 다음과 같은 베스트 프랙티스를 고려하십시오.

* 코드의 일부로 메인 스레드 요구 사항을 처리해야 합니다.
* 예기치 않은 오류로부터 앱 보호하기 위해 코드 보호 및 예외 처리를 추가해야 합니다.

## 네트워크용 어댑터 만들기

네트워크 어댑터 네트워크 광고 로직을 관리하고 퍼블리셔가 Unity 레벨플레이 설정 일부로 네트워크 광고를 표시할 수 있도록 합니다.

이 프로세스의 일부로 지원하려는 각 광고 유닛에 대한 어댑터 클래스(**BaseAdapter**라고 불림)와 추가 클래스를 생성해야 합니다.

BaseAdapter를 사용하면 네트워크 초기화 프로세스를 비롯한 네트워크 관리를 지원할 수 있으며, 세션 전체에 걸쳐 사용할 수 있는 변수와 상수를 모든 광고 유닛에 대해 정의할 수 있습니다.

광고 유닛 클래스는 광고를 로드, 표시, 관리하기 위한 광고 유닛 로직을 관리하며, 워터폴에 표시되는 각 광고마다 인스턴스화됩니다.

## 네트워크 지지대 어댑터 만들기

네트워크 어댑터를 구현하려면 새 클래스를 생성하고 Ironsource **ISBaseNetworkAdapter** 클래스를 임포트합니다.

어댑터를 만들 때 네트워크 등록 확인 이메일에서 받은 **지지대 어댑터** 이름을 사용합니다.

1. **Objective-C**

   ```objective-c
   #임포트 "IronSource/IronSource.h"
   @interface IS<YourNetworkName>CustomAdapter : ISBaseNetworkAdapter
   ```

2. **Swift**

   ```swift
   @objc(IS<YourNetworkName>CustomAdapter)
   공용 클래스 IS<YourNetworkName>CustomAdapter:ISBaseNetworkAdapter {
      ...
   }
   ```

### 네트워크 SDK 초기화

Unity 레벨플레이 Mediation 모든 초기화 프로세스의 일부로 지지대 어댑터 init 메서드를 호출. 따라서 이 메서드를 여러 번 호출할 수 있습니다.

init 구현의 일환으로 NetworkInitializationListener에 정의된 초기화 콜백을 성공 시(onInitSuccess) 또는 실패 시(onInitFailed) 각각 호출 합니다.

adData 파라미터에는 퍼블리셔 Unity 레벨플레이 플랫폼에서 제공하는 설정 데이터가 포함됩니다. **ISAdData** 클래스 자세히 알아보기 [여기](/grow/levelplay/sdk/ios/custom-adapters.md.md).

1. **Objective-C**

   ```objective-c
   (void)init:(ISAdData *)adData
   대리인:(id<ISNetworkInitializationDelegate>) 대리인 { 
      ... 
      // 처리 오류 
      if(오류 처리) { 
         [delegate onInitDidFailWithErrorCode:ISAdapterErrorMissingParams 
                                 errorMessage:error]; 
      } 
      // init 성공 
      [delegate onInitDidSucceed]; 
   }
   ```

2. **Swift**

   ```swift
   공용 오버라이드 함수 `init` (_ adData: ISAdData, 델리게이트: ISNetworkInitializationDelegate) {
      ... 
      // 처리 오류 
      if(오류 처리) { 
         delegate.onInitDidFailWithErrorCode(ISAdapterErrors.missingParams.rawValue, errorMessage: "Init SDK 실패"
         반환
      } 
      // init 성공 
      delegate.onInitDidSucceed()
      반환        
   }
   ```

### SDK 및 어댑터 버전 제공

이 정보는 현재 퍼블리셔 앱에 구현된 SDK와 어댑터 버전을 나타냅니다. **getNetworkSDKVersion**을 구현할 때는 하드 코딩된 값이 아니라 메서드를 사용하여 어댑터 업데이트와 SDK 지원 측면에서 유연성을 높일 것을 권장합니다.

1. **Objective-C**

   ```objective-c
   - (NSString *) networkSDKVersion {
      반환 [ALSdk 버전];
   }
   - (NSString *) 어댑터Version {
      return kAdapterVersion;
   }
   ```

2. **Swift**

   ```swift
   공용 오버라이드 기능 네트워크SDKVersion() -> 문자열 {
      return  yourNetworkSDKVersion()
   }
   공용 오버라이드 func adapterVersion() -> String {
      return self.customAdapterVersion;
   }
   ```

## 인터스티셜 광고 유닛에 대한 지원 추가

### 인터스티셜 광고 유닛 클래스 생성

인터스티셜 광고 광고 유닛을 관리할 클래스 생성합니다. Ironsource **ISBaseAdAdapter를** 임포트하고 메인 어댑터 파일에 관련 델리게이트를 추가합니다. 이 클래스 퍼블리셔 Load 메서드를 통해 앱에서 새로운 인터스티셜 광고 광고를 트리거할 때마다 활성화됩니다.

Ironsource에서 받은 **인터스티셜 광고 클래스** 이름을 등록 프로세스의 일환으로 사용하십시오.

1. **Objective-C**

   ```objective-c
   #임포트 "IronSource/IronSource.h"
   @interface IS<YourNetworkName>CustomInterstitial : ISBaseInterstitial
   ```

2. **Swift**

   ```swift
   @objc(IS<YourNetworkName>CustomInterstitial)
   공용 클래스 IS<YourNetworkName>CustomInterstitial : ISBaseInterstitial {
      ...
   }
   ```

### 인터스티셜 광고 요청

퍼블리셔가 네트워크에서 인터스티셜 광고를 요청할 수 있도록 **loadAdWithAdData** 메서드를 오버라이드합니다. [ISAdData를 사용하면](/grow/levelplay/sdk/ios/custom-adapters.md.md) 퍼블리셔 입력에 액세스, 접근하고 이 프로세스에 필요한 광고 식별자를 받을 수 있습니다.

광고(**adDidLoad**)의 성공적인 로드와 모든 종류의 오류(**adDidFailToLoadWithErrorType**)에 대해 **ISInterstitialAdDelegate** 콜백을 구현해야 합니다. 미리 정의된 시간 후에 리스너 콜백 트리거되지 않는 경우, 시간 초과로 인해 명상이 로드 프로세스를 중단하고 네트워크에서 광고를 제공할 수 없습니다.

1. **Objective-C**

   ```objective-c
   - (void)loadAdWithAdData:(nonnull ISAdData *)adData
                  delegate:(nonnull id<ISInterstitialAdDelegate>)delegate {

      // Load your ad 
   }
   ```

2. **Swift**

   ```swift
   공용 오버라이드 함수 loadAd(adData 포함): ISAdData, 델리게이트: ISInterstitialAdDelegate) {

      // Load your ad
   }
   ```

### 이용 가능한 광고 여부 확인

퍼블리셔가 각 광고의 준비 상태를 확인할 수 있도록 **isAdAvailableWithAdData** 메서드를 오버라이드한 후 사용자에게 표시합니다. 메서드는 광고가 성공적으로 로드되면 YES를, 현재 로드되지 않은 경우 NO를 반환해야 합니다. 이 작업은 네트워크의 is-ad-available 표시를 사용하거나, **loadAdWithAdData** 및 **showAdWithViewController** 메서드의 일부로 광고 상태를 수동으로 관리하여 수행할 수 있습니다.

1. **Objective-C**

   ```objective-c
   - (BOOL)isAdAvailableWithAdData:(nonnull ISAdData *)adData {
      return _renderedAd != nil;
   }
   ```

2. **Swift**

   ```swift
   public override func isAdAvailable(with adData: ISAdData) -> 부울 {
      ...
      false 반환
   }
   ```

### 인터스티셜 광고 표시

광고가 성공적으로 로드되면 퍼블리셔 광고를 표시할 수 있어야 합니다. 퍼블리셔에게 더 나은 경험을 제공하기 위해 **isAdAvailableWithAdData**가 true인지 확인한 후 **showAdWithViewController** 메서드를 오버라이드할 수 있습니다. 이 메서드에서 수신하는 정보의 일부는 [ISAdData](/grow/levelplay/sdk/ios/custom-adapters.md.md)입니다. 이 오브젝트 사용하면 관련 광고를 표시할 수 있습니다. 쇼를 수행할 수 없는 경우에는 **adDidFailToShowWithErrorCode** 콜백을 반환해야 합니다.

1. **Objective-C**

   ```objective-c
   - (void)showAdWithViewController:(nonnull UIViewController *)viewController
                           adData:(nonnull ISAdData *)adData
                           delegate:(nonnull id<ISInterstitialAdDelegate>)delegate {
      // 광고를 표시할 수 있는지 확인합니다.
      if (CannotShowsAd) {
         [delegate adDidFailToShowWithErrorCode:ISAdapterErrorInternal
                                    errorMessage:nil];
         반환;
      }
      // show 광고 
      [_ad showAd:_renderedAd];
   }
   ```

2. **Swift**

   ```swift
   공용 오버라이드 function showAd(with viewController: UIViewController, adData: ISAdData, 델리게이트: ISInterstitialAdDelegate) {
      // 델리게이트 저장
      self.adDelegate = delegate
         
      // verify you have an ad to show for this configuration
      if isAdReady(withInstanceData: instanceData)) else {
         // return show failed callback
         delegate.adDidFailToShowWithErrorCode(ISAdapterErrors.internal.rawValue, errorMessage: "광고가 현재 인스턴스 데이터에 대해 표시할 준비가 되지 않았음")
         반환
      }

      // show your network interstitial ad
      showInterstitialAd(withInstanceData: instanceData, adDelegate: self)
   }
   ```

### ISInterstitialAdDelegate 콜백을 보고합니다.

네트워크 기능에 따라 **ISInterstitialAdDelegate** 콜백을 오버라이드해야 합니다. 델리게이트 올바르게 보고하면 Unity 레벨플레이 베스트 프랙티스 흐름을 보장하고, 네트워크의 성능 데이터를 Ironsource 플랫폼에 올바르게 반영할 활성화하다, 사용 가능하다 있습니다.

#### 필수 콜백

1. **Objective-C**

   ```objective-c
   // 인터스티셜 광고 광고가 성공적으로 로드되었음을 나타냅니다. 
   - (void)adDidLoad;

   // The interstitial ad failed to load. Use ironSource ErrorTypes (No Fill / Other)
   - (void)adDidFailToLoadWithErrorType:(ISAdapterErrorType)errorType
                              errorCode:(NSInteger)errorCode
                           errorMessage:(NSString*)errorMessage;

   // The interstitial ad was displayed successfully to the user. 노출을 나타냅니다.
   - (void)adDidOpen;

   // User closed the interstitial ad
   - (void)adDidClose;

   // The ad could not be displayed
   - (void)adDidFailToShowWithErrorCode:(NSInteger)errorCode
                           errorMessage:(NSString*)errorMessage;
   ```

2. **Swift**

   ```swift
   // 인터스티셜 광고 광고가 성공적으로 로드되었음을 나타냅니다. 
   public func adDidLoad()

   // The interstitial ad failed to load. Use ironSource ErrorTypes (No Fill / Other)
   public func adDidFailToLoadWith(_ errorType: ISAdapterErrorType, errorCode: Int, errorMessage: 문자열!)

   // The interstitial ad was displayed successfully to the user. 노출을 나타냅니다.
   public func adDidOpen()

   // User closed the interstitial ad
   public func adDidClose()

   // The ad could not be displayed
   public func adDidFailToShowWithErrorCode(_ errorCode: Int, errorMessage: 문자열!)
   ```

#### 콜백(선택 사항)

1. **Objective-C**

   ```objective-c
   // 광고 열기(노출) 외에도 광고 네트워크 리포트에 성공 표시가 있는 경우 구현 
   - (void)adDidShowSucceed;

   // Indicates the ad was clicked
   - (void)adDidClick;
   ```

2. **Swift**

   ```swift
   // 광고 열기(노출) 외에도 광고 네트워크 리포트에 성공 표시가 있는 경우 구현 
   public func adDidShowSucceed()

   // Indicates the ad was clicked
   public func adDidClick()
   ```

### 지지대 어댑터 데이터를 가져오는 방법(선택 사항)

세션 전반에서 지지대 어댑터가 광고 유닛과 관련된 상태나 파라미터를 관리하는 경우에는 **getNetworkAdapter** API를 사용합니다. 여기에는 광고 유닛 API에서 사용해야 하는 지지대 어댑터 일부로 정의된 모든 오브젝트가 포함됩니다.

```objective-c
// example of data retrieved from your network level adapter
IS<yourNetworkName>CustomAdapter *sampleNetworkAdapter = nil;
id<ISAdapterBaseProtocol> 어댑터 = [self getNetworkAdapter];
if ([adapter isKindOfClass:[IS<yourNetworkName>CustomAdapter class]]) {
   sampleNetworkAdapter = (IS<yourNetworkName>CustomAdapter*) adapter;
}
```

## 보상형 비디오 광고 유닛에 대한 지원 추가

### 보상형 비디오 광고 유닛 클래스 생성

인터스티셜 광고 광고 유닛을 관리할 클래스 생성합니다. Ironsource **ISBaseAdAdapter를** 임포트하고 메인 어댑터 파일에 관련 델리게이트를 추가합니다. 이 클래스 퍼블리셔 Load 메서드를 통해 앱에서 새로운 인터스티셜 광고 광고를 트리거할 때마다 활성화됩니다.

등록 프로세스의 일환으로 아이언소스에서 받은 **보상형 비디오 클래스** 이름을 사용하십시오.

1. **Objective-C**

   ```objective-c
   #임포트 "IronSource/IronSource.h"
   @interface IS<YourNetworkName>CustomRewardedVideo : ISBaseRewardedVideo
   ```

2. **Swift**

   ```swift
   @objc(IS<YourNetworkName>CustomRewardedVideo)
   공용 클래스 IS<YourNetworkName>CustomRewardedVideo : ISBaseRewardedVideo {
      ...
   }
   ```

### 보상형 비디오 광고 요청

퍼블리셔가 네트워크에서 인터스티셜 광고를 요청할 수 있도록 **loadAdWithAdData** 메서드를 오버라이드합니다. [ISAdData를 사용하면](/grow/levelplay/sdk/ios/custom-adapters.md.md) 퍼블리셔 입력에 액세스, 접근하고 이 프로세스에 필요한 광고 식별자를 받을 수 있습니다.

광고(**adDidLoad**)를 성공적으로 로드하고 모든 종류의 오류(**adDidFailToLoadWithErrorType**)에 대해 **ISRewardedVideoAdDelegate** 콜백을 구현해야 합니다. 미리 정의된 시간 후에 리스너 콜백 트리거되지 않는 경우, 시간 초과로 인해 명상이 로드 프로세스를 중단하고 네트워크에서 광고를 제공할 수 없습니다.

1. **Objective-C**

   ```objective-c
   - (void)loadAdWithAdData:(nonnull ISAdData *)adData
                  delegate:(nonnull id<ISRewardedVideoAdDelegate>)delegate {

      // Load your ad
   }
   ```

2. **Swift**

   ```swift
   공용 오버라이드 함수 loadAd(adData 포함): ISAdData, 델리게이트: ISRewardedVideoAdDelegate) {

      // Load your ad
   }
   ```

### 이용 가능한 광고 여부 확인

퍼블리셔가 각 광고의 준비 상태를 확인할 수 있도록 **isAdAvailableWithAdData** 메서드를 오버라이드한 후 사용자에게 표시합니다. 메서드는 광고가 성공적으로 로드되면 YES를, 현재 로드되지 않은 경우 NO를 반환해야 합니다. 이 작업은 네트워크의 is-ad-available 표시를 사용하거나, **loadAdWithAdData** 및 **showAdWithViewController** 메서드의 일부로 광고 상태를 수동으로 관리하여 수행할 수 있습니다.

1. **Objective-C**

   ```objective-c
   - (BOOL)isAdAvailableWithAdData:(nonnull ISAdData *)adData {
      ... 
      return _renderedAd != nil;
   }
   ```

2. **Swift**

   ```swift
   public override func isAdAvailable(with adData: ISAdData) -> 부울 {
      ...
      false 반환
   }
   ```

### 보상형 비디오 광고 표시

광고가 성공적으로 로드되면 퍼블리셔 광고를 표시할 수 있어야 합니다. 퍼블리셔에게 더 나은 경험을 제공하기 위해 **isAdAvailableWithAdData**가 true인지 확인한 후 **showAdWithViewController** 메서드를 오버라이드할 수 있습니다. 이 메서드에서 수신하는 정보의 일부는 [ISAdData](/grow/levelplay/sdk/ios/custom-adapters.md.md)입니다. 이 오브젝트 사용하면 관련 광고를 표시할 수 있습니다. 쇼를 수행할 수 없는 경우에는 **adDidFailToShowWithErrorCode** 콜백을 반환해야 합니다.

1. **Objective-C**

   ```objective-c
   - (void)showAdWithViewController:(nonnull UIViewController *)viewController
                           adData:(nonnull ISAdData *)adData
                           delegate:(nonnull id<ISRewardedVideoAdDelegate>)delegate {
      // (CannotShowsAd) {인 경우 광고를 표시할 수 있는지 확인합니다.
         [delegate adDidFailToShowWithErrorCode:ISAdapterErrorInternal
                                 errorMessage:nil];
      
         반환;
      }
      // show ad
      [_ad showAd:_renderedAd];
   }
   ```

2. **Swift**

   ```swift
   공용 오버라이드 function showAd(with viewController: UIViewController, adData: ISAdData, 델리게이트: ISRewardedVideoAdDelegate) {
      // 델리게이트 저장
      self.adDelegate = delegate
         
      // verify you have an ad to show for this configuration
      if isAdReady(withInstanceData: instanceData)) else {
         // return show failed callback
         delegate.adDidFailToShowWithErrorCode(ISAdapterErrors.internal.rawValue, errorMessage: "광고가 현재 인스턴스 데이터에 대해 표시할 준비가 되지 않았음")
         반환
      }

      // show rewarded video ad
      showRewardedVideoAd(withInstanceData: instanceData, adDelegate: self)
   }
   ```

### ISRewardedVideoAdDelegate 콜백을 보고합니다.

네트워크 기능에 따라 **ISRewardedVideoAdDelegate** 콜백을 오버라이드해야 합니다. 델리게이트 올바르게 보고하면 Unity 레벨플레이 Mediation 베스트 프랙티스 흐름을 보장하고, 네트워크의 성능 데이터를 Ironsource 플랫폼에 올바르게 반영할 활성화하다, 사용 가능하다 있습니다.

#### 필수 콜백

1. **Objective-C**

   ```objective-c
   // 보상형 비디오 광고가 성공적으로 로드되었음을 나타냅니다. 
   - (void)adDidLoad;

   // The rewarded video ad failed to load. Use ironSource ErrorTypes (No Fill / Other)
   - (void)adDidFailToLoadWithErrorType:(ISAdapterErrorType)errorType
                              errorCode:(NSInteger)errorCode
                           errorMessage:(NSString*)errorMessage;
   // The rewarded video ad was displayed successfully to the user. 노출을 나타냅니다.
   - (void)adDidOpen;

   // User closed the rewarded video ad
   - (void)adDidClose;

   // The ad could not be displayed
   - (void)adDidFailToShowWithErrorCode:(NSInteger)errorCode
                           errorMessage:(NSString*)errorMessage;

   // User clicked the rewarded video ad
   - (void)adDidClick;

   // User received a reward after watching the ad
   - (void)adRewarded;

   ```

2. **Swift**

   ```swift
   // 보상형 비디오 광고가 성공적으로 로드되었음을 나타냅니다. 
   public func adDidLoad()

   // The rewarded video ad failed to load. Use ironSource ErrorTypes (No Fill / Other)
   public func adDidFailToLoadWith(_ errorType: ISAdapterErrorType, errorCode: Int, errorMessage: 문자열!)

   // The rewarded video ad was displayed successfully to the user. 노출을 나타냅니다.
   public func adDidOpen()

   // User closed the rewarded video ad
   public func adDidClose()

   // The ad could not be displayed
   public func adDidFailToShowWithErrorCode(_ errorCode: Int, errorMessage: 문자열!)

   // User clicked the rewarded video ad
   public func adDidClick()

   // User received a reward after watching the ad
   public func adRewarded()
   ```

#### 콜백(선택 사항)

1. **Objective-C**

   ```objective-c
   // 동영상 광고가 시작되었음을 나타냅니다. 
   - (void)adDidStart;

   // Indicates the video ad ended
   - (void)adDidEnd

   // indicates that ad is displayed on foreground
   - (void)adDidBecomeVisible

   // Implement if in addition to ad-open (impression), your ad network reports also show success indication
   - (void)adDidShowSucceed

   ```

2. **Swift**

   ```swift
   // 동영상 광고가 시작되었음을 나타냅니다. 
   public func adDidStart()

   // Indicates the video ad ended
   public func adDidEnd()

   // Indicates that ad is displayed on foreground
   public func adDidBecomeVisible()

   // Implement if in addition to ad-open (impression), your ad network reports also show success indication
   public func adDidShowSucceed()

   ```

### 지지대 어댑터 데이터를 가져오는 방법(선택 사항)

세션 전반에서 지지대 어댑터가 광고 유닛과 관련된 상태나 파라미터를 관리하는 경우에는 **getNetworkAdapter** API를 사용합니다. 여기에는 광고 유닛 API에서 사용해야 하는 지지대 어댑터 일부로 정의된 모든 오브젝트가 포함됩니다.

```objective-c
// example of data retrieved from your network level adapter
IS<yourNetworkName>CustomAdapter *sampleNetworkAdapter = nil;
id<ISAdapterBaseProtocol> 어댑터 = [self getNetworkAdapter];
if ([adapter isKindOfClass:[IS<yourNetworkName>CustomAdapter class]]) {
   sampleNetworkAdapter = (IS<yourNetworkName>CustomAdapter*) adapter;
}
```

## 배너 광고 유닛에 대한 지원 추가

### 1단계. 배너 광고 유닛 클래스 생성

배너 광고 유닛을 관리할 클래스 생성합니다. 이 클래스 퍼블리셔 Load 메서드를 통해 앱에서 새 배너 광고를 트리거할 때마다 활성화됩니다.

Ironsource에서 받은 **배너 클래스** 이름을 등록 프로세스의 일부로 사용하십시오.

1. **Objective-C**

   ```objective-c
   #임포트 "IronSource/IronSource.h"
   @interface IS<YourNetworkName>CustomBanner : ISBaseBanner
   ```

2. **Swift**

   ```swift
   @objc(IS<YourNetworkName>CustomBanner)
   공용 클래스 IS<YourNetworkName>CustomBanner : ISBaseBanner {

   }
   ```

#### 배너 크기

지원되는 배너 크기에 대한 자세한 내용은 다음 표를 참조하십시오. 커스텀 네트워크는 이러한 크기의 모든 조합 지원할 수 있습니다. 배너 크기는 **loadAdWithAdData** API의 일환으로 파라미터로 수신됩니다.

수신된 배너 크기가 **SMART인 경우** 기기 화면 크기에 따라 크기를 **배너** 또는 **리더보드**로 변경해야 합니다(다음 지침 참조).

| **ISBannerSize**            | **Description**                                          | **점 단위의 크기(WxH)**                                   |
| --------------------------- | -------------------------------------------------------- | --------------------------------------------------- |
| **ISBannerSize\_BANNER**    | 표준 배너                                                    | 320 x 50                                            |
| **ISBannerSize\_LARGE**     | 대형 배너                                                    | 320 x 90                                            |
| **ISBannerSize\_RECTANGLE** | 중간 직사각형(MREC)                                            | 300 x 250                                           |
| **ISBannerSize\_SMART**     | 스마트 배너iPhone 및 iPad의 크기와 방향, 방향 설정 조정하기 위해 자동으로 광고를 렌더링) | If (iPhone ≤ 720) 320 x 50 If (iPad > 720) 728 x 90 |

### 2단계. 배너 광고 요청

퍼블리셔가 네트워크로부터 배너 광고를 요청할 수 있도록 **loadAdWithAdData** 메서드를 오버라이드합니다. 이 [ISAdData를 사용하면](/grow/levelplay/sdk/ios/custom-adapters.md.md) 퍼블리셔 입력에 액세스, 접근하고 이 프로세스에 필요한 광고 식별자를 수신할 수 있으며, ISBannerSize는 요청한 배너 크기를 나타냅니다.

1. **Objective-C**

   ```objective-c
   - (void)loadAdWithAdData:(nonnull ISAdData *)adData
      viewController:(UIViewController *)viewController
            크기(ISBannerSize *)
         델리게이트(nonnull id<ISBannerAdDelegate>) 델리게이트{
   }

   ```

2. **Swift**

   ```swift
   공용 오버라이드 함수 loadAd(adData 포함): ISAdData, viewController: UIViewController, 크기: ISBannerSize, delegate: ISBannerAdDelegate){
   }
   ```

### 3단계. 배너 파괴

ironsource 는 앱 개발자가 다음 destroyAdWithAdData 메서드를 구현하여 배너 광고를 삭제하도록 요구합니다.

1. **Objective-C**

   ```objective-c
   public void destroyAdWithAdData:(nonnull ISAdData *)adData {}
   ```

2. **Swift**

   ```swift
   public override func destroyAd(with adData: ISAdData){}
   ```

> **Note:**
>
> 네트워크 SDK가 이 종류의 API 지원하지 않는 경우 빈 를 추가해야 합니다.
> 구현

### 4단계. ISBannerAdDelegate 콜백을 보고합니다.

네트워크 기능에 따라 ISBannerAdDelegate 콜백을 보고합니다. 이렇게 하면 네트워크의 성능 데이터가 Ironsource 플랫폼에 올바르게 반영됩니다.

#### 필수 콜백

1. **Objective-C**

   ```objective-c
    // 배너 광고가 성공적으로 로드되었음을 나타냅니다 -
   (void)adDidLoadWithView:(UIView *) view // 배너 광고를 로드할 수 없습니다. 사용
   Ironsource 오류 타입(보여줄 광고 없음(no fill)
   -(void)adDidFailToLoadWithErrorType:(ISAdapterErrorType)errorType
   errorCode:(NSInteger)errorCode errorMessage:(nullable NSString*)errorMessage
   // 배너 광고가 사용자 성공적으로 표시됩니다. 이는
   Ironsource 플랫폼에서 노출을 확인합니다. -(void)adDidOpen // 광고를 나타냅니다.
   클릭함 -(void)adDidClick 
   ```

2. **Swift**

   ```swift
   // 배너 광고가 공용 기능으로 성공적으로 로드되었음을 나타냅니다.
   adDidLoad(_ bannerView: UIView) // 배너 광고를 로드하지 못했습니다. 사용
   Ironsource ErrorTypes (보여줄 광고 없음(no fill) / Other) 공용 function adDidFailToLoadWith(_
   errorType: ISAdapterErrorType, errorCode: Int, errorMessage: 문자열! //
   배너 광고가 사용자 성공적으로 표시되었습니다. 이는
   ironsource 플랫폼에 대한 노출입니다. 공용 기능 adDidOpen() //
   an ad was clicked public func adDidClick() 
   ```

> **Note:**
>
> 네트워크에서 반환한 배너 뷰 전달

#### 콜백(선택 사항)

1. **Objective-C**

   ```objective-c
   //클릭 후, 그리고 사용자
   앱에서 제거됨 - (void)adWillLeaveApplication // 호출해야 함
   광고 뷰가 전체 화면 콘텐츠 표시한 후(void)adWillPresentScreen; -
   (void)adWillPresentScreen // 전체 화면 콘텐츠 후에 호출되어야 함
   이 해제됨 - (void)adDidDismissScreen 
   ```

2. **Swift**

   ```swift
   //클릭 후, 그리고 사용자 제거되기 전에 호출되어야 합니다.
   앱의 - (void)adWillLeaveApplication // 광고 후에 호출되어야 함
   view는 전체 화면 콘텐츠 표시합니다- (void)adWillPresentScreen; -
   (void)adWillPresentScreen // 전체 화면 콘텐츠 후에 호출되어야 함
   이 해제됨 - (void)adDidDismissScreen 
   ```

## 어댑터 사용하여 퍼블리셔 입력 액세스, 접근.

커스텀 어댑터 등록 프로세스의 일환으로 앱 및 인스턴스 레벨 키를 제공했습니다.

이러한 키의 값은 퍼블리셔가 **Unity LevelPlay** **플랫폼 설정**에서 정의합니다. 이 값은 ISAdData 오브젝트 사용하여 런타임 시점에 사용할 수 있습니다.

**ISAdData** 오브젝트에는 설정 값이 포함된 맵이 있으며, 어댑터 및 광고 유닛 클래스 API의 일부입니다. 이 파라미터는 init, **loadAdWithAdData**, **showAdWithViewController** 및 **isAdAvailableWithAdData** 메서드에서 사용할 수 있습니다.

등록 확인 이메일의 일부로 수신한 이름을 사용하여 **ISAdData** 맵 구조체, 구조체에서 값에 액세스, 접근할 수 있습니다.

1. **Objective-C**

   ```objective-c
   // 퍼블리셔 설정 파라미터 가져오기 
   NSString *appLevelParam1 = ISAdData.configuration[<YourAppLevelParam1>];
   NSString *instanceLevelParam1 = ISAdData.configuration[<YourInstanceLevelParam1>];
   NSString *instanceLevelParam2 = ISAdData.configuration[<YourInstanceLevelParam2>];
   ```

2. **Swift**

   ```swift
   // 퍼블리셔 설정 파라미터 가져오기 
   self.appData = adData.getString(IS<YourNetworkName>CustomAdapter.<YourAppLevelParam>);
   self.instanceData1 = adData.getString(IS<YourNetworkName>CustomAdapter.<YourInstanceLevelParam1>);
   self.instanceData2 = adData.getString(IS<YourNetworkName>CustomAdapter.<YourInstanceLevelParam2>);
   ```

## Ironsource 오류 코드 및 오류 유형 사용

### 오류 유형

이는 **adDidFailToLoadWithErrorType** 델리게이트와 관련이 있습니다.

| 오류 유형                      | Description           |
| -------------------------- | --------------------- |
| ISAdapterErrorTypeNoFill   | 표시할 수 있는 광고가 없을 때 사용  |
| ISAdapterErrorTypeInternal | 네트워크에서 보고한 다른 이유로 사용됨 |

### 오류 코드

이러한 오류 코드는 **adDidFailToLoadWithErrorType** 및 **adDidFailToShowWithErrorCode** 델리게이트와 관련이 있습니다.

| 오류 코드                       | Description                             |
| --------------------------- | --------------------------------------- |
| ISAdapterErrorMissingParams | API 호출 시 일부 필수 정보를 사용할 수 없어서 행동 실패했습니다. |
| ISAdapterErrorAdExpired     | 를 사용하여 광고 만료 여부를 나타냅니다.                 |
| ISAdapterErrorInternal      | 네트워크에서 보고한 기타 오류에 사용                    |

## 어댑터 디버깅(선택 사항)

디버그 로그를 지원하려면 앱에서 **setAdapterDebug** 메서드를 구현하고 호출하십시오. 이는 **ISBaseNetworkAdapter**의 일부로 이루어져야 합니다.

1. **Objective-C**

   ```objective-c
   - (void) setAdapterDebug:(BOOL) adapterDebug {
      _adapterDebug = adapterDebug;
   }
   ```

2. **Swift**

   ```swift
   공용 오버라이드 기능 setAdapterDebug(_ adapterDebug: bool) {
   self.adapterDebug = adapterDebug
   }
   ```
