Examples
Complete working examples for all ad formats in both UIKit and SwiftUI.
đ Full UIKit Example (Banner)â
Complete implementation showing SDK initialization and banner ad loading:
import UIKit
import OCMAdNetworkIOS
class ViewController: UIViewController {
// MARK: - Properties
private var bannerView: OcmBannerView = {
let banner = OcmBannerView()
banner.translatesAutoresizingMaskIntoConstraints = false
banner.backgroundColor = .lightGray
return banner
}()
private var loadButton: UIButton = {
let button = UIButton()
button.backgroundColor = .lightGray
button.layer.cornerRadius = 12
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Load Banner", for: .normal)
return button
}()
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
addBannerToView()
initOcmSDK()
}
// MARK: - Private methods
private func addBannerToView() {
view.addSubview(bannerView)
view.addSubview(loadButton)
NSLayoutConstraint.activate([
bannerView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
bannerView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
bannerView.heightAnchor.constraint(equalToConstant: 250),
bannerView.widthAnchor.constraint(equalToConstant: 300),
loadButton.topAnchor.constraint(equalTo: bannerView.bottomAnchor, constant: 45),
loadButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 32),
loadButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32),
])
loadButton.addTarget(self, action: #selector(load), for: .touchUpInside)
}
private func initOcmSDK() {
Task {
do {
let config = OcmConfigBuilder()
.adUnit(id: "1001-sreq-test-300x250-imp-1", format: "banner", size: "300x250")
.gam(networkCode: "75351959", adUnitPath: "/75351959/testadunit/test_app_320x50")
.privacyFromSdk(gdpr: 0, ccpa: "", coppa: 0)
.build()
try await OcmAdNetworkSDK.initialize(with: config)
print("â
SDK initialized")
} catch let error {
print("â SDK init failed: \(error.localizedDescription)")
}
}
}
@objc private func load() {
bannerView.load(adUnitId: "1001-sreq-test-300x250-imp-1", delegate: self)
}
}
// MARK: - OcmBannerViewDelegate
extension ViewController: OcmBannerViewDelegate {
func onAdLoaded() {
print(#function)
}
func onAdFailed(_ error: any Error) {
print(#function)
print(error.localizedDescription)
}
func onAdClicked() {
print(#function)
}
func onImpression() {
print(#function)
}
func didReceiveAd(_ bannerView: OcmBannerView) {
print(#function)
}
func didFailToReceiveAd(_ bannerView: OcmBannerView, error: Error) {
print(#function)
print(error.localizedDescription)
}
}
đ§Š SwiftUI Integrationâ
Banner Example (SwiftUI)â
import SwiftUI
import OCMAdNetworkIOS
struct OcmBannerAdView: UIViewRepresentable {
let adUnitId: String
func makeUIView(context: Context) -> OcmBannerView {
let banner = OcmBannerView()
banner.translatesAutoresizingMaskIntoConstraints = false
banner.load(adUnitId: adUnitId, delegate: context.coordinator)
return banner
}
func updateUIView(_ uiView: OcmBannerView, context: Context) {}
func makeCoordinator() -> Coordinator {
Coordinator()
}
class Coordinator: NSObject, OcmBannerViewDelegate {
func onAdLoaded() { print("â
Banner Loaded") }
func onAdFailed(_ error: any Error) { print("â Failed: \(error.localizedDescription)") }
func onAdClicked() { print("đ Clicked") }
func onImpression() { print("đ Impression") }
}
}
Usage in ContentViewâ
struct ContentView: View {
@State var isLoaded = false
var body: some View {
VStack {
Text("Banner Ad")
if isLoaded {
OcmBannerAdView(adUnitId: "1001-sreq-test-300x250-imp-1")
.frame(width: 300, height: 250)
}
}
.onAppear {
Task {
do {
try await OcmAdNetworkSDK.initialize(publisherId: "test_pub_001")
isLoaded = true
} catch {
isLoaded = false
print("â SDK init failed: \(error.localizedDescription)")
}
}
}
}
}
Interstitial Example (SwiftUI)â
import SwiftUI
import OCMAdNetworkIOS
struct InterstitialAdPresenter: UIViewControllerRepresentable {
let loader: OcmInterstitialLoader
func makeUIViewController(context: Context) -> UIViewController {
let vc = UIViewController()
DispatchQueue.main.async {
if loader.isAdReady() {
loader.showAd(from: vc)
} else {
print("âŗ Not ready")
}
}
return vc
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
}
Usage in ContentViewâ
struct ContentView: View {
@State private var loader: OcmInterstitialLoader?
@State private var showAd = false
var body: some View {
VStack {
Button("Show Interstitial") {
if let loader = loader, loader.isAdReady() {
showAd = true
} else {
print("âŗ Interstitial not Ready")
}
}
}
.background(
Group {
if showAd, let loader = loader {
InterstitialAdPresenter(loader: loader)
.frame(width: 0, height: 0)
}
}
)
.onAppear {
Task {
try? await OcmAdNetworkSDK.initialize(publisherId: "test_pub_001")
let newLoader = OcmInterstitialLoader(
prebidConfigAdId: "1001-sreq-test-300x250-imp-1",
gamAdUnitId: "/75351959/testadunit/test_app_interstitial"
)
newLoader.delegate = InterstitialDelegate.shared
newLoader.loadAd()
loader = newLoader
}
}
}
}
Delegate for Interstitialâ
class InterstitialDelegate: NSObject, OcmInterstitialLoaderDelegate {
@MainActor static let shared = InterstitialDelegate()
func onInterstitialLoaded() {
print("â
Interstitial loaded")
}
func onInterstitialFailedToLoad(reason: String) {
print("â Interstitial load failed: \(reason)")
}
func onInterstitialShown() {
print("đŦ Interstitial shown")
}
func onInterstitialClicked() {}
func onInterstitialClosed() {}
}
Rewarded Example (SwiftUI)â
import SwiftUI
import OCMAdNetworkIOS
final class RewardedCoordinator: NSObject, ObservableObject {
@Published var isReady: Bool = false
private var loader: OcmRewardedLoader?
override init() {
super.init()
loader = OcmRewardedLoader(adUnitId: "ca-app-pub-3940256099942544/5224354917")
loader?.delegate = self
}
func loadRewardedAd() {
loader?.load()
}
@MainActor
func presentAd() {
guard let rootVC = UIApplication.shared
.connectedScenes
.compactMap({ ($0 as? UIWindowScene)?.keyWindow?.rootViewController })
.first else {
print("â No rootViewController")
return
}
loader?.show(from: rootVC)
}
}
Usage in ContentViewâ
struct ContentView: View {
@StateObject private var coordinator = RewardedCoordinator()
var body: some View {
VStack(spacing: 32) {
Button("Show Rewarded Ad") {
coordinator.presentAd()
}
.disabled(!coordinator.isReady)
.padding()
.background(coordinator.isReady ? Color.green : Color.gray)
.foregroundColor(.white)
.cornerRadius(10)
}
.onAppear {
coordinator.loadRewardedAd()
}
}
}
Delegate for Rewardedâ
extension RewardedCoordinator: OcmRewardedLoaderDelegate {
func rewardedLoaderDidLoadAd(_ loader: OcmRewardedLoader) {
print("â
Ad is ready")
self.isReady = true
}
func rewardedLoader(_ loader: OcmRewardedLoader, didFailToLoadAdWithCode code: Int, message: String) {
print("â Failed to load ad: [\(code)] \(message)")
self.isReady = false
}
func rewardedLoaderDidPresentAd(_ loader: OcmRewardedLoader) {
print("đē Ad is presented")
}
func rewardedLoaderDidDismissAd(_ loader: OcmRewardedLoader) {
print("â
Ad dismissed")
self.isReady = false
}
func rewardedLoader(_ loader: OcmRewardedLoader, didFailToPresentAdWithCode code: Int, message: String) {
print("â Failed to present ad: [\(code)] \(message)")
self.isReady = false
}
func rewardedLoader(_ loader: OcmRewardedLoader, didEarnReward result: RewardedResult) {
print("đ User earned reward: \(result)")
}
}
Native Ad Example (SwiftUI)â
import SwiftUI
import UIKit
import OCMAdNetworkIOS
import GoogleMobileAds
final class NativeAdViewModel: NSObject, ObservableObject {
@Published var sdkReady = false
private var loaderNative: OcmNativeAdLoader?
private weak var containerView: UIView?
func initializeSDK() {
Task {
do {
try await OcmAdNetworkSDK.initialize(publisherId: "test_pub_001")
print("â
SDK initialized")
sdkReady = true
setupNativeIfPossible()
} catch {
print("â SDK init failed: \(error.localizedDescription)")
}
}
}
private func setupNativeIfPossible() {
guard sdkReady else { return }
guard let containerView else { return }
guard let rootVC = UIApplication.shared.connectedScenes
.compactMap({ ($0 as? UIWindowScene)?.keyWindow?.rootViewController })
.first else {
print("â No rootViewController")
return
}
loaderNative = OcmNativeAdLoader(
gamAdUnitId: "/6499/example/native",
rootViewController: rootVC,
containerView: containerView,
delegate: self
)
}
@MainActor
func showAd() {
guard let loaderNative else {
print("âšī¸ Loader not ready yet")
return
}
loaderNative.load()
}
func attach(container: UIView) {
self.containerView = container
setupNativeIfPossible()
}
}
extension NativeAdViewModel: OcmNativeAdLoaderDelegate {
func customNativeAdDidLoad(_ ad: CustomNativeAd, into view: UIView) {
print("â
CustomNativeAd loaded")
}
func nativeAdDidLoad(_ ad: GoogleMobileAds.NativeAd, into view: UIView) {
print("â
nativeAd loaded")
}
func nativeAdFailedToLoad(error: String) {
print("â nativeAd Failed: \(error)")
}
}
Usage in ContentViewâ
struct ContentView: View {
@StateObject private var vm = NativeAdViewModel()
var body: some View {
VStack(spacing: 16) {
// Native ad container
NativeContainerView()
.environmentObject(vm)
.frame(height: 320)
.background(Color(UIColor.secondarySystemBackground))
.cornerRadius(12)
Button("Show Ad") {
vm.showAd()
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
.padding()
.onAppear {
vm.initializeSDK()
}
}
}
Best Practicesâ
1. Initialize Onceâ
Always initialize the SDK once when your app launches:
@main
struct MyApp: App {
init() {
Task {
try? await OcmAdNetworkSDK.initialize(publisherId: "your_publisher_id")
}
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
2. Preload Adsâ
For better user experience, preload ads before showing them:
// In viewDidLoad or onAppear
interstitialLoader.loadAd()
// Later, when needed
if interstitialLoader.isAdReady() {
interstitialLoader.showAd(from: self)
}
3. Handle Errors Gracefullyâ
Always implement error delegates:
func onAdFailed(_ error: Error) {
print("Ad failed: \(error.localizedDescription)")
// Optionally: Show fallback content or retry
}
4. Respect Privacyâ
Check for user consent before showing personalized ads:
import AppTrackingTransparency
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization { status in
let hasConsent = (status == .authorized)
// Use hasConsent in your privacy config
}
}
đ ī¸ Upcoming Featuresâ
- React Native wrapper
- Flutter plugin
- UI Customization options
đ Supportâ
For support and documentation, contact us at [email protected]