Rewarded ad (SwiftUI)
Rewarded ads are a popular full-screen ad format, where the user receives a reward for viewing the ad.
The display of this ad type is activated by the user, for instance, to receive a bonus or additional life in a game.
High user motivation makes this ad format the most popular and profitable in free apps.
Appearance
This guide shows how to integrate rewarded ads into an iOS app using SwiftUI. In addition to code examples and instructions, it provides recommendations on using this ad format and links to additional resources.
Prerequisite
- Follow the SDK integration steps described in Quick start.
- Initialize your ad SDK in advance.
- Make sure you're running the latest Yandex Mobile Ads SDK version. If you're using mediation, make sure you're also running the latest version of the unified build.
Implementation
Key steps for integrating rewarded ads in SwiftUI:
- Attach the
.rewardedAd(isPresented:request:onEvent:)modifier. - Control loading via
Binding<AdRequest?>and display viaBinding<Bool>. - Handle
RewardedAdEventevents in theonEventclosure. - Grant the user a reward for watching the ad on the
.didRewardevent.
Rewarded ad integration notes
-
Attempting to load a new ad upon receiving an error in the
.didFailToLoadevent is strongly discouraged. If you need to retry loading from the error handler, limit the number of reload attempts to avoid continuous failed ad requests in case of network connection restrictions. -
Keep the modifier on a view that lives throughout the display scenario.
Loading ads
To load a rewarded ad, set a non-nil AdRequest in the binding passed to .rewardedAd.
To receive notifications about successful or failed loading and other stages, use onEvent with RewardedAdEvent.
import SwiftUI
import YandexMobileAds
struct RewardedView: View {
@State private var adRequest: AdRequest?
@State private var isPresented = false
var body: some View {
VStack {
Button("Load and show") {
adRequest = AdRequest(adUnitID: "R-M-XXXXX-YY")
}
}
.rewardedAd(isPresented: $isPresented, request: $adRequest) { event in
switch event {
case .didLoad:
isPresented = true
case .didDismiss, .didFailToShow, .didFailToLoad:
adRequest = nil
default:
break
}
}
}
}
To load an ad, you will need the ad unit ID obtained from the Yandex Advertising Network interface (adUnitId).
You can extend the ad request parameters via AdRequest by passing user interest data, page context data, location, or other additional data. Additional contextual data in the request can significantly improve ad quality. For more information, see Ad targeting.
Showing the ad
Rewarded advertising is an incentive-based ad format that allows the user to receive a reward for viewing the ad. The reward could be an extra life or advancing to the next level in a game. The reward format is determined at the app level.
After a successful load, the .didLoad event arrives — set isPresented = true to display the ad (or set the display flag in advance; if loading has not yet completed, display will be deferred).
struct RewardedView: View {
@State private var adRequest: AdRequest?
@State private var isPresented = false
var body: some View {
ContentView()
.rewardedAd(isPresented: $isPresented, request: $adRequest) { event in
switch event {
case .didLoad:
isPresented = true
case .didDismiss, .didFailToShow, .didFailToLoad:
adRequest = nil
default:
break
}
}
}
}
Granting a reward
If the ad impression was successfully counted, .didReward(Reward) arrives in onEvent. Use it to grant a reward to the app user. The reward should be granted in the .didReward handler, not relying solely on .didDismiss.
struct RewardedView: View {
@State private var adRequest: AdRequest?
@State private var isPresented = false
var body: some View {
ContentView()
.rewardedAd(isPresented: $isPresented, request: $adRequest) { event in
switch event {
case .didReward(let reward):
sendReward(reward)
case .didDismiss, .didFailToShow, .didFailToLoad:
adRequest = nil
default:
break
}
}
}
private func sendReward(_ reward: Reward) {
// Grant the reward
}
}
Testing rewarded ad integration
Using demo blocks for ad testing
We recommend using test ads to test your ad integration and your app itself.
To guarantee that test ads are returned for every ad request, we created a special demo ad placement ID. Use it to check your ad integration.
Demo adUnitId: demo-rewarded-yandex.
Warning
Before publishing your app to the store, make sure you replace the demo ad unit ID with a real one obtained from the Yandex Advertising Network interface.
You can find the list of available demo ad placement IDs in the Demo ad units for testing section.
Verifying correct ad integration
You can test your ad integration using the native Console tool.
To view detailed logs, call the YMAMobileAds class's enableLogging method.
YMAMobileAds.enableLogging()
To view SDK logs, go to the Console tool and set Subsystem = com.mobile.ads.ads.sdk. You can also filter logs by category and error level.
If you're having problems integrating ads, you'll get a detailed report on the issues and recommendations for how to fix them.
Additional resources
-
Link to GitHub.