> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cloudx.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Rewarded Ads

> Integrate CloudX rewarded ads in iOS apps

<CodeGroup>
  ```objc Objective-C theme={null}
  @interface YourViewController () <CLXRewardedDelegate, CLXAdRevenueDelegate>
  @property (nonatomic, strong) CLXRewarded *rewardedAd;
  @property (nonatomic, assign) NSInteger retryAttempt;
  @end

  @implementation YourViewController

  - (void)createRewardedAd {
      self.rewardedAd = [[CloudXCore shared] createRewardedWithAdUnitId:@"your-rewarded-ad-unit-id"];
      self.rewardedAd.delegate = self;
      self.rewardedAd.revenueDelegate = self;
      [self.rewardedAd load];
  }

  - (void)showRewardedAd {
      if (self.rewardedAd.isReady) {
          // Basic show
          [self.rewardedAd showFromViewController:self];

          // Or with optional placement and custom data for tracking
          // [self.rewardedAd showFromViewController:self placement:@"bonus_coins" customData:@"level:5,coins:100"];
      } else {
          NSLog(@"Rewarded ad not ready");
      }
  }

  - (void)dealloc {
      [self.rewardedAd destroy];
  }

  #pragma mark - CLXRewardedDelegate

  - (void)didLoadAd:(CLXAd *)ad {
      NSLog(@"Rewarded ad loaded from %@", ad.networkName);
      self.retryAttempt = 0;
  }

  - (void)didFailToLoadAd:(NSString *)adUnitId error:(CLXError *)error {
      NSLog(@"Rewarded ad failed to load: %@", error.localizedDescription);
      self.retryAttempt++;
      NSTimeInterval delay = pow(2.0, MIN(5, self.retryAttempt));
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [self.rewardedAd load];
      });
  }

  - (void)didDisplayAd:(CLXAd *)ad {
      NSLog(@"Rewarded ad displayed");
  }

  - (void)didFailToDisplayAd:(CLXAd *)ad error:(CLXError *)error {
      NSLog(@"Rewarded ad failed to display: %@", error.localizedDescription);
      [self.rewardedAd load];
  }

  - (void)didHideAd:(CLXAd *)ad {
      NSLog(@"Rewarded ad hidden");
      [self.rewardedAd load]; // Reload for next use
  }

  - (void)didClickAd:(CLXAd *)ad {
      NSLog(@"Rewarded ad clicked");
  }

  - (void)didRewardUserForAd:(CLXAd *)ad withReward:(CLXReward *)reward {
      NSLog(@"User rewarded: %ld %@", (long)reward.amount, reward.label);
      // Grant the reward to the user
  }

  #pragma mark - CLXAdRevenueDelegate

  - (void)didPayRevenueForAd:(CLXAd *)ad {
      NSLog(@"Rewarded revenue: %@ from %@", ad.revenue, ad.networkName);
  }

  @end
  ```

  ```swift Swift theme={null}
  class YourViewController: UIViewController, CLXRewardedDelegate, CLXAdRevenueDelegate {
      private var rewardedAd: CLXRewarded?
      private var retryAttempt = 0

      func createRewardedAd() {
          rewardedAd = CloudXCore.shared.createRewarded(adUnitId: "your-rewarded-ad-unit-id")
          rewardedAd?.delegate = self
          rewardedAd?.revenueDelegate = self
          rewardedAd?.load()
      }

      func showRewardedAd() {
          if rewardedAd?.isReady == true {
              // Basic show
              rewardedAd?.show(from: self)

              // Or with optional placement and custom data for tracking
              // rewardedAd?.show(from: self, placement: "bonus_coins", customData: "level:5,coins:100")
          } else {
              print("Rewarded ad not ready")
          }
      }

      deinit {
          rewardedAd?.destroy()
      }

      // MARK: - CLXRewardedDelegate

      func didLoad(_ ad: CLXAd) {
          print("Rewarded ad loaded from \(ad.networkName ?? "unknown")")
          retryAttempt = 0
      }

      func didFailToLoadAd(_ adUnitId: String, error: CLXError) {
          print("Rewarded ad failed to load: \(error.localizedDescription)")
          retryAttempt += 1
          let delay = pow(2.0, Double(min(5, retryAttempt)))
          DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in
              self?.rewardedAd?.load()
          }
      }

      func didDisplay(_ ad: CLXAd) {
          print("Rewarded ad displayed")
      }

      func didFailToDisplay(_ ad: CLXAd, error: CLXError) {
          print("Rewarded ad failed to display: \(error.localizedDescription)")
          rewardedAd?.load()
      }

      func didHide(_ ad: CLXAd) {
          print("Rewarded ad hidden")
          rewardedAd?.load() // Reload for next use
      }

      func didClick(_ ad: CLXAd) {
          print("Rewarded ad clicked")
      }

      func didRewardUser(for ad: CLXAd, with reward: CLXReward) {
          print("User rewarded: \(reward.amount) \(reward.label)")
          // Grant the reward to the user
      }

      // MARK: - CLXAdRevenueDelegate

      func didPayRevenue(for ad: CLXAd) {
          print("Rewarded revenue: \(ad.revenue ?? 0) from \(ad.networkName ?? "unknown")")
      }
  }
  ```
</CodeGroup>
