Skip to main content

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​

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]