iOS SDK Advertisement

The SDK provides APIs for forwarding ad impression and click events from your ad mediator to Magify. This data feeds into analytics and campaign attribution — it is not collected automatically on native iOS. You must forward each impression from the mediator's callback.

Ad campaign types

Use the CampaignType values that represent ad placements when calling impression tracking methods. Only the following types are valid for trackAdsImpression:

Passing any other CampaignType to trackAdsImpression is a no-op and logs a warning.

Track an ad impression tied to a campaign

Call trackAdsImpression(for:impressionData:) in the mediator's impression callback, after the ad is shown, when the impression is presented through one of the CampaignType values above.

magify.trackAdsImpression(for: campaignType, impressionData: impressionData)

The impressionData parameter must be one of AppLovinImpressionData, IronSourceImpressionData, MoPubImpressionData, or CustomImpressionData.

AppLovin MAX

import Magify

// Inside your MARewardedAdDelegate / MAAdRevenueDelegate callback:
func didPayRevenue(for ad: MAAd) {
    let impressionData = AppLovinImpressionData(
        adUnitId: ad.adUnitIdentifier,
        networkName: ad.networkName,
        impressionId: ad.impressionIdentifier,
        revenuePrecision: ad.revenuePrecision,
        revenue: ad.revenue
    )
    magify.trackAdsImpression(for: .rewardedVideo, impressionData: impressionData)
}

Map the AppLovin MAX ad format to the corresponding CampaignType:

  • MAAdFormat.banner / .mrec / .leader.banner
  • MAAdFormat.interstitial.interstitial
  • MAAdFormat.rewarded.rewardedVideo

LevelPlay (IronSource)

import Magify

// Inside your LevelPlayRewardedAdDelegate / impression callback:
func didReceiveImpression(for ad: LevelPlayAdInfo) {
    let impressionData = IronSourceImpressionData(
        adUnitId: ad.adUnitId,
        networkName: ad.networkName,
        instanceName: ad.instanceName,
        instanceId: ad.instanceId,
        revenue: ad.revenue,
        revenuePrecision: ad.revenuePrecision,
        ab: ad.ab,
        auctionId: ad.auctionId,
        segmentName: ad.segmentName,
        lifetimeRevenue: ad.lifetimeRevenue,
        encryptedCPM: ad.encryptedCPM
    )
    magify.trackAdsImpression(for: .rewardedVideo, impressionData: impressionData)
}

MoPub

import Magify

let impressionData = MoPubImpressionData(
    id: impressionData.impressionId,
    adUnitId: impressionData.adUnitID,
    adUnitName: impressionData.adUnitName,
    adUnitFormat: impressionData.adUnitFormat,
    adGroupId: impressionData.adGroupID,
    adGroupName: impressionData.adGroupName,
    adGroupType: impressionData.adGroupType,
    adGroupPriority: impressionData.adGroupPriority,
    country: impressionData.countryCode,
    currency: impressionData.currency,
    networkName: impressionData.networkName,
    networkPlacementId: impressionData.networkPlacementID,
    revenuePrecision: impressionData.precision,
    publisherRevenue: impressionData.publisherRevenue
)
magify.trackAdsImpression(for: .interstitial, impressionData: impressionData)

Custom / in-house mediation

If you report impressions from a direct integration that isn't one of the supported mediators, use CustomImpressionData and pass the mediation's name.

import Magify

let impressionData = CustomImpressionData(
    adUnitId: "rewarded_main",
    mediation: "in-house",
    adUnitName: "Rewarded main",
    networkName: "direct",
    revenuePrecision: "exact",
    publisherRevenue: 0.004,
    publisherCurrency: "USD"
)
magify.trackAdsImpression(for: .rewardedVideo, impressionData: impressionData)

adUnitId and mediation are required; every other field is optional.

Track a base ad impression (basic integration)

If your app isn't presenting ads through the SDK's campaign system (basic integration), call trackBaseAdsImpression(impressionData:) instead. It accepts the same impression data types but doesn't attribute the event to a CampaignType — the SDK files it under a synthetic base campaign/event instead.

magify.trackBaseAdsImpression(impressionData: impressionData)

Every impression reported through either method — as long as it is actually filed — accumulates into lifetime ads revenue, broken down by revenue precision and currency. Read it back from getContext.

Track an ad click

Call trackAdsClick(for:) when the user taps the ad.

magify.trackAdsClick(for: .interstitial)

Pass the same CampaignType used when the impression was tracked.

Track a product click inside an ad

If the ad contains a purchasable product button (e.g. a rewarded offer), call trackAdsPurchaseClick(for:productId:) when the user taps the product.

magify.trackAdsPurchaseClick(for: .rewardedVideo, productId: "com.example.coins_pack")

Impression data types

AppLovinImpressionData

public struct AppLovinImpressionData: ImpressionDataType {
    public let adUnitId: String
    public let networkName: String?
    public let impressionId: String?
    public let revenuePrecision: String?
    public let revenue: Double?
    public let adsLoadTime: Int?
}

adUnitId is the only required field. networkName defaults to "unknown" on the backend when omitted.

IronSourceImpressionData

public struct IronSourceImpressionData: ImpressionDataType {
    public let adUnitId: String
    public let networkName: String?
    public let instanceName: String?
    public let instanceId: String?
    public let revenue: Double?
    public let revenuePrecision: String?
    public let ab: String?
    public let auctionId: String?
    public let segmentName: String?
    public let lifetimeRevenue: Double?
    public let encryptedCPM: String?
    public let adsLoadTime: Int?
}

adUnitId is the only required field. networkName (sent as adNetwork) and instanceId both default to "unknown" on the backend when omitted.

MoPubImpressionData

public struct MoPubImpressionData: ImpressionDataType {
    public let id: String
    public let adUnitId: String
    public let adUnitName: String
    public let adUnitFormat: String
    public let adGroupId: String
    public let adGroupName: String
    public let adGroupType: String
    public let adGroupPriority: Int
    public let country: String
    public let currency: String
    public let networkName: String?
    public let networkPlacementId: String?
    public let revenuePrecision: String?
    public let publisherRevenue: Double?
    public let adsLoadTime: Int?
}

id, adUnitId, adUnitName, adUnitFormat, adGroupId, adGroupName, adGroupType, adGroupPriority, country, and currency are required.

CustomImpressionData

public struct CustomImpressionData: ImpressionDataType {
    public let adUnitId: String
    public let mediation: String
    public let adUnitName: String?
    public let networkName: String?
    public let impressionId: String?
    public let revenuePrecision: String?
    public let publisherRevenue: Double?
    public let publisherCurrency: String?
    public let lifetimeRevenue: Double?
    public let ab: String?
    public let encryptedCPM: String?
    public let adsLoadTime: Int?
}

adUnitId and mediation are required — mediation is what tells the backend where the numbers came from.

All four types conform to ImpressionDataType. Pass nil for any optional field your mediator does not provide.

Next step

For purchase tracking triggered after an ad interaction, see the Purchases section.

Related articles

Magify Service

Your own integration

MagifyManager․Storage

Products

TrustedPurchaseRecord

Popups