# Implement interstitial ads in iOS

> Implement interstitial ads in your iOS app. Load ad content, display it through Objective-C or Swift code, and use a delegate to handle ad events.

## Interstitial ad load example

Use `UADSLoadConfigurationBuilder` to construct a load request with the placement ID, optional mediation metadata, and optional ad markup for bidding, then pass it to `UADSInterstitialAd.load()`. The completion block receives the loaded `UADSInterstitialAd` instance on success. Retain it, as it's required to show the ad later, or an error object on failure.

The example includes mediation metadata and ad markup, which only mediation adapters set. If you integrate Unity Ads directly, omit both values.

Ads expire if they aren't shown within a set time after the SDK loads them. Assign `onAdExpired` on the loaded ad instance to detect this. Attempting to `show()` an expired rewarded ad fails, which is especially important to catch since rewarded ads are often preloaded and held until the user requests a reward. Use the callback to clear your stored reference and issue a new `load()` call so a fresh ad is ready when needed.

1. **Objective-C**

   ```objective-c
   @property (strong) UADSInterstitialAd *interstitialAd;

   UADSLoadConfigurationBuilder *builder =
       [[UADSLoadConfigurationBuilder alloc] initWithPlacementId:placementId];
   builder = [builder withMediationInfo:self.mediationInfo];
   builder = [builder withAdMarkup:bidResponse];

   [UADSInterstitialAd load:[builder build]
               completion:^(UADSInterstitialAd *ad, id<UnityAdsError> error) {
       if (error) {
           NSLog(@"Failed: %ld %@", (long)error.code, error.message);
       } else {
           __weak typeof(self) weakSelf = self;
           ad.onAdExpired = ^(UnityAd *expiredAd) {
               weakSelf.interstitialAd = nil;
               // reload here
           };
       }
   }];
   ```

2. **Swift**

   ```swift
   var interstitialAd: UADSInterstitialAd?

   let config = UADSLoadConfigurationBuilder(placementId: placementId)
     .with(mediationInfo: mediationInfo)
     .with(adMarkup: bidResponse)
     .build()

   UADSInterstitialAd.load(config) { ad, error in
     if let error = error {
         print("Failed: \(error.code) \(error.message)")
     } else {
         self.interstitialAd = ad
             ad?.onAdExpired = { [weak self] _ in
       self?.interstitialAd = nil
       // reload here
       }
     }
   }
   ```

## Interstitial ad show example

Call `show()` on the retained `UADSInterstitialAd` instance, passing a `UADSShowConfiguration` built with the presenting view controller, and a `UADSInterstitialShowDelegate`. The delegate provides callbacks for each stage of the ad's lifecycle: `showDidStart` when the ad displays, `showDidClick` when the user interacts with it, `showDidComplete` when it closes, and `showDidFail` if an error occurs.

1. **Objective-C**

   ```objective-c
   @interface MyDelegate : NSObject <UADSInterstitialShowDelegate>
   @end

   @implementation MyDelegate
   - (void)showDidStart:(UADSInterstitialAd *)unityAd {
   }
   - (void)showDidClick:(UADSInterstitialAd *)unityAd {
   }
   - (void)showDidComplete:(UADSInterstitialAd *)unityAd
                     with:(UADSShowFinishState)finishState {
   }
   - (void)showDidFail:(UADSInterstitialAd *)unityAd
               error:(id<UnityAdsError>)error {
   }
   @end

   UADSShowConfigurationBuilder *builder =
   [[UADSShowConfigurationBuilder alloc] init];
   builder = [builder withViewController:viewController];

   [self.interstitialAd show:[builder build] delegate:delegate];
   ```

2. **Swift**

   ```swift
   class MyDelegate: NSObject, UADSInterstitialShowDelegate {
   func showDidStart(_ unityAd: UADSInterstitialAd) {
   }

   func showDidClick(_ unityAd: UADSInterstitialAd) {
   }

   func showDidComplete(
       _ unityAd: UADSInterstitialAd,
       with finishState: UADSShowFinishState
   ) {
   }

   func showDidFail(
       _ unityAd: UADSInterstitialAd,
       error: UnityAdsError
   ) {
   }
   }

   let config = UADSShowConfigurationBuilder()
   .with(viewController: viewController)
   .build()

   interstitialAd?.show(config, delegate: delegate)
   ```

**Next steps**: To improve your implementation, refer to the [Implement rewarded ads in iOS](/ads-ios/4.20.0/sdk-integration/rewarded-ads.md) documentation.
