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→.bannerMAAdFormat.interstitial→.interstitialMAAdFormat.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.