Commit c8ec630f by Demid Merzlyakov

Merge branch 'feature/IOS-74-apps-flyer' into develop

# Conflicts:
#	1Weather/Model/Settings/Settings.swift
#	Podfile.lock
#	Pods/Manifest.lock
#	Pods/Pods.xcodeproj/project.pbxproj
#	Pods/Target Support Files/Pods-1Weather/Pods-1Weather.debug.xcconfig
#	Pods/Target Support Files/Pods-1Weather/Pods-1Weather.release.xcconfig
parents 1b95cad5 d4413172
...@@ -213,6 +213,7 @@ ...@@ -213,6 +213,7 @@
CE376C98261EE484000B1159 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CE376C97261EE484000B1159 /* LaunchScreen.storyboard */; }; CE376C98261EE484000B1159 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CE376C97261EE484000B1159 /* LaunchScreen.storyboard */; };
CE3A36C72638A77E002CACC3 /* BlendFIPSSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3A36C62638A77E002CACC3 /* BlendFIPSSource.swift */; }; CE3A36C72638A77E002CACC3 /* BlendFIPSSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3A36C62638A77E002CACC3 /* BlendFIPSSource.swift */; };
CE3A36ED2638A825002CACC3 /* FIPSResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3A36EC2638A825002CACC3 /* FIPSResponse.swift */; }; CE3A36ED2638A825002CACC3 /* FIPSResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3A36EC2638A825002CACC3 /* FIPSResponse.swift */; };
CE3C1DB6265536360031BD72 /* AppsFlyerAnalyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3C1DB5265536360031BD72 /* AppsFlyerAnalyticsService.swift */; };
CE578FD325F7E89400E8B85D /* DayTimeWeather.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE578FD225F7E89400E8B85D /* DayTimeWeather.swift */; }; CE578FD325F7E89400E8B85D /* DayTimeWeather.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE578FD225F7E89400E8B85D /* DayTimeWeather.swift */; };
CE578FE525FB415F00E8B85D /* CityCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE578FE225FB415F00E8B85D /* CityCell.swift */; }; CE578FE525FB415F00E8B85D /* CityCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE578FE225FB415F00E8B85D /* CityCell.swift */; };
CE578FE625FB415F00E8B85D /* LocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE578FE325FB415F00E8B85D /* LocationViewController.swift */; }; CE578FE625FB415F00E8B85D /* LocationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE578FE325FB415F00E8B85D /* LocationViewController.swift */; };
...@@ -547,6 +548,7 @@ ...@@ -547,6 +548,7 @@
CE376C97261EE484000B1159 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; }; CE376C97261EE484000B1159 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
CE3A36C62638A77E002CACC3 /* BlendFIPSSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlendFIPSSource.swift; sourceTree = "<group>"; }; CE3A36C62638A77E002CACC3 /* BlendFIPSSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlendFIPSSource.swift; sourceTree = "<group>"; };
CE3A36EC2638A825002CACC3 /* FIPSResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FIPSResponse.swift; sourceTree = "<group>"; }; CE3A36EC2638A825002CACC3 /* FIPSResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FIPSResponse.swift; sourceTree = "<group>"; };
CE3C1DB5265536360031BD72 /* AppsFlyerAnalyticsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppsFlyerAnalyticsService.swift; sourceTree = "<group>"; };
CE578FD225F7E89400E8B85D /* DayTimeWeather.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayTimeWeather.swift; sourceTree = "<group>"; }; CE578FD225F7E89400E8B85D /* DayTimeWeather.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayTimeWeather.swift; sourceTree = "<group>"; };
CE578FE225FB415F00E8B85D /* CityCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CityCell.swift; sourceTree = "<group>"; }; CE578FE225FB415F00E8B85D /* CityCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CityCell.swift; sourceTree = "<group>"; };
CE578FE325FB415F00E8B85D /* LocationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationViewController.swift; sourceTree = "<group>"; }; CE578FE325FB415F00E8B85D /* LocationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationViewController.swift; sourceTree = "<group>"; };
...@@ -1621,6 +1623,7 @@ ...@@ -1621,6 +1623,7 @@
CEF959642600C2F900975FAA /* AnalyticsService.swift */, CEF959642600C2F900975FAA /* AnalyticsService.swift */,
CEF959732600C3A400975FAA /* FlurryAnalyticsService.swift */, CEF959732600C3A400975FAA /* FlurryAnalyticsService.swift */,
CEF9598F2600C5A800975FAA /* MoEngageAnalyticsService.swift */, CEF9598F2600C5A800975FAA /* MoEngageAnalyticsService.swift */,
CE3C1DB5265536360031BD72 /* AppsFlyerAnalyticsService.swift */,
); );
path = Services; path = Services;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -2070,6 +2073,7 @@ ...@@ -2070,6 +2073,7 @@
CD37D3FE260DF726002669D6 /* SettingsCellFactory.swift in Sources */, CD37D3FE260DF726002669D6 /* SettingsCellFactory.swift in Sources */,
CD8E041625F8F91B001785B6 /* ForecastCellFactory.swift in Sources */, CD8E041625F8F91B001785B6 /* ForecastCellFactory.swift in Sources */,
87C1720D25FF870600DA3464 /* GeoNamesPlace.swift in Sources */, 87C1720D25FF870600DA3464 /* GeoNamesPlace.swift in Sources */,
CE3C1DB6265536360031BD72 /* AppsFlyerAnalyticsService.swift in Sources */,
CE8962A826175DF500CA274A /* _CoreCurrentWeather.swift in Sources */, CE8962A826175DF500CA274A /* _CoreCurrentWeather.swift in Sources */,
CEFB857A2617510700C5CDD2 /* 1WModel.xcdatamodeld in Sources */, CEFB857A2617510700C5CDD2 /* 1WModel.xcdatamodeld in Sources */,
CDC70833260FBFD4004A1974 /* UnitPressure+Atmosphere.swift in Sources */, CDC70833260FBFD4004A1974 /* UnitPressure+Atmosphere.swift in Sources */,
......
...@@ -15,7 +15,7 @@ public class Analytics { ...@@ -15,7 +15,7 @@ public class Analytics {
self.services = services self.services = services
} }
public static let shared = Analytics(services: [FlurryAnalyticsService(), MoEngageAnalyticsService()]) public static let shared = Analytics(services: [FlurryAnalyticsService(), MoEngageAnalyticsService(), AppsFlyerAnalyticsService()])
public func log(event: AnalyticsEvent, params: [AnalyticsParameter: Any]? = nil) { public func log(event: AnalyticsEvent, params: [AnalyticsParameter: Any]? = nil) {
var loggedTo = [String]() var loggedTo = [String]()
......
...@@ -7,6 +7,10 @@ ...@@ -7,6 +7,10 @@
import Foundation import Foundation
/// See
/// https://inmobi.sharepoint.com/:x:/r/sites/blend-all/_layouts/15/guestaccess.aspx?e=KujQS1&share=EROF-1U3ZkVCstR4vAIN8kgB2emhefIzh5yZnZ4v02oIyQ
/// for reference
public enum AnalyticsEvent: String { public enum AnalyticsEvent: String {
//TODO: rename to Swifty names. This is a legacy from the old app. //TODO: rename to Swifty names. This is a legacy from the old app.
case ANALYTICS_LAUNCH_FROM_WIDGET = "LAUNCH FROM WIDGET" // params: type case ANALYTICS_LAUNCH_FROM_WIDGET = "LAUNCH FROM WIDGET" // params: type
...@@ -85,4 +89,11 @@ public enum AnalyticsEvent: String { ...@@ -85,4 +89,11 @@ public enum AnalyticsEvent: String {
case ANALYTICS_A9_BID_RECEIVED = "A9_BID_RECEIVED" case ANALYTICS_A9_BID_RECEIVED = "A9_BID_RECEIVED"
case ANALYTICS_AD_CLICKED = "AD_CLICKED" case ANALYTICS_AD_CLICKED = "AD_CLICKED"
case ANALYTICS_APP_OPEN = "APP_OPEN" case ANALYTICS_APP_OPEN = "APP_OPEN"
/// FTUE Funnel: User has saved his first city after installing the app.
case ANALYTICS_USER_QUALIFIED = "USER_QUALIFIED"
/// FTUE Funnel: User comes back to the app between the 3rd day after being qualified and 6th day.
case ANALYTICS_D3_RETAINED = "D3_RETAINED"
/// FTUE Funnel: When the user opens the app for the first time
case ANALYTICS_FIRST_OPEN = "FIRST_OPEN"
} }
...@@ -12,3 +12,16 @@ public protocol AnalyticsService { ...@@ -12,3 +12,16 @@ public protocol AnalyticsService {
var eventsWhitelist: Set<AnalyticsEvent>? { get } var eventsWhitelist: Set<AnalyticsEvent>? { get }
func log(event: AnalyticsEvent, params: [AnalyticsParameter: Any]?) func log(event: AnalyticsEvent, params: [AnalyticsParameter: Any]?)
} }
extension AnalyticsService {
func stringKeyedParams(from params: [AnalyticsParameter: Any]?) -> [String: Any]? {
guard let params = params else {
return nil
}
var stringKeyedParams = [String: Any]()
for (key, value) in params {
stringKeyedParams[key.rawValue] = value
}
return stringKeyedParams
}
}
//
// AppsFlyerAnalyticsService.swift
// 1Weather
//
// Created by Demid Merzlyakov on 19.05.2021.
//
import Foundation
import AppsFlyerLib
internal struct AppsFlyerAnalyticsService: AnalyticsService {
public let name: String = "AppsFlyer"
let eventsWhitelist: Set<AnalyticsEvent>? = [.ANALYTICS_APP_OPEN, .ANALYTICS_USER_QUALIFIED, .ANALYTICS_D3_RETAINED, .ANALYTICS_FIRST_OPEN]
func log(event: AnalyticsEvent, params: [AnalyticsParameter : Any]?) {
AppsFlyerLib.shared().logEvent(event.rawValue, withValues: stringKeyedParams(from: params))
}
}
...@@ -13,15 +13,6 @@ internal struct FlurryAnalyticsService: AnalyticsService { ...@@ -13,15 +13,6 @@ internal struct FlurryAnalyticsService: AnalyticsService {
let eventsWhitelist: Set<AnalyticsEvent>? = nil let eventsWhitelist: Set<AnalyticsEvent>? = nil
func log(event: AnalyticsEvent, params: [AnalyticsParameter : Any]?) { func log(event: AnalyticsEvent, params: [AnalyticsParameter : Any]?) {
// Not sure we need this conversion Flurry.logEvent(event.rawValue, withParameters: stringKeyedParams(from: params))
var stringKeyedParams: [String: Any]? = nil
if let params = params {
stringKeyedParams = [String: Any]()
for (key, value) in params {
stringKeyedParams?[key.rawValue] = value
}
}
Flurry.logEvent(event.rawValue, withParameters: stringKeyedParams)
} }
} }
...@@ -13,13 +13,7 @@ internal struct MoEngageAnalyticsService: AnalyticsService { ...@@ -13,13 +13,7 @@ internal struct MoEngageAnalyticsService: AnalyticsService {
let eventsWhitelist: Set<AnalyticsEvent>? = nil let eventsWhitelist: Set<AnalyticsEvent>? = nil
func log(event: AnalyticsEvent, params: [AnalyticsParameter : Any]?) { func log(event: AnalyticsEvent, params: [AnalyticsParameter : Any]?) {
var stringKeyedParams: [String: Any]? = nil let stringKeyedParams = stringKeyedParams(from: params)
if let params = params {
stringKeyedParams = [String: Any]()
for (key, value) in params {
stringKeyedParams?[key.rawValue] = value
}
}
if let params = stringKeyedParams { if let params = stringKeyedParams {
if let nsParams = (params as NSDictionary).mutableCopy() as? NSMutableDictionary { // should never fail if let nsParams = (params as NSDictionary).mutableCopy() as? NSMutableDictionary { // should never fail
......
...@@ -13,13 +13,16 @@ import MoEngage ...@@ -13,13 +13,16 @@ import MoEngage
import GoogleMobileAds import GoogleMobileAds
import Swarm import Swarm
import DTBiOSSDK import DTBiOSSDK
import AppsFlyerLib
@main @main
class AppDelegate: UIResponder, UIApplicationDelegate { class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow? var window: UIWindow?
private let appsFlyer = AppsFlyerLib.shared()
private let appsFlyerLog = Logger(componentName: "AppsFlyer")
private let log = Logger(componentName: "AppDelegate")
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
ThemeManager.refreshAppearance() ThemeManager.refreshAppearance()
...@@ -31,13 +34,36 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -31,13 +34,36 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
self.window = UIWindow(frame: UIScreen.main.bounds) self.window = UIWindow(frame: UIScreen.main.bounds)
appsFlyerLog.info("AppsFlyer initialize with AppsFlyerId: \(kAppsFlyerId), Apple App ID: \(kAppsFlyerAppId)")
appsFlyer.appsFlyerDevKey = kAppsFlyerId
appsFlyer.appleAppID = kAppsFlyerAppId
appsFlyer.delegate = self
appsFlyer.deepLinkDelegate = self
#if DEBUG
appsFlyer.isDebug = true
#else
appsFlyer.isDebug = false
#endif
// Note that the Amazon SDK will get assigned a proper value for consent status inside CCPAHelper.onAppLaunch // Note that the Amazon SDK will get assigned a proper value for consent status inside CCPAHelper.onAppLaunch
// So, make sure this call happens after the // So, make sure this call happens after the
CCPAHelper.shared.onAppLaunch() CCPAHelper.shared.onAppLaunch()
if CCPAHelper.shared.isNewUser && Settings.shared.firstOpenDate == nil {
analytics(log: .ANALYTICS_FIRST_OPEN)
Settings.shared.firstOpenDate = Date()
}
if let userQualifiedDate = Settings.shared.userQualifiedDate {
let timeSinceQualified = Date().timeIntervalSince(userQualifiedDate)
let day = TimeInterval(3600 * 24)
if timeSinceQualified >= 3 * day && timeSinceQualified < 6 * day {
analytics(log: .ANALYTICS_D3_RETAINED)
}
}
// As of DTB 3.4.6 the Amazon SDK freezes the main thread on startup for a couple of seconds, which got us rejected during an AppStore Review. We're going to move this initialization to the AppDelegate for now. The consent status is going to be set earlier within CCPAHelper.shared.onAppLaunch(), so make sure CCPAHelper's onAppLaunch is called before Amazon's setAppKey // As of DTB 3.4.6 the Amazon SDK freezes the main thread on startup for a couple of seconds, which got us rejected during an AppStore Review. We're going to move this initialization to the AppDelegate for now. The consent status is going to be set earlier within CCPAHelper.shared.onAppLaunch(), so make sure CCPAHelper's onAppLaunch is called before Amazon's setAppKey
// TODO: remove setAppKey from here, if Amazon has fixed the freeze on startup. // TODO: remove setAppKey from here, if Amazon has fixed the freeze on startup.
Logger(componentName: "Amazon A9").info("Amazon SDK initialization start") log.info("Amazon SDK (Amazon A9) initialization start")
DTBAds.sharedInstance().setAppKey(a9AppKey) DTBAds.sharedInstance().setAppKey(a9AppKey)
FirebaseApp.configure() FirebaseApp.configure()
ConfigManager.shared.updateConfig() ConfigManager.shared.updateConfig()
...@@ -55,7 +81,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -55,7 +81,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
flurrySession = flurrySession?.withDataSaleOptOut(!canCollectData) flurrySession = flurrySession?.withDataSaleOptOut(!canCollectData)
} }
Logger(componentName: "Flurry").info("Initialize Flurry.") log.info("Initialize Flurry with partner ID: \(kFlurryPartnerId)")
Flurry.startSession(kFlurryPartnerId, with: FlurrySessionBuilder Flurry.startSession(kFlurryPartnerId, with: FlurrySessionBuilder
.init() .init()
.withCrashReporting(false) .withCrashReporting(false)
...@@ -65,13 +91,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -65,13 +91,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var moEngageConfig = MOSDKConfig(appID: kMoEngageAppId) var moEngageConfig = MOSDKConfig(appID: kMoEngageAppId)
moEngageConfig.appGroupID = "group.com.onelouder.oneweather.MoEngage" moEngageConfig.appGroupID = "group.com.onelouder.oneweather.MoEngage"
let moeLogger = Logger(componentName: "MoEngage")
#if DEBUG #if DEBUG
moeLogger.info("Initialize MoEngage (TEST)") log.info("Initialize MoEngage (TEST)")
MoEngage.enableSDKLogs(true) MoEngage.enableSDKLogs(true)
MoEngage.sharedInstance().initializeTest(with: moEngageConfig, andLaunchOptions: launchOptions) MoEngage.sharedInstance().initializeTest(with: moEngageConfig, andLaunchOptions: launchOptions)
#else #else
moeLogger.info("Initialize MoEngage (LIVE)") log.info("Initialize MoEngage (LIVE)")
MoEngage.sharedInstance().initializeLive(with: moEngageConfig, andLaunchOptions: launchOptions) MoEngage.sharedInstance().initializeLive(with: moEngageConfig, andLaunchOptions: launchOptions)
#endif #endif
...@@ -79,8 +104,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -79,8 +104,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
return true return true
} }
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
log.info("Open URL: \(url) with options: \(options)")
let oneWeatherRouter = DeeplinksRouter()
oneWeatherRouter.open(url: url)
return true
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
log.info("Continue userActivity \(userActivity)")
appsFlyer.continue(userActivity, restorationHandler: nil)
return true
}
func applicationDidBecomeActive(_ application: UIApplication) { func applicationDidBecomeActive(_ application: UIApplication) {
LocationManager.shared.updateEverythingIfNeeded() LocationManager.shared.updateEverythingIfNeeded()
appsFlyer.start { [weak self] dictionary, error in
if let error = error {
self?.appsFlyerLog.error("AppsFlyer start error: \(error)")
}
else {
self?.appsFlyerLog.info("AppsFlyer start result: \(dictionary)")
}
}
} }
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
...@@ -88,3 +135,63 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -88,3 +135,63 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
} }
} }
extension AppDelegate: AppsFlyerLibDelegate {
func onConversionDataSuccess(_ conversionInfo: [AnyHashable : Any]) {
let status = conversionInfo["af_status"] as? String
if status == "Non-organic" {
let sourceID = conversionInfo["media_source"] as? String
let campaign = conversionInfo["campaign"] as? String
appsFlyerLog.info("This is a non-organic install. Media source: \(sourceID ?? String(describing: conversionInfo["media_source"])) Campaign: \(campaign ?? String(describing: conversionInfo["campaign"]))")
}
else if status == "Organic" {
appsFlyerLog.info("This is an organic install.")
}
}
func onConversionDataFail(_ error: Error) {
appsFlyerLog.error("conversion data fail: \(error)")
}
func onAppOpenAttribution(_ attributionData: [AnyHashable : Any]) {
appsFlyerLog.info("app open attribution: \(attributionData)")
}
func onAppOpenAttributionFailure(_ error: Error) {
appsFlyerLog.error("app open attribution error: \(error)")
}
}
extension AppDelegate: DeepLinkDelegate {
func didResolveDeepLink(_ result: DeepLinkResult) {
switch result.status {
case .notFound:
appsFlyerLog.info("Deeplink: not found")
return
case .failure:
if let error = result.error {
appsFlyerLog.error("Deeplink: error: \(error)")
}
else {
appsFlyerLog.error("Deeplink: error (unknown)")
}
return
case .found:
appsFlyerLog.info("Deeplink: found!")
}
guard let deepLinkObj:DeepLink = result.deepLink else {
appsFlyerLog.error("Deeplink: Could not extract deep link object")
return
}
log.debug("Deeplink: it's a \(deepLinkObj.isDeferred ? "deferred" : "direct") deeplink.")
guard let deeplink = deepLinkObj.deeplinkValue else {
appsFlyerLog.error("Deeplink: Could not extract deep_link_value from deep link object")
return
}
guard let url = URL(string: deeplink) else {
appsFlyerLog.error("Deeplink: Couldn't create a URL from deeplink: \(deeplink)")
return
}
let router = DeeplinksRouter()
router.open(url: url)
}
}
...@@ -17,6 +17,10 @@ let kOLAppMetricsKey: String = "OLAppMetricsKey" ...@@ -17,6 +17,10 @@ let kOLAppMetricsKey: String = "OLAppMetricsKey"
let WDT_APP_ID = "e3b73414" let WDT_APP_ID = "e3b73414"
let WDT_APP_KEY = "25e8d6b72de3bcd528f7769b073cc335" let WDT_APP_KEY = "25e8d6b72de3bcd528f7769b073cc335"
//MARK: - keys for AppsFlyer
let kAppsFlyerId = "62r3MKqdd6eqtj5jN5wdm6"
let kAppsFlyerAppId = "1044809694" // taken from the app page in AppStoreConnect
//MARK: - InApp //MARK: - InApp
let kInAppOneWeatherProId = "com.onelouder.oneweather.inapp1" let kInAppOneWeatherProId = "com.onelouder.oneweather.inapp1"
......
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
// Copyright © 2021 OneLouder, Inc. All rights reserved. // Copyright © 2021 OneLouder, Inc. All rights reserved.
// //
import Foundation import UIKit
import AppsFlyerLib
class DeeplinksRouter { class DeeplinksRouter {
static let urlScheme = "oneweather" static let urlScheme = "oneweather"
...@@ -80,13 +81,17 @@ class DeeplinksRouter { ...@@ -80,13 +81,17 @@ class DeeplinksRouter {
return result return result
} }
public func open(url: URL) { public func open(url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) {
guard self.is1WUrl(url) else { guard self.is1WUrl(url) else {
log.info("not 1Weather URL, ignore: \(url)") log.info("not 1Weather URL, trying AppsFlyer: \(url)")
AppsFlyerLib.shared().handleOpen(url, options: options)
return return
} }
log.info("open URL: \(url)") log.info("open 1Weather URL: \(url)")
var pathComponents = url.pathComponents var pathComponents = url.pathComponents
if let host = url.host {
pathComponents.insert(host, at: 0)
}
while let currentComponent = pathComponents.popLast() { while let currentComponent = pathComponents.popLast() {
if let parsedComponent = UrlPathComponent(rawValue: currentComponent.lowercased()) { if let parsedComponent = UrlPathComponent(rawValue: currentComponent.lowercased()) {
log.debug("Parsed path: \(parsedComponent.rawValue)") log.debug("Parsed path: \(parsedComponent.rawValue)")
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
import UIKit import UIKit
import StoreKit import StoreKit
import AppsFlyerLib
// Ported from ObjC // Ported from ObjC
...@@ -40,6 +41,7 @@ class OLInAppStoreManager: NSObject { ...@@ -40,6 +41,7 @@ class OLInAppStoreManager: NSObject {
} }
var currentRequest: SKProductsRequest? var currentRequest: SKProductsRequest?
var currentProduct: SKProduct?
// MARK: - public methods // MARK: - public methods
func attemptPurchase(forProductId productId: String) { func attemptPurchase(forProductId productId: String) {
...@@ -89,6 +91,7 @@ extension OLInAppStoreManager: SKProductsRequestDelegate { ...@@ -89,6 +91,7 @@ extension OLInAppStoreManager: SKProductsRequestDelegate {
} }
} }
if let validProduct = validProduct { if let validProduct = validProduct {
currentProduct = validProduct
let payment = SKPayment(product: validProduct) let payment = SKPayment(product: validProduct)
delegate?.inAppStoreManager(self, purchaseWillBeAdded: payment) delegate?.inAppStoreManager(self, purchaseWillBeAdded: payment)
SKPaymentQueue.default().add(self) SKPaymentQueue.default().add(self)
...@@ -110,13 +113,43 @@ extension OLInAppStoreManager: SKPaymentTransactionObserver { ...@@ -110,13 +113,43 @@ extension OLInAppStoreManager: SKPaymentTransactionObserver {
switch transaction.transactionState { switch transaction.transactionState {
case .purchased: case .purchased:
delegate?.inAppStoreManager(self, purchaseCompletedForProductId: transaction.payment.productIdentifier) delegate?.inAppStoreManager(self, purchaseCompletedForProductId: transaction.payment.productIdentifier)
if let currentProduct = self.currentProduct,
currentProduct.productIdentifier == transaction.payment.productIdentifier
{
if let currencyCode = currentProduct.priceLocale.currencyCode {
#if DEBUG
AppsFlyerLib.shared().useReceiptValidationSandbox = true
#endif
AppsFlyerLib.shared().validateAndLog(inAppPurchase: currentProduct.productIdentifier,
price: currentProduct.price.stringValue,
currency: currencyCode,
transactionId: transaction.transactionIdentifier,
additionalParameters: nil,
success: { [weak self] in
guard let dictionary = $0 as? [String: Any] else {
self?.log.info("AppsFlyer verified purchase.")
return
}
self?.log.info("AppsFlyer verified purchase: \(dictionary)")
},
failure: { [weak self] error, result in
self?.log.error("AppsFlyer purchase verification failed: error: \(String(describing: error)), result: \(String(describing: result))")
})
}
else {
log.error("AppsFlyer purchase event: currency not found.")
}
}
else {
log.error("AppsFlyer purchase event: could find matching product.")
}
SKPaymentQueue.default().finishTransaction(transaction) SKPaymentQueue.default().finishTransaction(transaction)
case .failed: case .failed:
if let error = transaction.error { if let error = transaction.error {
log.error("SKPaymentTransactionStateFailedError: \(error)") log.error("Transaction failed: \(error)")
} }
else { else {
log.error("SKPaymentTransactionStateFailedError: unknown error") log.error("Transaction failed: unknown error")
} }
delegate?.inAppStoreManager(self, purchaseFailedFor: transaction) delegate?.inAppStoreManager(self, purchaseFailedFor: transaction)
SKPaymentQueue.default().finishTransaction(transaction) SKPaymentQueue.default().finishTransaction(transaction)
...@@ -156,7 +189,6 @@ extension OLInAppStoreManager: SKPaymentTransactionObserver { ...@@ -156,7 +189,6 @@ extension OLInAppStoreManager: SKPaymentTransactionObserver {
// MARK: - SKRequestDelegate // MARK: - SKRequestDelegate
extension OLInAppStoreManager: SKRequestDelegate { extension OLInAppStoreManager: SKRequestDelegate {
func requestDidFinish(_ request: SKRequest) { func requestDidFinish(_ request: SKRequest) {
log.debug("requestDidFinish") log.debug("requestDidFinish")
} }
......
...@@ -296,7 +296,6 @@ public class LocationManager { ...@@ -296,7 +296,6 @@ public class LocationManager {
log.info("Update all: update default location if needed.") log.info("Update all: update default location if needed.")
updateWeather(for: defaultLocation, updateType: .full) updateWeather(for: defaultLocation, updateType: .full)
updateHealth(for: defaultLocation) updateHealth(for: defaultLocation)
updateNotifications(for: defaultLocation)
return return
} }
log.info("Update all \(locations.count) locations if needed...") log.info("Update all \(locations.count) locations if needed...")
...@@ -475,6 +474,10 @@ public class LocationManager { ...@@ -475,6 +474,10 @@ public class LocationManager {
} }
} }
else { else {
if locations.count == 0 && Settings.shared.userQualifiedDate == nil {
analytics(log: .ANALYTICS_USER_QUALIFIED)
Settings.shared.userQualifiedDate = Date()
}
locations = [location] + locations locations = [location] + locations
analytics(log: .ANALYTICS_ADD_LOCATION) analytics(log: .ANALYTICS_ADD_LOCATION)
} }
...@@ -488,6 +491,10 @@ public class LocationManager { ...@@ -488,6 +491,10 @@ public class LocationManager {
} }
} }
else { else {
if locations.count == 0 && Settings.shared.userQualifiedDate == nil {
analytics(log: .ANALYTICS_USER_QUALIFIED)
Settings.shared.userQualifiedDate = Date()
}
locations.append(location) locations.append(location)
analytics(log: .ANALYTICS_ADD_LOCATION) analytics(log: .ANALYTICS_ADD_LOCATION)
if selectLocation { if selectLocation {
......
...@@ -66,6 +66,12 @@ class Settings { ...@@ -66,6 +66,12 @@ class Settings {
@UserDefaultsBasicValue(key: "selectedLayer") @UserDefaultsBasicValue(key: "selectedLayer")
public var selectedLayerId:String = DefaultSettingsFactory().getSettings().selectedLayerId public var selectedLayerId:String = DefaultSettingsFactory().getSettings().selectedLayerId
@UserDefaultsOptionalValue("userQualifiedDate")
public var userQualifiedDate: Date?
@UserDefaultsOptionalValue("firstOpenDate")
public var firstOpenDate: Date?
@UserDefaultsBasicValue(key: "locationDidAdded") @UserDefaultsBasicValue(key: "locationDidAdded")
public var locationDidAdded:Bool = false public var locationDidAdded:Bool = false
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
import Foundation import Foundation
import MoEngage import MoEngage
import AppsFlyerLib
public class PushNotificationsManager: NSObject { public class PushNotificationsManager: NSObject {
// MARK: - Private // MARK: - Private
...@@ -142,6 +143,15 @@ extension PushNotificationsManager: UNUserNotificationCenterDelegate { ...@@ -142,6 +143,15 @@ extension PushNotificationsManager: UNUserNotificationCenterDelegate {
log.info("MoEngage push: location found: \(newLoc)") log.info("MoEngage push: location found: \(newLoc)")
} }
private func isMoEngagePush(_ response: UNNotificationResponse) -> Bool {
let userInfo = response.notification.request.content.userInfo
guard userInfo["moengage"] as? [String: Any] != nil else {
log.debug("No MoEngage data found.")
return false
}
return true
}
private func handleMoEngageDeeplinks(for response: UNNotificationResponse) { private func handleMoEngageDeeplinks(for response: UNNotificationResponse) {
let userInfo = response.notification.request.content.userInfo let userInfo = response.notification.request.content.userInfo
...@@ -202,8 +212,16 @@ extension PushNotificationsManager: UNUserNotificationCenterDelegate { ...@@ -202,8 +212,16 @@ extension PushNotificationsManager: UNUserNotificationCenterDelegate {
} }
public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
MoEngage.sharedInstance().userNotificationCenter(center, didReceive: response) // not sure we should call it for PushPin notifications, too MoEngage.sharedInstance().userNotificationCenter(center, didReceive: response) // not sure we should call it for AppsFlyer notifications
handleMoEngageDeeplinks(for: response) log.debug("Got a push notification: \(response.notification.request.content.userInfo)")
if isMoEngagePush(response) {
handleMoEngageDeeplinks(for: response)
}
else {
log.info("Handle push notification with AppsFlyer")
AppsFlyerLib.shared().handlePushNotification(response.notification.request.content.userInfo)
}
completionHandler() completionHandler()
} }
......
...@@ -15,6 +15,7 @@ target '1Weather' do ...@@ -15,6 +15,7 @@ target '1Weather' do
pod 'AlgoliaSearchClient', '~> 8.2' pod 'AlgoliaSearchClient', '~> 8.2'
pod 'Flurry-iOS-SDK/FlurrySDK' pod 'Flurry-iOS-SDK/FlurrySDK'
pod 'MoEngage-iOS-SDK' pod 'MoEngage-iOS-SDK'
pod 'AppsFlyerFramework'
# If updating the podspec, make sure to add a tag and push it to origin # If updating the podspec, make sure to add a tag and push it to origin
pod 'Swarm', :git => 'git@gitlab.pinsightmedia.com:oneweather/wdt-skywisetilekit-ios.git', :branch => 'develop' pod 'Swarm', :git => 'git@gitlab.pinsightmedia.com:oneweather/wdt-skywisetilekit-ios.git', :branch => 'develop'
......
...@@ -2,6 +2,9 @@ PODS: ...@@ -2,6 +2,9 @@ PODS:
- AlgoliaSearchClient (8.8.1): - AlgoliaSearchClient (8.8.1):
- Logging - Logging
- AmazonPublisherServicesSDK (4.0.0) - AmazonPublisherServicesSDK (4.0.0)
- AppsFlyerFramework (6.3.0):
- AppsFlyerFramework/Main (= 6.3.0)
- AppsFlyerFramework/Main (6.3.0)
- BezierKit (0.11.0) - BezierKit (0.11.0)
- Cirque (1.0.3) - Cirque (1.0.3)
- FBAudienceNetwork (6.4.1): - FBAudienceNetwork (6.4.1):
...@@ -167,6 +170,7 @@ PODS: ...@@ -167,6 +170,7 @@ PODS:
DEPENDENCIES: DEPENDENCIES:
- AlgoliaSearchClient (~> 8.2) - AlgoliaSearchClient (~> 8.2)
- AmazonPublisherServicesSDK - AmazonPublisherServicesSDK
- AppsFlyerFramework
- BezierKit - BezierKit
- Cirque (from `https://github.com/StepanetsDmtry/Cirque.git`) - Cirque (from `https://github.com/StepanetsDmtry/Cirque.git`)
- Firebase/Analytics - Firebase/Analytics
...@@ -190,6 +194,7 @@ SPEC REPOS: ...@@ -190,6 +194,7 @@ SPEC REPOS:
trunk: trunk:
- AlgoliaSearchClient - AlgoliaSearchClient
- AmazonPublisherServicesSDK - AmazonPublisherServicesSDK
- AppsFlyerFramework
- BezierKit - BezierKit
- FBAudienceNetwork - FBAudienceNetwork
- FBSDKCoreKit - FBSDKCoreKit
...@@ -241,6 +246,7 @@ CHECKOUT OPTIONS: ...@@ -241,6 +246,7 @@ CHECKOUT OPTIONS:
SPEC CHECKSUMS: SPEC CHECKSUMS:
AlgoliaSearchClient: bbafe7f014cc0b474646d794ae3675ef4e92f0d5 AlgoliaSearchClient: bbafe7f014cc0b474646d794ae3675ef4e92f0d5
AmazonPublisherServicesSDK: f73e281872525d1b929dca506c3a0332d4f902fa AmazonPublisherServicesSDK: f73e281872525d1b929dca506c3a0332d4f902fa
AppsFlyerFramework: e5b13250a1b68887213efcd854238791d17cf50b
BezierKit: 8b9bc3aaaa34ede809ff7c7c8aecc2bbe3b86a89 BezierKit: 8b9bc3aaaa34ede809ff7c7c8aecc2bbe3b86a89
Cirque: 1eb134f2180b33107106dc72e47340aefb054da3 Cirque: 1eb134f2180b33107106dc72e47340aefb054da3
FBAudienceNetwork: 1974ec59ef88102f284c29941d73d0cbec3f2874 FBAudienceNetwork: 1974ec59ef88102f284c29941d73d0cbec3f2874
...@@ -276,6 +282,6 @@ SPEC CHECKSUMS: ...@@ -276,6 +282,6 @@ SPEC CHECKSUMS:
Swarm: 95393cd52715744c94e3a8475bc20b4de5d79f35 Swarm: 95393cd52715744c94e3a8475bc20b4de5d79f35
XMLCoder: f884dfa894a6f8b7dce465e4f6c02963bf17e028 XMLCoder: f884dfa894a6f8b7dce465e4f6c02963bf17e028
PODFILE CHECKSUM: 2a940ee71b11c8df13e5b37774edf13ede6b06bb PODFILE CHECKSUM: c1f0b84cb7820c37e25a84eaaa21727fc604a5b6
COCOAPODS: 1.10.1 COCOAPODS: 1.10.1
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>LibraryIdentifier</key>
<string>macos-arm64_x86_64</string>
<key>LibraryPath</key>
<string>AppsFlyerLib.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>macos</string>
</dict>
<dict>
<key>LibraryIdentifier</key>
<string>tvos-arm64</string>
<key>LibraryPath</key>
<string>AppsFlyerLib.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>tvos</string>
</dict>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_x86_64-maccatalyst</string>
<key>LibraryPath</key>
<string>AppsFlyerLib.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>maccatalyst</string>
</dict>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_i386_x86_64-simulator</string>
<key>LibraryPath</key>
<string>AppsFlyerLib.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>i386</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
<dict>
<key>LibraryIdentifier</key>
<string>tvos-arm64_x86_64-simulator</string>
<key>LibraryPath</key>
<string>AppsFlyerLib.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>tvos</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
<dict>
<key>LibraryIdentifier</key>
<string>ios-arm64_armv7</string>
<key>LibraryPath</key>
<string>AppsFlyerLib.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>armv7</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>
//
// CrossPromotionHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
AppsFlyer allows you to log and attribute installs originating
from cross promotion campaigns of your existing apps.
Afterwards, you can optimize on your cross-promotion traffic to get even better results.
*/
@interface AppsFlyerCrossPromotionHelper : NSObject
/**
To log an impression use the following API call.
Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard.
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
*/
+ (void)logCrossPromoteImpression:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters;
/**
iOS allows you to utilize the StoreKit component to open
the App Store while remaining in the context of your app.
More details at https://support.appsflyer.com/hc/en-us/articles/115004481946-Cross-Promotion-Tracking#tracking-cross-promotion-impressions
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
@param openStoreBlock Contains promoted `clickURL`
*/
+ (void)logAndOpenStore:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters
openStore:(void (^)(NSURLSession *urlSession, NSURL *clickURL))openStoreBlock;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplink.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
NS_SWIFT_NAME(DeepLink)
@interface AppsFlyerDeepLink : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property (readonly, nonnull) NSDictionary<NSString *, id> *clickEvent;
@property (readonly, nullable) NSString *deeplinkValue;
@property (readonly, nullable) NSString *matchType;
@property (readonly, nullable) NSString *clickHTTPReferrer;
@property (readonly, nullable) NSString *mediaSource;
@property (readonly, nullable) NSString *campaign;
@property (readonly, nullable) NSString *campaignId;
@property (readonly, nullable) NSString *afSub1;
@property (readonly, nullable) NSString *afSub2;
@property (readonly, nullable) NSString *afSub3;
@property (readonly, nullable) NSString *afSub4;
@property (readonly, nullable) NSString *afSub5;
@property (readonly) BOOL isDeferred;
- (NSString *)toString;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplinkResult.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
@class AppsFlyerDeepLink;
typedef NS_CLOSED_ENUM(NSUInteger, AFSDKDeepLinkResultStatus) {
AFSDKDeepLinkResultStatusNotFound,
AFSDKDeepLinkResultStatusFound,
AFSDKDeepLinkResultStatusFailure,
} NS_SWIFT_NAME(DeepLinkResultStatus);
NS_SWIFT_NAME(DeepLinkResult)
@interface AppsFlyerDeepLinkResult : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property(readonly) AFSDKDeepLinkResultStatus status;
@property(readonly, nullable) AppsFlyerDeepLink *deepLink;
@property(readonly, nullable) NSError *error;
@end
//
// AppsFlyerLib.h
// AppsFlyerLib
//
// AppsFlyer iOS SDK 6.3.0 (11)
// Copyright (c) 2012-2020 AppsFlyer Ltd. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "AppsFlyerCrossPromotionHelper.h"
#import "AppsFlyerShareInviteHelper.h"
#import "AppsFlyerDeepLinkResult.h"
#import "AppsFlyerDeepLink.h"
NS_ASSUME_NONNULL_BEGIN
// In app event names constants
#define AFEventLevelAchieved @"af_level_achieved"
#define AFEventAddPaymentInfo @"af_add_payment_info"
#define AFEventAddToCart @"af_add_to_cart"
#define AFEventAddToWishlist @"af_add_to_wishlist"
#define AFEventCompleteRegistration @"af_complete_registration"
#define AFEventTutorial_completion @"af_tutorial_completion"
#define AFEventInitiatedCheckout @"af_initiated_checkout"
#define AFEventPurchase @"af_purchase"
#define AFEventRate @"af_rate"
#define AFEventSearch @"af_search"
#define AFEventSpentCredits @"af_spent_credits"
#define AFEventAchievementUnlocked @"af_achievement_unlocked"
#define AFEventContentView @"af_content_view"
#define AFEventListView @"af_list_view"
#define AFEventTravelBooking @"af_travel_booking"
#define AFEventShare @"af_share"
#define AFEventInvite @"af_invite"
#define AFEventLogin @"af_login"
#define AFEventReEngage @"af_re_engage"
#define AFEventUpdate @"af_update"
#define AFEventOpenedFromPushNotification @"af_opened_from_push_notification"
#define AFEventLocation @"af_location_coordinates"
#define AFEventCustomerSegment @"af_customer_segment"
#define AFEventSubscribe @"af_subscribe"
#define AFEventStartTrial @"af_start_trial"
#define AFEventAdClick @"af_ad_click"
#define AFEventAdView @"af_ad_view"
// In app event parameter names
#define AFEventParamContent @"af_content"
#define AFEventParamAchievementId @"af_achievement_id"
#define AFEventParamLevel @"af_level"
#define AFEventParamScore @"af_score"
#define AFEventParamSuccess @"af_success"
#define AFEventParamPrice @"af_price"
#define AFEventParamContentType @"af_content_type"
#define AFEventParamContentId @"af_content_id"
#define AFEventParamContentList @"af_content_list"
#define AFEventParamCurrency @"af_currency"
#define AFEventParamQuantity @"af_quantity"
#define AFEventParamRegistrationMethod @"af_registration_method"
#define AFEventParamPaymentInfoAvailable @"af_payment_info_available"
#define AFEventParamMaxRatingValue @"af_max_rating_value"
#define AFEventParamRatingValue @"af_rating_value"
#define AFEventParamSearchString @"af_search_string"
#define AFEventParamDateA @"af_date_a"
#define AFEventParamDateB @"af_date_b"
#define AFEventParamDestinationA @"af_destination_a"
#define AFEventParamDestinationB @"af_destination_b"
#define AFEventParamDescription @"af_description"
#define AFEventParamClass @"af_class"
#define AFEventParamEventStart @"af_event_start"
#define AFEventParamEventEnd @"af_event_end"
#define AFEventParamLat @"af_lat"
#define AFEventParamLong @"af_long"
#define AFEventParamCustomerUserId @"af_customer_user_id"
#define AFEventParamValidated @"af_validated"
#define AFEventParamRevenue @"af_revenue"
#define AFEventProjectedParamRevenue @"af_projected_revenue"
#define AFEventParamReceiptId @"af_receipt_id"
#define AFEventParamTutorialId @"af_tutorial_id"
#define AFEventParamVirtualCurrencyName @"af_virtual_currency_name"
#define AFEventParamDeepLink @"af_deep_link"
#define AFEventParamOldVersion @"af_old_version"
#define AFEventParamNewVersion @"af_new_version"
#define AFEventParamReviewText @"af_review_text"
#define AFEventParamCouponCode @"af_coupon_code"
#define AFEventParamOrderId @"af_order_id"
#define AFEventParam1 @"af_param_1"
#define AFEventParam2 @"af_param_2"
#define AFEventParam3 @"af_param_3"
#define AFEventParam4 @"af_param_4"
#define AFEventParam5 @"af_param_5"
#define AFEventParam6 @"af_param_6"
#define AFEventParam7 @"af_param_7"
#define AFEventParam8 @"af_param_8"
#define AFEventParam9 @"af_param_9"
#define AFEventParam10 @"af_param_10"
#define AFEventParamDepartingDepartureDate @"af_departing_departure_date"
#define AFEventParamReturningDepartureDate @"af_returning_departure_date"
#define AFEventParamDestinationList @"af_destination_list" //array of string
#define AFEventParamCity @"af_city"
#define AFEventParamRegion @"af_region"
#define AFEventParamCountry @"af_country"
#define AFEventParamDepartingArrivalDate @"af_departing_arrival_date"
#define AFEventParamReturningArrivalDate @"af_returning_arrival_date"
#define AFEventParamSuggestedDestinations @"af_suggested_destinations" //array of string
#define AFEventParamTravelStart @"af_travel_start"
#define AFEventParamTravelEnd @"af_travel_end"
#define AFEventParamNumAdults @"af_num_adults"
#define AFEventParamNumChildren @"af_num_children"
#define AFEventParamNumInfants @"af_num_infants"
#define AFEventParamSuggestedHotels @"af_suggested_hotels" //array of string
#define AFEventParamUserScore @"af_user_score"
#define AFEventParamHotelScore @"af_hotel_score"
#define AFEventParamPurchaseCurrency @"af_purchase_currency"
#define AFEventParamPreferredStarRatings @"af_preferred_star_ratings" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredPriceRange @"af_preferred_price_range" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredNeighborhoods @"af_preferred_neighborhoods" //array of string
#define AFEventParamPreferredNumStops @"af_preferred_num_stops"
#define AFEventParamAdRevenueAdType @"af_adrev_ad_type"
#define AFEventParamAdRevenueNetworkName @"af_adrev_network_name"
#define AFEventParamAdRevenuePlacementId @"af_adrev_placement_id"
#define AFEventParamAdRevenueAdSize @"af_adrev_ad_size"
#define AFEventParamAdRevenueMediatedNetworkName @"af_adrev_mediated_network_name"
/// Mail hashing type
typedef enum {
/// None
EmailCryptTypeNone = 0,
/// SHA1
EmailCryptTypeSHA1 = 1,
/// MD5
EmailCryptTypeMD5 = 2,
/// SHA256
EmailCryptTypeSHA256 = 3
} EmailCryptType;
NS_SWIFT_NAME(DeepLinkDelegate)
@protocol AppsFlyerDeepLinkDelegate <NSObject>
@optional
- (void)didResolveDeepLink:(AppsFlyerDeepLinkResult *_Nonnull)result;
@end
/**
Conform and subscribe to this protocol to allow getting data about conversion and
install attribution
*/
@protocol AppsFlyerLibDelegate <NSObject>
/**
`conversionInfo` contains information about install.
Organic/non-organic, etc.
@param conversionInfo May contain <code>null</code> values for some keys. Please handle this case.
*/
- (void)onConversionDataSuccess:(NSDictionary *)conversionInfo;
/**
Any errors that occurred during the conversion request.
*/
- (void)onConversionDataFail:(NSError *)error;
@optional
/**
`attributionData` contains information about OneLink, deeplink.
*/
- (void)onAppOpenAttribution:(NSDictionary *)attributionData;
/**
Any errors that occurred during the attribution request.
*/
- (void)onAppOpenAttributionFailure:(NSError *)error;
/**
@abstract Sets the HTTP header fields of the ESP resolving to the given
dictionary.
@discussion This method replaces all header fields that may have
existed before this method ESP resolving call.
To keep default SDK behavior - return nil;
*/
- (NSDictionary <NSString *, NSString *> * _Nullable)allHTTPHeaderFieldsForResolveDeepLinkURL:(NSURL *)URL;
@end
/**
You can log installs, app updates, sessions and additional in-app events
(including in-app purchases, game levels, etc.)
to evaluate ROI and user engagement.
The iOS SDK is compatible with all iOS/tvOS devices with iOS version 7 and above.
@see [SDK Integration Validator](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS)
for more information.
*/
@interface AppsFlyerLib : NSObject
/**
Gets the singleton instance of the AppsFlyerLib class, creating it if
necessary.
@return The singleton instance of AppsFlyerLib.
*/
+ (AppsFlyerLib *)shared;
/**
In case you use your own user ID in your app, you can set this property to that ID.
Enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs
*/
@property(nonatomic, strong, nullable) NSString * customerUserID;
/**
In case you use custom data and you want to receive it in the raw reports.
@see [Setting additional custom data](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS#setting-additional-custom-data) for more information.
*/
@property(nonatomic, strong, nullable, setter = setAdditionalData:) NSDictionary * customData;
/**
Use this property to set your AppsFlyer's dev key
*/
@property(nonatomic, strong) NSString * appsFlyerDevKey;
/**
Use this property to set your app's Apple ID(taken from the app's page on iTunes Connect)
*/
@property(nonatomic, strong) NSString * appleAppID;
#ifndef AFSDK_NO_IDFA
/**
AppsFlyer SDK collect Apple's `advertisingIdentifier` if the `AdSupport.framework` included in the SDK.
You can disable this behavior by setting the following property to YES
*/
@property(nonatomic) BOOL disableAdvertisingIdentifier;
@property(nonatomic, strong, readonly) NSString *advertisingIdentifier;
/**
Waits for request user authorization to access app-related data
*/
- (void)waitForATTUserAuthorizationWithTimeoutInterval:(NSTimeInterval)timeoutInterval
NS_SWIFT_NAME(waitForATTUserAuthorization(timeoutInterval:));
#endif
@property(nonatomic) BOOL disableSKAdNetwork;
/**
In case of in app purchase events, you can set the currency code your user has purchased with.
The currency code is a 3 letter code according to ISO standards
Objective-C:
<pre>
[[AppsFlyerLib shared] setCurrencyCode:@"USD"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().currencyCode = "USD"
</pre>
*/
@property(nonatomic, strong, nullable) NSString *currencyCode;
/**
Prints SDK messages to the console log. This property should only be used in `DEBUG` mode.
The default value is `NO`
*/
@property(nonatomic) BOOL isDebug;
/**
Set this flag to `YES`, to collect the current device name(e.g. "My iPhone"). Default value is `NO`
*/
@property(nonatomic) BOOL shouldCollectDeviceName;
/**
Set your `OneLink ID` from OneLink configuration. Used in User Invites to generate a OneLink.
*/
@property(nonatomic, strong, nullable, setter = setAppInviteOneLink:) NSString * appInviteOneLinkID;
/**
Opt-out logging for specific user
*/
@property(atomic) BOOL anonymizeUser;
/**
Opt-out for Apple Search Ads attributions
*/
@property(atomic) BOOL disableCollectASA;
@property(nonatomic) BOOL disableAppleAdsAttribution;
/**
AppsFlyer delegate. See `AppsFlyerLibDelegate`
*/
@property(weak, nonatomic) id<AppsFlyerLibDelegate> delegate;
@property(weak, nonatomic) id<AppsFlyerDeepLinkDelegate> deepLinkDelegate;
/**
In app purchase receipt validation Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useReceiptValidationSandbox;
/**
Set this flag to test uninstall on Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useUninstallSandbox;
/**
For advertisers who wrap OneLink within another Universal Link.
An advertiser will be able to deeplink from a OneLink wrapped within another Universal Link and also log this retargeting conversion.
Objective-C:
<pre>
[[AppsFlyerLib shared] setResolveDeepLinkURLs:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *resolveDeepLinkURLs;
/**
For advertisers who use vanity OneLinks.
Objective-C:
<pre>
[[AppsFlyerLib shared] oneLinkCustomDomains:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *oneLinkCustomDomains;
/*
* Set phone number for each `start` event. `phoneNumber` will be sent as SHA256 string
*/
@property(nonatomic, nullable) NSString *phoneNumber;
- (NSString *)phoneNumber UNAVAILABLE_ATTRIBUTE;
/**
To disable app's vendor identifier(IDFV), set disableIDFVCollection to true
*/
@property(nonatomic) BOOL disableIDFVCollection;
/**
Enable the collection of Facebook Deferred AppLinks
Requires Facebook SDK and Facebook app on target/client device.
This API must be invoked prior to initializing the AppsFlyer SDK in order to function properly.
Objective-C:
<pre>
[[AppsFlyerLib shared] enableFacebookDeferredApplinksWithClass:[FBSDKAppLinkUtility class]]
</pre>
Swift:
<pre>
AppsFlyerLib.shared().enableFacebookDeferredApplinks(with: FBSDKAppLinkUtility.self)
</pre>
@param facebookAppLinkUtilityClass requeries method call `[FBSDKAppLinkUtility class]` as param.
*/
- (void)enableFacebookDeferredApplinksWithClass:(Class _Nullable)facebookAppLinkUtilityClass;
/**
Use this to send the user's emails
@param userEmails The list of strings that hold mails
@param type Hash algoritm
*/
- (void)setUserEmails:(NSArray<NSString *> * _Nullable)userEmails withCryptType:(EmailCryptType)type;
/**
Start SDK session
Add the following method at the `applicationDidBecomeActive` in AppDelegate class
*/
- (void)start;
- (void)startWithCompletionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler;
/**
Use this method to log an events with multiple values. See AppsFlyer's documentation for details.
Objective-C:
<pre>
[[AppsFlyerLib shared] logEvent:AFEventPurchase
withValues: @{AFEventParamRevenue : @200,
AFEventParamCurrency : @"USD",
AFEventParamQuantity : @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"}];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().logEvent(AFEventPurchase,
withValues: [AFEventParamRevenue : "1200",
AFEventParamContent : "shoes",
AFEventParamContentId: "123"])
</pre>
@param eventName Contains name of event that could be provided from predefined constants in `AppsFlyerLib.h`
@param values Contains dictionary of values for handling by backend
*/
- (void)logEvent:(NSString *)eventName withValues:(NSDictionary * _Nullable)values;
- (void)logEventWithEventName:(NSString *)eventName
eventValues:(NSDictionary<NSString * , id> * _Nullable)eventValues
completionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler
NS_SWIFT_NAME(logEvent(name:values:completionHandler:));
/**
To log and validate in app purchases you can call this method from the completeTransaction: method on
your `SKPaymentTransactionObserver`.
@param productIdentifier The product identifier
@param price The product price
@param currency The product currency
@param transactionId The purchase transaction Id
@param params The additional param, which you want to receive it in the raw reports
@param successBlock The success callback
@param failedBlock The failure callback
*/
- (void)validateAndLogInAppPurchase:(NSString * _Nullable)productIdentifier
price:(NSString * _Nullable)price
currency:(NSString * _Nullable)currency
transactionId:(NSString * _Nullable)transactionId
additionalParameters:(NSDictionary * _Nullable)params
success:(void (^ _Nullable)(NSDictionary * response))successBlock
failure:(void (^ _Nullable)(NSError * _Nullable error, id _Nullable reponse))failedBlock NS_AVAILABLE(10_7, 7_0);
/**
To log location for geo-fencing. Does the same as code below.
<pre>
AppsFlyerLib.shared().logEvent(AFEventLocation, withValues: [AFEventParamLong:longitude, AFEventParamLat:latitude])
</pre>
@param longitude The location longitude
@param latitude The location latitude
*/
- (void)logLocation:(double)longitude latitude:(double)latitude NS_SWIFT_NAME(logLocation(longitude:latitude:));
/**
This method returns AppsFlyer's internal id(unique for your app)
@return Internal AppsFlyer Id
*/
- (NSString *)getAppsFlyerUID;
/**
In case you want to log deep linking. Does the same as `-handleOpenURL:sourceApplication:withAnnotation`.
@warning Preferred to use `-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url sourceApplication:(NSString * _Nullable)sourceApplication API_UNAVAILABLE(macos);
/**
In case you want to log deep linking.
Call this method from inside your AppDelegate `-application:openURL:sourceApplication:annotation:`
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
@param annotation The annotation that passed to your app delegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url
sourceApplication:(NSString * _Nullable)sourceApplication
withAnnotation:(id _Nullable)annotation API_UNAVAILABLE(macos);
/**
Call this method from inside of your AppDelegate `-application:openURL:options:` method.
This method is functionally the same as calling the AppsFlyer method
`-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your app delegate
@param options The options dictionary that was passed to your AppDelegate.
*/
- (void)handleOpenUrl:(NSURL * _Nullable)url options:(NSDictionary * _Nullable)options API_UNAVAILABLE(macos);
/**
Allow AppsFlyer to handle restoration from an NSUserActivity.
Use this method to log deep links with OneLink.
@param userActivity The NSUserActivity that caused the app to be opened.
*/
- (BOOL)continueUserActivity:(NSUserActivity * _Nullable)userActivity
restorationHandler:(void (^ _Nullable)(NSArray * _Nullable))restorationHandler NS_AVAILABLE_IOS(9_0) API_UNAVAILABLE(macos);
/**
Enable AppsFlyer to handle a push notification.
@see [Learn more here](https://support.appsflyer.com/hc/en-us/articles/207364076-Measuring-Push-Notification-Re-Engagement-Campaigns)
@warning To make it work - set data, related to AppsFlyer under key @"af".
@param pushPayload The `userInfo` from received remote notification. One of root keys should be @"af".
*/
- (void)handlePushNotification:(NSDictionary * _Nullable)pushPayload;
/**
Register uninstall - you should register for remote notification and provide AppsFlyer the push device token.
@param deviceToken The `deviceToken` from `-application:didRegisterForRemoteNotificationsWithDeviceToken:`
*/
- (void)registerUninstall:(NSData * _Nullable)deviceToken;
/**
Get SDK version.
@return The AppsFlyer SDK version info.
*/
- (NSString *)getSDKVersion;
/**
This is for internal use.
*/
- (void)remoteDebuggingCallWithData:(NSString *)data;
/**
Used to force the trigger `onAppOpenAttribution` delegate.
Notice, re-engagement, session and launch won't be counted.
Only for OneLink/UniversalLink/Deeplink resolving.
@param URL The param to resolve into -[AppsFlyerLibDelegate onAppOpenAttribution:]
*/
- (void)performOnAppAttributionWithURL:(NSURL * _Nullable)URL;
/**
@brief This property accepts a string value representing the host name for all endpoints.
Can be used to Zero rate your application’s data usage. Contact your CSM for more information.
@warning To use `default` SDK endpoint – set value to `nil`.
Objective-C:
<pre>
[[AppsFlyerLib shared] setHost:@"example.com"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().host = "example.com"
</pre>
*/
@property(nonatomic, strong, readonly) NSString *host;
/**
* This function set the host name and prefix host name for all the endpoints
**/
- (void)setHost:(NSString *)host withHostPrefix:(NSString *)hostPrefix;
/**
* This property accepts a string value representing the prefix host name for all endpoints.
* for example "test" prefix with default host name will have the address "host.appsflyer.com"
*/
@property(nonatomic, strong, readonly) NSString *hostPrefix;
/**
This property is responsible for timeout between sessions in seconds.
Default value is 5 seconds.
*/
@property(atomic) NSUInteger minTimeBetweenSessions;
/**
API to shut down all SDK activities.
@warning This will disable all requests from AppsFlyer SDK.
*/
@property(atomic) BOOL isStopped;
/**
API to set manually Facebook deferred app link
*/
@property(nonatomic, nullable) NSURL *facebookDeferredAppLink;
/**
Block an events from being shared with ad networks and other 3rd party integrations
Must only include letters/digits or underscore, maximum length: 45
*/
@property(nonatomic, nullable) NSArray<NSString *> *sharingFilter;
@property(nonatomic) NSUInteger deepLinkTimeout;
/**
Block an events from being shared with any partner
This method overwrite -[AppsFlyerLib setSharingFilter:]
*/
-(void)setSharingFilterForAllPartners;
/**
Validate if URL contains certain string and append quiery
parameters to deeplink URL. In case if URL does not contain user-defined string,
parameters are not appended to the url.
@param containsString string to check in URL.
@param parameters NSDictionary, which containins parameters to append to the deeplink url after it passed validation.
*/
- (void)appendParametersToDeepLinkingURLWithString:(NSString *)containsString
parameters:(NSDictionary<NSString *, NSString*> *)parameters
NS_SWIFT_NAME(appendParametersToDeeplinkURL(contains:parameters:));
/**
Adds array of keys, which are used to compose key path
to resolve deeplink from push notification payload `userInfo`.
@param deepLinkPath an array of strings which contains keys to search for deeplink in payload.
*/
- (void)addPushNotificationDeepLinkPath:(NSArray<NSString *> *)deepLinkPath;
/**
* Allows sending custom data for partner integration purposes.
*
* @param partnerId ID of the partner (usually has "_int" suffix)
* @param partnerInfo customer data, depends on the integration nature with specific partner
*/
- (void)setPartnerDataWithPartnerId:(NSString * _Nullable)partnerId partnerInfo:(NSDictionary<NSString *, id> * _Nullable)partnerInfo
NS_SWIFT_NAME(setPartnerData(partnerId:partnerInfo:));
@end
NS_ASSUME_NONNULL_END
//
// LinkGenerator.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
Payload container for the `generateInviteUrlWithLinkGenerator:completionHandler:` from `AppsFlyerShareInviteHelper`
*/
@interface AppsFlyerLinkGenerator : NSObject
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
- (instancetype)init NS_UNAVAILABLE;
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
+ (instancetype)new NS_UNAVAILABLE;
@property(nonatomic, nullable) NSString *brandDomain;
/// The channel through which the invite was sent (e.g. Facebook/Gmail/etc.). Usage: Recommended
- (void)setChannel :(nonnull NSString *)channel;
/// ReferrerCustomerId setter
- (void)setReferrerCustomerId:(nonnull NSString *)referrerCustomerId;
/// A campaign name. Usage: Optional
- (void)setCampaign :(nonnull NSString *)campaign;
/// ReferrerUID setter
- (void)setReferrerUID :(nonnull NSString *)referrerUID;
/// Referrer name
- (void)setReferrerName :(nonnull NSString *)referrerName;
/// The URL to referrer user avatar. Usage: Optional
- (void)setReferrerImageURL :(nonnull NSString *)referrerImageURL;
/// AppleAppID
- (void)setAppleAppID :(nonnull NSString *)appleAppID;
/// Deeplink path
- (void)setDeeplinkPath :(nonnull NSString *)deeplinkPath;
/// Base deeplink path
- (void)setBaseDeeplink :(nonnull NSString *)baseDeeplink;
/// A single key value custom parameter. Usage: Optional
- (void)addParameterValue :(nonnull NSString *)value forKey:(NSString *)key;
/// Multiple key value custom parameters. Usage: Optional
- (void)addParameters :(nonnull NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
//
// ShareInviteHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
#import "AppsFlyerLinkGenerator.h"
/**
AppsFlyerShareInviteHelper
*/
@interface AppsFlyerShareInviteHelper : NSObject
NS_ASSUME_NONNULL_BEGIN
/**
* The AppsFlyerShareInviteHelper class builds the invite URL according to various setter methods
* which allow passing on additional information on the click.
* This information is available through `onConversionDataReceived:` when the user accepts the invite and installs the app.
* In addition, campaign and channel parameters are visible within the AppsFlyer Dashboard.
*/
+ (void)generateInviteUrlWithLinkGenerator:(AppsFlyerLinkGenerator *(^)(AppsFlyerLinkGenerator *generator))generatorCreator completionHandler:(void (^)(NSURL *_Nullable url))completionHandler;
/**
* It is recommended to generate an in-app event after the invite is sent to log the invites from the senders' perspective.
* This enables you to find the users that tend most to invite friends, and the media sources that get you these users.
*/
+ (void)logInvite:(nullable NSString *)channel parameters:(nullable NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
framework module AppsFlyerLib {
umbrella header "AppsFlyerLib.h"
export *
module * { export * }
}
//
// CrossPromotionHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
AppsFlyer allows you to log and attribute installs originating
from cross promotion campaigns of your existing apps.
Afterwards, you can optimize on your cross-promotion traffic to get even better results.
*/
@interface AppsFlyerCrossPromotionHelper : NSObject
/**
To log an impression use the following API call.
Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard.
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
*/
+ (void)logCrossPromoteImpression:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters;
/**
iOS allows you to utilize the StoreKit component to open
the App Store while remaining in the context of your app.
More details at https://support.appsflyer.com/hc/en-us/articles/115004481946-Cross-Promotion-Tracking#tracking-cross-promotion-impressions
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
@param openStoreBlock Contains promoted `clickURL`
*/
+ (void)logAndOpenStore:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters
openStore:(void (^)(NSURLSession *urlSession, NSURL *clickURL))openStoreBlock;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplink.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
NS_SWIFT_NAME(DeepLink)
@interface AppsFlyerDeepLink : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property (readonly, nonnull) NSDictionary<NSString *, id> *clickEvent;
@property (readonly, nullable) NSString *deeplinkValue;
@property (readonly, nullable) NSString *matchType;
@property (readonly, nullable) NSString *clickHTTPReferrer;
@property (readonly, nullable) NSString *mediaSource;
@property (readonly, nullable) NSString *campaign;
@property (readonly, nullable) NSString *campaignId;
@property (readonly, nullable) NSString *afSub1;
@property (readonly, nullable) NSString *afSub2;
@property (readonly, nullable) NSString *afSub3;
@property (readonly, nullable) NSString *afSub4;
@property (readonly, nullable) NSString *afSub5;
@property (readonly) BOOL isDeferred;
- (NSString *)toString;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplinkResult.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
@class AppsFlyerDeepLink;
typedef NS_CLOSED_ENUM(NSUInteger, AFSDKDeepLinkResultStatus) {
AFSDKDeepLinkResultStatusNotFound,
AFSDKDeepLinkResultStatusFound,
AFSDKDeepLinkResultStatusFailure,
} NS_SWIFT_NAME(DeepLinkResultStatus);
NS_SWIFT_NAME(DeepLinkResult)
@interface AppsFlyerDeepLinkResult : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property(readonly) AFSDKDeepLinkResultStatus status;
@property(readonly, nullable) AppsFlyerDeepLink *deepLink;
@property(readonly, nullable) NSError *error;
@end
//
// AppsFlyerLib.h
// AppsFlyerLib
//
// AppsFlyer iOS SDK 6.3.0 (11)
// Copyright (c) 2012-2020 AppsFlyer Ltd. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "AppsFlyerCrossPromotionHelper.h"
#import "AppsFlyerShareInviteHelper.h"
#import "AppsFlyerDeepLinkResult.h"
#import "AppsFlyerDeepLink.h"
NS_ASSUME_NONNULL_BEGIN
// In app event names constants
#define AFEventLevelAchieved @"af_level_achieved"
#define AFEventAddPaymentInfo @"af_add_payment_info"
#define AFEventAddToCart @"af_add_to_cart"
#define AFEventAddToWishlist @"af_add_to_wishlist"
#define AFEventCompleteRegistration @"af_complete_registration"
#define AFEventTutorial_completion @"af_tutorial_completion"
#define AFEventInitiatedCheckout @"af_initiated_checkout"
#define AFEventPurchase @"af_purchase"
#define AFEventRate @"af_rate"
#define AFEventSearch @"af_search"
#define AFEventSpentCredits @"af_spent_credits"
#define AFEventAchievementUnlocked @"af_achievement_unlocked"
#define AFEventContentView @"af_content_view"
#define AFEventListView @"af_list_view"
#define AFEventTravelBooking @"af_travel_booking"
#define AFEventShare @"af_share"
#define AFEventInvite @"af_invite"
#define AFEventLogin @"af_login"
#define AFEventReEngage @"af_re_engage"
#define AFEventUpdate @"af_update"
#define AFEventOpenedFromPushNotification @"af_opened_from_push_notification"
#define AFEventLocation @"af_location_coordinates"
#define AFEventCustomerSegment @"af_customer_segment"
#define AFEventSubscribe @"af_subscribe"
#define AFEventStartTrial @"af_start_trial"
#define AFEventAdClick @"af_ad_click"
#define AFEventAdView @"af_ad_view"
// In app event parameter names
#define AFEventParamContent @"af_content"
#define AFEventParamAchievementId @"af_achievement_id"
#define AFEventParamLevel @"af_level"
#define AFEventParamScore @"af_score"
#define AFEventParamSuccess @"af_success"
#define AFEventParamPrice @"af_price"
#define AFEventParamContentType @"af_content_type"
#define AFEventParamContentId @"af_content_id"
#define AFEventParamContentList @"af_content_list"
#define AFEventParamCurrency @"af_currency"
#define AFEventParamQuantity @"af_quantity"
#define AFEventParamRegistrationMethod @"af_registration_method"
#define AFEventParamPaymentInfoAvailable @"af_payment_info_available"
#define AFEventParamMaxRatingValue @"af_max_rating_value"
#define AFEventParamRatingValue @"af_rating_value"
#define AFEventParamSearchString @"af_search_string"
#define AFEventParamDateA @"af_date_a"
#define AFEventParamDateB @"af_date_b"
#define AFEventParamDestinationA @"af_destination_a"
#define AFEventParamDestinationB @"af_destination_b"
#define AFEventParamDescription @"af_description"
#define AFEventParamClass @"af_class"
#define AFEventParamEventStart @"af_event_start"
#define AFEventParamEventEnd @"af_event_end"
#define AFEventParamLat @"af_lat"
#define AFEventParamLong @"af_long"
#define AFEventParamCustomerUserId @"af_customer_user_id"
#define AFEventParamValidated @"af_validated"
#define AFEventParamRevenue @"af_revenue"
#define AFEventProjectedParamRevenue @"af_projected_revenue"
#define AFEventParamReceiptId @"af_receipt_id"
#define AFEventParamTutorialId @"af_tutorial_id"
#define AFEventParamVirtualCurrencyName @"af_virtual_currency_name"
#define AFEventParamDeepLink @"af_deep_link"
#define AFEventParamOldVersion @"af_old_version"
#define AFEventParamNewVersion @"af_new_version"
#define AFEventParamReviewText @"af_review_text"
#define AFEventParamCouponCode @"af_coupon_code"
#define AFEventParamOrderId @"af_order_id"
#define AFEventParam1 @"af_param_1"
#define AFEventParam2 @"af_param_2"
#define AFEventParam3 @"af_param_3"
#define AFEventParam4 @"af_param_4"
#define AFEventParam5 @"af_param_5"
#define AFEventParam6 @"af_param_6"
#define AFEventParam7 @"af_param_7"
#define AFEventParam8 @"af_param_8"
#define AFEventParam9 @"af_param_9"
#define AFEventParam10 @"af_param_10"
#define AFEventParamDepartingDepartureDate @"af_departing_departure_date"
#define AFEventParamReturningDepartureDate @"af_returning_departure_date"
#define AFEventParamDestinationList @"af_destination_list" //array of string
#define AFEventParamCity @"af_city"
#define AFEventParamRegion @"af_region"
#define AFEventParamCountry @"af_country"
#define AFEventParamDepartingArrivalDate @"af_departing_arrival_date"
#define AFEventParamReturningArrivalDate @"af_returning_arrival_date"
#define AFEventParamSuggestedDestinations @"af_suggested_destinations" //array of string
#define AFEventParamTravelStart @"af_travel_start"
#define AFEventParamTravelEnd @"af_travel_end"
#define AFEventParamNumAdults @"af_num_adults"
#define AFEventParamNumChildren @"af_num_children"
#define AFEventParamNumInfants @"af_num_infants"
#define AFEventParamSuggestedHotels @"af_suggested_hotels" //array of string
#define AFEventParamUserScore @"af_user_score"
#define AFEventParamHotelScore @"af_hotel_score"
#define AFEventParamPurchaseCurrency @"af_purchase_currency"
#define AFEventParamPreferredStarRatings @"af_preferred_star_ratings" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredPriceRange @"af_preferred_price_range" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredNeighborhoods @"af_preferred_neighborhoods" //array of string
#define AFEventParamPreferredNumStops @"af_preferred_num_stops"
#define AFEventParamAdRevenueAdType @"af_adrev_ad_type"
#define AFEventParamAdRevenueNetworkName @"af_adrev_network_name"
#define AFEventParamAdRevenuePlacementId @"af_adrev_placement_id"
#define AFEventParamAdRevenueAdSize @"af_adrev_ad_size"
#define AFEventParamAdRevenueMediatedNetworkName @"af_adrev_mediated_network_name"
/// Mail hashing type
typedef enum {
/// None
EmailCryptTypeNone = 0,
/// SHA1
EmailCryptTypeSHA1 = 1,
/// MD5
EmailCryptTypeMD5 = 2,
/// SHA256
EmailCryptTypeSHA256 = 3
} EmailCryptType;
NS_SWIFT_NAME(DeepLinkDelegate)
@protocol AppsFlyerDeepLinkDelegate <NSObject>
@optional
- (void)didResolveDeepLink:(AppsFlyerDeepLinkResult *_Nonnull)result;
@end
/**
Conform and subscribe to this protocol to allow getting data about conversion and
install attribution
*/
@protocol AppsFlyerLibDelegate <NSObject>
/**
`conversionInfo` contains information about install.
Organic/non-organic, etc.
@param conversionInfo May contain <code>null</code> values for some keys. Please handle this case.
*/
- (void)onConversionDataSuccess:(NSDictionary *)conversionInfo;
/**
Any errors that occurred during the conversion request.
*/
- (void)onConversionDataFail:(NSError *)error;
@optional
/**
`attributionData` contains information about OneLink, deeplink.
*/
- (void)onAppOpenAttribution:(NSDictionary *)attributionData;
/**
Any errors that occurred during the attribution request.
*/
- (void)onAppOpenAttributionFailure:(NSError *)error;
/**
@abstract Sets the HTTP header fields of the ESP resolving to the given
dictionary.
@discussion This method replaces all header fields that may have
existed before this method ESP resolving call.
To keep default SDK behavior - return nil;
*/
- (NSDictionary <NSString *, NSString *> * _Nullable)allHTTPHeaderFieldsForResolveDeepLinkURL:(NSURL *)URL;
@end
/**
You can log installs, app updates, sessions and additional in-app events
(including in-app purchases, game levels, etc.)
to evaluate ROI and user engagement.
The iOS SDK is compatible with all iOS/tvOS devices with iOS version 7 and above.
@see [SDK Integration Validator](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS)
for more information.
*/
@interface AppsFlyerLib : NSObject
/**
Gets the singleton instance of the AppsFlyerLib class, creating it if
necessary.
@return The singleton instance of AppsFlyerLib.
*/
+ (AppsFlyerLib *)shared;
/**
In case you use your own user ID in your app, you can set this property to that ID.
Enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs
*/
@property(nonatomic, strong, nullable) NSString * customerUserID;
/**
In case you use custom data and you want to receive it in the raw reports.
@see [Setting additional custom data](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS#setting-additional-custom-data) for more information.
*/
@property(nonatomic, strong, nullable, setter = setAdditionalData:) NSDictionary * customData;
/**
Use this property to set your AppsFlyer's dev key
*/
@property(nonatomic, strong) NSString * appsFlyerDevKey;
/**
Use this property to set your app's Apple ID(taken from the app's page on iTunes Connect)
*/
@property(nonatomic, strong) NSString * appleAppID;
#ifndef AFSDK_NO_IDFA
/**
AppsFlyer SDK collect Apple's `advertisingIdentifier` if the `AdSupport.framework` included in the SDK.
You can disable this behavior by setting the following property to YES
*/
@property(nonatomic) BOOL disableAdvertisingIdentifier;
@property(nonatomic, strong, readonly) NSString *advertisingIdentifier;
/**
Waits for request user authorization to access app-related data
*/
- (void)waitForATTUserAuthorizationWithTimeoutInterval:(NSTimeInterval)timeoutInterval
NS_SWIFT_NAME(waitForATTUserAuthorization(timeoutInterval:));
#endif
@property(nonatomic) BOOL disableSKAdNetwork;
/**
In case of in app purchase events, you can set the currency code your user has purchased with.
The currency code is a 3 letter code according to ISO standards
Objective-C:
<pre>
[[AppsFlyerLib shared] setCurrencyCode:@"USD"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().currencyCode = "USD"
</pre>
*/
@property(nonatomic, strong, nullable) NSString *currencyCode;
/**
Prints SDK messages to the console log. This property should only be used in `DEBUG` mode.
The default value is `NO`
*/
@property(nonatomic) BOOL isDebug;
/**
Set this flag to `YES`, to collect the current device name(e.g. "My iPhone"). Default value is `NO`
*/
@property(nonatomic) BOOL shouldCollectDeviceName;
/**
Set your `OneLink ID` from OneLink configuration. Used in User Invites to generate a OneLink.
*/
@property(nonatomic, strong, nullable, setter = setAppInviteOneLink:) NSString * appInviteOneLinkID;
/**
Opt-out logging for specific user
*/
@property(atomic) BOOL anonymizeUser;
/**
Opt-out for Apple Search Ads attributions
*/
@property(atomic) BOOL disableCollectASA;
@property(nonatomic) BOOL disableAppleAdsAttribution;
/**
AppsFlyer delegate. See `AppsFlyerLibDelegate`
*/
@property(weak, nonatomic) id<AppsFlyerLibDelegate> delegate;
@property(weak, nonatomic) id<AppsFlyerDeepLinkDelegate> deepLinkDelegate;
/**
In app purchase receipt validation Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useReceiptValidationSandbox;
/**
Set this flag to test uninstall on Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useUninstallSandbox;
/**
For advertisers who wrap OneLink within another Universal Link.
An advertiser will be able to deeplink from a OneLink wrapped within another Universal Link and also log this retargeting conversion.
Objective-C:
<pre>
[[AppsFlyerLib shared] setResolveDeepLinkURLs:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *resolveDeepLinkURLs;
/**
For advertisers who use vanity OneLinks.
Objective-C:
<pre>
[[AppsFlyerLib shared] oneLinkCustomDomains:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *oneLinkCustomDomains;
/*
* Set phone number for each `start` event. `phoneNumber` will be sent as SHA256 string
*/
@property(nonatomic, nullable) NSString *phoneNumber;
- (NSString *)phoneNumber UNAVAILABLE_ATTRIBUTE;
/**
To disable app's vendor identifier(IDFV), set disableIDFVCollection to true
*/
@property(nonatomic) BOOL disableIDFVCollection;
/**
Enable the collection of Facebook Deferred AppLinks
Requires Facebook SDK and Facebook app on target/client device.
This API must be invoked prior to initializing the AppsFlyer SDK in order to function properly.
Objective-C:
<pre>
[[AppsFlyerLib shared] enableFacebookDeferredApplinksWithClass:[FBSDKAppLinkUtility class]]
</pre>
Swift:
<pre>
AppsFlyerLib.shared().enableFacebookDeferredApplinks(with: FBSDKAppLinkUtility.self)
</pre>
@param facebookAppLinkUtilityClass requeries method call `[FBSDKAppLinkUtility class]` as param.
*/
- (void)enableFacebookDeferredApplinksWithClass:(Class _Nullable)facebookAppLinkUtilityClass;
/**
Use this to send the user's emails
@param userEmails The list of strings that hold mails
@param type Hash algoritm
*/
- (void)setUserEmails:(NSArray<NSString *> * _Nullable)userEmails withCryptType:(EmailCryptType)type;
/**
Start SDK session
Add the following method at the `applicationDidBecomeActive` in AppDelegate class
*/
- (void)start;
- (void)startWithCompletionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler;
/**
Use this method to log an events with multiple values. See AppsFlyer's documentation for details.
Objective-C:
<pre>
[[AppsFlyerLib shared] logEvent:AFEventPurchase
withValues: @{AFEventParamRevenue : @200,
AFEventParamCurrency : @"USD",
AFEventParamQuantity : @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"}];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().logEvent(AFEventPurchase,
withValues: [AFEventParamRevenue : "1200",
AFEventParamContent : "shoes",
AFEventParamContentId: "123"])
</pre>
@param eventName Contains name of event that could be provided from predefined constants in `AppsFlyerLib.h`
@param values Contains dictionary of values for handling by backend
*/
- (void)logEvent:(NSString *)eventName withValues:(NSDictionary * _Nullable)values;
- (void)logEventWithEventName:(NSString *)eventName
eventValues:(NSDictionary<NSString * , id> * _Nullable)eventValues
completionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler
NS_SWIFT_NAME(logEvent(name:values:completionHandler:));
/**
To log and validate in app purchases you can call this method from the completeTransaction: method on
your `SKPaymentTransactionObserver`.
@param productIdentifier The product identifier
@param price The product price
@param currency The product currency
@param transactionId The purchase transaction Id
@param params The additional param, which you want to receive it in the raw reports
@param successBlock The success callback
@param failedBlock The failure callback
*/
- (void)validateAndLogInAppPurchase:(NSString * _Nullable)productIdentifier
price:(NSString * _Nullable)price
currency:(NSString * _Nullable)currency
transactionId:(NSString * _Nullable)transactionId
additionalParameters:(NSDictionary * _Nullable)params
success:(void (^ _Nullable)(NSDictionary * response))successBlock
failure:(void (^ _Nullable)(NSError * _Nullable error, id _Nullable reponse))failedBlock NS_AVAILABLE(10_7, 7_0);
/**
To log location for geo-fencing. Does the same as code below.
<pre>
AppsFlyerLib.shared().logEvent(AFEventLocation, withValues: [AFEventParamLong:longitude, AFEventParamLat:latitude])
</pre>
@param longitude The location longitude
@param latitude The location latitude
*/
- (void)logLocation:(double)longitude latitude:(double)latitude NS_SWIFT_NAME(logLocation(longitude:latitude:));
/**
This method returns AppsFlyer's internal id(unique for your app)
@return Internal AppsFlyer Id
*/
- (NSString *)getAppsFlyerUID;
/**
In case you want to log deep linking. Does the same as `-handleOpenURL:sourceApplication:withAnnotation`.
@warning Preferred to use `-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url sourceApplication:(NSString * _Nullable)sourceApplication API_UNAVAILABLE(macos);
/**
In case you want to log deep linking.
Call this method from inside your AppDelegate `-application:openURL:sourceApplication:annotation:`
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
@param annotation The annotation that passed to your app delegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url
sourceApplication:(NSString * _Nullable)sourceApplication
withAnnotation:(id _Nullable)annotation API_UNAVAILABLE(macos);
/**
Call this method from inside of your AppDelegate `-application:openURL:options:` method.
This method is functionally the same as calling the AppsFlyer method
`-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your app delegate
@param options The options dictionary that was passed to your AppDelegate.
*/
- (void)handleOpenUrl:(NSURL * _Nullable)url options:(NSDictionary * _Nullable)options API_UNAVAILABLE(macos);
/**
Allow AppsFlyer to handle restoration from an NSUserActivity.
Use this method to log deep links with OneLink.
@param userActivity The NSUserActivity that caused the app to be opened.
*/
- (BOOL)continueUserActivity:(NSUserActivity * _Nullable)userActivity
restorationHandler:(void (^ _Nullable)(NSArray * _Nullable))restorationHandler NS_AVAILABLE_IOS(9_0) API_UNAVAILABLE(macos);
/**
Enable AppsFlyer to handle a push notification.
@see [Learn more here](https://support.appsflyer.com/hc/en-us/articles/207364076-Measuring-Push-Notification-Re-Engagement-Campaigns)
@warning To make it work - set data, related to AppsFlyer under key @"af".
@param pushPayload The `userInfo` from received remote notification. One of root keys should be @"af".
*/
- (void)handlePushNotification:(NSDictionary * _Nullable)pushPayload;
/**
Register uninstall - you should register for remote notification and provide AppsFlyer the push device token.
@param deviceToken The `deviceToken` from `-application:didRegisterForRemoteNotificationsWithDeviceToken:`
*/
- (void)registerUninstall:(NSData * _Nullable)deviceToken;
/**
Get SDK version.
@return The AppsFlyer SDK version info.
*/
- (NSString *)getSDKVersion;
/**
This is for internal use.
*/
- (void)remoteDebuggingCallWithData:(NSString *)data;
/**
Used to force the trigger `onAppOpenAttribution` delegate.
Notice, re-engagement, session and launch won't be counted.
Only for OneLink/UniversalLink/Deeplink resolving.
@param URL The param to resolve into -[AppsFlyerLibDelegate onAppOpenAttribution:]
*/
- (void)performOnAppAttributionWithURL:(NSURL * _Nullable)URL;
/**
@brief This property accepts a string value representing the host name for all endpoints.
Can be used to Zero rate your application’s data usage. Contact your CSM for more information.
@warning To use `default` SDK endpoint – set value to `nil`.
Objective-C:
<pre>
[[AppsFlyerLib shared] setHost:@"example.com"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().host = "example.com"
</pre>
*/
@property(nonatomic, strong, readonly) NSString *host;
/**
* This function set the host name and prefix host name for all the endpoints
**/
- (void)setHost:(NSString *)host withHostPrefix:(NSString *)hostPrefix;
/**
* This property accepts a string value representing the prefix host name for all endpoints.
* for example "test" prefix with default host name will have the address "host.appsflyer.com"
*/
@property(nonatomic, strong, readonly) NSString *hostPrefix;
/**
This property is responsible for timeout between sessions in seconds.
Default value is 5 seconds.
*/
@property(atomic) NSUInteger minTimeBetweenSessions;
/**
API to shut down all SDK activities.
@warning This will disable all requests from AppsFlyer SDK.
*/
@property(atomic) BOOL isStopped;
/**
API to set manually Facebook deferred app link
*/
@property(nonatomic, nullable) NSURL *facebookDeferredAppLink;
/**
Block an events from being shared with ad networks and other 3rd party integrations
Must only include letters/digits or underscore, maximum length: 45
*/
@property(nonatomic, nullable) NSArray<NSString *> *sharingFilter;
@property(nonatomic) NSUInteger deepLinkTimeout;
/**
Block an events from being shared with any partner
This method overwrite -[AppsFlyerLib setSharingFilter:]
*/
-(void)setSharingFilterForAllPartners;
/**
Validate if URL contains certain string and append quiery
parameters to deeplink URL. In case if URL does not contain user-defined string,
parameters are not appended to the url.
@param containsString string to check in URL.
@param parameters NSDictionary, which containins parameters to append to the deeplink url after it passed validation.
*/
- (void)appendParametersToDeepLinkingURLWithString:(NSString *)containsString
parameters:(NSDictionary<NSString *, NSString*> *)parameters
NS_SWIFT_NAME(appendParametersToDeeplinkURL(contains:parameters:));
/**
Adds array of keys, which are used to compose key path
to resolve deeplink from push notification payload `userInfo`.
@param deepLinkPath an array of strings which contains keys to search for deeplink in payload.
*/
- (void)addPushNotificationDeepLinkPath:(NSArray<NSString *> *)deepLinkPath;
/**
* Allows sending custom data for partner integration purposes.
*
* @param partnerId ID of the partner (usually has "_int" suffix)
* @param partnerInfo customer data, depends on the integration nature with specific partner
*/
- (void)setPartnerDataWithPartnerId:(NSString * _Nullable)partnerId partnerInfo:(NSDictionary<NSString *, id> * _Nullable)partnerInfo
NS_SWIFT_NAME(setPartnerData(partnerId:partnerInfo:));
@end
NS_ASSUME_NONNULL_END
//
// LinkGenerator.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
Payload container for the `generateInviteUrlWithLinkGenerator:completionHandler:` from `AppsFlyerShareInviteHelper`
*/
@interface AppsFlyerLinkGenerator : NSObject
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
- (instancetype)init NS_UNAVAILABLE;
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
+ (instancetype)new NS_UNAVAILABLE;
@property(nonatomic, nullable) NSString *brandDomain;
/// The channel through which the invite was sent (e.g. Facebook/Gmail/etc.). Usage: Recommended
- (void)setChannel :(nonnull NSString *)channel;
/// ReferrerCustomerId setter
- (void)setReferrerCustomerId:(nonnull NSString *)referrerCustomerId;
/// A campaign name. Usage: Optional
- (void)setCampaign :(nonnull NSString *)campaign;
/// ReferrerUID setter
- (void)setReferrerUID :(nonnull NSString *)referrerUID;
/// Referrer name
- (void)setReferrerName :(nonnull NSString *)referrerName;
/// The URL to referrer user avatar. Usage: Optional
- (void)setReferrerImageURL :(nonnull NSString *)referrerImageURL;
/// AppleAppID
- (void)setAppleAppID :(nonnull NSString *)appleAppID;
/// Deeplink path
- (void)setDeeplinkPath :(nonnull NSString *)deeplinkPath;
/// Base deeplink path
- (void)setBaseDeeplink :(nonnull NSString *)baseDeeplink;
/// A single key value custom parameter. Usage: Optional
- (void)addParameterValue :(nonnull NSString *)value forKey:(NSString *)key;
/// Multiple key value custom parameters. Usage: Optional
- (void)addParameters :(nonnull NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
//
// ShareInviteHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
#import "AppsFlyerLinkGenerator.h"
/**
AppsFlyerShareInviteHelper
*/
@interface AppsFlyerShareInviteHelper : NSObject
NS_ASSUME_NONNULL_BEGIN
/**
* The AppsFlyerShareInviteHelper class builds the invite URL according to various setter methods
* which allow passing on additional information on the click.
* This information is available through `onConversionDataReceived:` when the user accepts the invite and installs the app.
* In addition, campaign and channel parameters are visible within the AppsFlyer Dashboard.
*/
+ (void)generateInviteUrlWithLinkGenerator:(AppsFlyerLinkGenerator *(^)(AppsFlyerLinkGenerator *generator))generatorCreator completionHandler:(void (^)(NSURL *_Nullable url))completionHandler;
/**
* It is recommended to generate an in-app event after the invite is sent to log the invites from the senders' perspective.
* This enables you to find the users that tend most to invite friends, and the media sources that get you these users.
*/
+ (void)logInvite:(nullable NSString *)channel parameters:(nullable NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
framework module AppsFlyerLib {
umbrella header "AppsFlyerLib.h"
export *
module * { export * }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Headers/AppsFlyerCrossPromotionHelper.h</key>
<data>
ezewyhf50Apa+1HjqfRFE7nXZIE=
</data>
<key>Headers/AppsFlyerDeepLink.h</key>
<data>
jDznIDDggwXT7EmzE7TYcZjhMjA=
</data>
<key>Headers/AppsFlyerDeepLinkResult.h</key>
<data>
3J9juDAkVB2LUxC7/NDmKqgrzyQ=
</data>
<key>Headers/AppsFlyerLib.h</key>
<data>
mUVf5C/bLPxap0tT64QCqtDy98w=
</data>
<key>Headers/AppsFlyerLinkGenerator.h</key>
<data>
dmn7cx6Z5wxK92gRzGUwPeRiZFg=
</data>
<key>Headers/AppsFlyerShareInviteHelper.h</key>
<data>
d9/NIwpZ+CNQ8zsxhNkHTT7kpRE=
</data>
<key>Info.plist</key>
<data>
WXZiJf5d+rOTAYsiTTxkTPkPVaM=
</data>
<key>Modules/module.modulemap</key>
<data>
r+QHVTsITCgZyCe0Vpvj+KSPIWc=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/AppsFlyerCrossPromotionHelper.h</key>
<dict>
<key>hash</key>
<data>
ezewyhf50Apa+1HjqfRFE7nXZIE=
</data>
<key>hash2</key>
<data>
YgrwrWx/ZFYjXh2t5ZHY6S0EZTroYfe5Nprl3alq+Ho=
</data>
</dict>
<key>Headers/AppsFlyerDeepLink.h</key>
<dict>
<key>hash</key>
<data>
jDznIDDggwXT7EmzE7TYcZjhMjA=
</data>
<key>hash2</key>
<data>
Z5nW/ynpNNV+krqJXqy1Gb+gdnruPFWutZYYX7hSt3I=
</data>
</dict>
<key>Headers/AppsFlyerDeepLinkResult.h</key>
<dict>
<key>hash</key>
<data>
3J9juDAkVB2LUxC7/NDmKqgrzyQ=
</data>
<key>hash2</key>
<data>
QsQGXKix5206DUBBUdDxfg5ykma/3V9MoHOxbz8NaOs=
</data>
</dict>
<key>Headers/AppsFlyerLib.h</key>
<dict>
<key>hash</key>
<data>
mUVf5C/bLPxap0tT64QCqtDy98w=
</data>
<key>hash2</key>
<data>
TZqybw725YVAAJNEa+mh2Rssna9ALVCEGy69Bwu4J8k=
</data>
</dict>
<key>Headers/AppsFlyerLinkGenerator.h</key>
<dict>
<key>hash</key>
<data>
dmn7cx6Z5wxK92gRzGUwPeRiZFg=
</data>
<key>hash2</key>
<data>
n5nvQT7mm5XE6/p92Fwks9TR1rVR9k1TgTk06A14CMg=
</data>
</dict>
<key>Headers/AppsFlyerShareInviteHelper.h</key>
<dict>
<key>hash</key>
<data>
d9/NIwpZ+CNQ8zsxhNkHTT7kpRE=
</data>
<key>hash2</key>
<data>
dcwbMQEM8N0Ugem7QbAWWGP+hfO/0vlued2Pep6IKtc=
</data>
</dict>
<key>Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
r+QHVTsITCgZyCe0Vpvj+KSPIWc=
</data>
<key>hash2</key>
<data>
ZcaMjc66PAFkteksoe5Rzelk7opMMS8QdKiza/LgQwA=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>
//
// CrossPromotionHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
AppsFlyer allows you to log and attribute installs originating
from cross promotion campaigns of your existing apps.
Afterwards, you can optimize on your cross-promotion traffic to get even better results.
*/
@interface AppsFlyerCrossPromotionHelper : NSObject
/**
To log an impression use the following API call.
Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard.
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
*/
+ (void)logCrossPromoteImpression:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters;
/**
iOS allows you to utilize the StoreKit component to open
the App Store while remaining in the context of your app.
More details at https://support.appsflyer.com/hc/en-us/articles/115004481946-Cross-Promotion-Tracking#tracking-cross-promotion-impressions
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
@param openStoreBlock Contains promoted `clickURL`
*/
+ (void)logAndOpenStore:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters
openStore:(void (^)(NSURLSession *urlSession, NSURL *clickURL))openStoreBlock;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplink.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
NS_SWIFT_NAME(DeepLink)
@interface AppsFlyerDeepLink : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property (readonly, nonnull) NSDictionary<NSString *, id> *clickEvent;
@property (readonly, nullable) NSString *deeplinkValue;
@property (readonly, nullable) NSString *matchType;
@property (readonly, nullable) NSString *clickHTTPReferrer;
@property (readonly, nullable) NSString *mediaSource;
@property (readonly, nullable) NSString *campaign;
@property (readonly, nullable) NSString *campaignId;
@property (readonly, nullable) NSString *afSub1;
@property (readonly, nullable) NSString *afSub2;
@property (readonly, nullable) NSString *afSub3;
@property (readonly, nullable) NSString *afSub4;
@property (readonly, nullable) NSString *afSub5;
@property (readonly) BOOL isDeferred;
- (NSString *)toString;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplinkResult.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
@class AppsFlyerDeepLink;
typedef NS_CLOSED_ENUM(NSUInteger, AFSDKDeepLinkResultStatus) {
AFSDKDeepLinkResultStatusNotFound,
AFSDKDeepLinkResultStatusFound,
AFSDKDeepLinkResultStatusFailure,
} NS_SWIFT_NAME(DeepLinkResultStatus);
NS_SWIFT_NAME(DeepLinkResult)
@interface AppsFlyerDeepLinkResult : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property(readonly) AFSDKDeepLinkResultStatus status;
@property(readonly, nullable) AppsFlyerDeepLink *deepLink;
@property(readonly, nullable) NSError *error;
@end
//
// AppsFlyerLib.h
// AppsFlyerLib
//
// AppsFlyer iOS SDK 6.3.0 (11)
// Copyright (c) 2012-2020 AppsFlyer Ltd. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "AppsFlyerCrossPromotionHelper.h"
#import "AppsFlyerShareInviteHelper.h"
#import "AppsFlyerDeepLinkResult.h"
#import "AppsFlyerDeepLink.h"
NS_ASSUME_NONNULL_BEGIN
// In app event names constants
#define AFEventLevelAchieved @"af_level_achieved"
#define AFEventAddPaymentInfo @"af_add_payment_info"
#define AFEventAddToCart @"af_add_to_cart"
#define AFEventAddToWishlist @"af_add_to_wishlist"
#define AFEventCompleteRegistration @"af_complete_registration"
#define AFEventTutorial_completion @"af_tutorial_completion"
#define AFEventInitiatedCheckout @"af_initiated_checkout"
#define AFEventPurchase @"af_purchase"
#define AFEventRate @"af_rate"
#define AFEventSearch @"af_search"
#define AFEventSpentCredits @"af_spent_credits"
#define AFEventAchievementUnlocked @"af_achievement_unlocked"
#define AFEventContentView @"af_content_view"
#define AFEventListView @"af_list_view"
#define AFEventTravelBooking @"af_travel_booking"
#define AFEventShare @"af_share"
#define AFEventInvite @"af_invite"
#define AFEventLogin @"af_login"
#define AFEventReEngage @"af_re_engage"
#define AFEventUpdate @"af_update"
#define AFEventOpenedFromPushNotification @"af_opened_from_push_notification"
#define AFEventLocation @"af_location_coordinates"
#define AFEventCustomerSegment @"af_customer_segment"
#define AFEventSubscribe @"af_subscribe"
#define AFEventStartTrial @"af_start_trial"
#define AFEventAdClick @"af_ad_click"
#define AFEventAdView @"af_ad_view"
// In app event parameter names
#define AFEventParamContent @"af_content"
#define AFEventParamAchievementId @"af_achievement_id"
#define AFEventParamLevel @"af_level"
#define AFEventParamScore @"af_score"
#define AFEventParamSuccess @"af_success"
#define AFEventParamPrice @"af_price"
#define AFEventParamContentType @"af_content_type"
#define AFEventParamContentId @"af_content_id"
#define AFEventParamContentList @"af_content_list"
#define AFEventParamCurrency @"af_currency"
#define AFEventParamQuantity @"af_quantity"
#define AFEventParamRegistrationMethod @"af_registration_method"
#define AFEventParamPaymentInfoAvailable @"af_payment_info_available"
#define AFEventParamMaxRatingValue @"af_max_rating_value"
#define AFEventParamRatingValue @"af_rating_value"
#define AFEventParamSearchString @"af_search_string"
#define AFEventParamDateA @"af_date_a"
#define AFEventParamDateB @"af_date_b"
#define AFEventParamDestinationA @"af_destination_a"
#define AFEventParamDestinationB @"af_destination_b"
#define AFEventParamDescription @"af_description"
#define AFEventParamClass @"af_class"
#define AFEventParamEventStart @"af_event_start"
#define AFEventParamEventEnd @"af_event_end"
#define AFEventParamLat @"af_lat"
#define AFEventParamLong @"af_long"
#define AFEventParamCustomerUserId @"af_customer_user_id"
#define AFEventParamValidated @"af_validated"
#define AFEventParamRevenue @"af_revenue"
#define AFEventProjectedParamRevenue @"af_projected_revenue"
#define AFEventParamReceiptId @"af_receipt_id"
#define AFEventParamTutorialId @"af_tutorial_id"
#define AFEventParamVirtualCurrencyName @"af_virtual_currency_name"
#define AFEventParamDeepLink @"af_deep_link"
#define AFEventParamOldVersion @"af_old_version"
#define AFEventParamNewVersion @"af_new_version"
#define AFEventParamReviewText @"af_review_text"
#define AFEventParamCouponCode @"af_coupon_code"
#define AFEventParamOrderId @"af_order_id"
#define AFEventParam1 @"af_param_1"
#define AFEventParam2 @"af_param_2"
#define AFEventParam3 @"af_param_3"
#define AFEventParam4 @"af_param_4"
#define AFEventParam5 @"af_param_5"
#define AFEventParam6 @"af_param_6"
#define AFEventParam7 @"af_param_7"
#define AFEventParam8 @"af_param_8"
#define AFEventParam9 @"af_param_9"
#define AFEventParam10 @"af_param_10"
#define AFEventParamDepartingDepartureDate @"af_departing_departure_date"
#define AFEventParamReturningDepartureDate @"af_returning_departure_date"
#define AFEventParamDestinationList @"af_destination_list" //array of string
#define AFEventParamCity @"af_city"
#define AFEventParamRegion @"af_region"
#define AFEventParamCountry @"af_country"
#define AFEventParamDepartingArrivalDate @"af_departing_arrival_date"
#define AFEventParamReturningArrivalDate @"af_returning_arrival_date"
#define AFEventParamSuggestedDestinations @"af_suggested_destinations" //array of string
#define AFEventParamTravelStart @"af_travel_start"
#define AFEventParamTravelEnd @"af_travel_end"
#define AFEventParamNumAdults @"af_num_adults"
#define AFEventParamNumChildren @"af_num_children"
#define AFEventParamNumInfants @"af_num_infants"
#define AFEventParamSuggestedHotels @"af_suggested_hotels" //array of string
#define AFEventParamUserScore @"af_user_score"
#define AFEventParamHotelScore @"af_hotel_score"
#define AFEventParamPurchaseCurrency @"af_purchase_currency"
#define AFEventParamPreferredStarRatings @"af_preferred_star_ratings" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredPriceRange @"af_preferred_price_range" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredNeighborhoods @"af_preferred_neighborhoods" //array of string
#define AFEventParamPreferredNumStops @"af_preferred_num_stops"
#define AFEventParamAdRevenueAdType @"af_adrev_ad_type"
#define AFEventParamAdRevenueNetworkName @"af_adrev_network_name"
#define AFEventParamAdRevenuePlacementId @"af_adrev_placement_id"
#define AFEventParamAdRevenueAdSize @"af_adrev_ad_size"
#define AFEventParamAdRevenueMediatedNetworkName @"af_adrev_mediated_network_name"
/// Mail hashing type
typedef enum {
/// None
EmailCryptTypeNone = 0,
/// SHA1
EmailCryptTypeSHA1 = 1,
/// MD5
EmailCryptTypeMD5 = 2,
/// SHA256
EmailCryptTypeSHA256 = 3
} EmailCryptType;
NS_SWIFT_NAME(DeepLinkDelegate)
@protocol AppsFlyerDeepLinkDelegate <NSObject>
@optional
- (void)didResolveDeepLink:(AppsFlyerDeepLinkResult *_Nonnull)result;
@end
/**
Conform and subscribe to this protocol to allow getting data about conversion and
install attribution
*/
@protocol AppsFlyerLibDelegate <NSObject>
/**
`conversionInfo` contains information about install.
Organic/non-organic, etc.
@param conversionInfo May contain <code>null</code> values for some keys. Please handle this case.
*/
- (void)onConversionDataSuccess:(NSDictionary *)conversionInfo;
/**
Any errors that occurred during the conversion request.
*/
- (void)onConversionDataFail:(NSError *)error;
@optional
/**
`attributionData` contains information about OneLink, deeplink.
*/
- (void)onAppOpenAttribution:(NSDictionary *)attributionData;
/**
Any errors that occurred during the attribution request.
*/
- (void)onAppOpenAttributionFailure:(NSError *)error;
/**
@abstract Sets the HTTP header fields of the ESP resolving to the given
dictionary.
@discussion This method replaces all header fields that may have
existed before this method ESP resolving call.
To keep default SDK behavior - return nil;
*/
- (NSDictionary <NSString *, NSString *> * _Nullable)allHTTPHeaderFieldsForResolveDeepLinkURL:(NSURL *)URL;
@end
/**
You can log installs, app updates, sessions and additional in-app events
(including in-app purchases, game levels, etc.)
to evaluate ROI and user engagement.
The iOS SDK is compatible with all iOS/tvOS devices with iOS version 7 and above.
@see [SDK Integration Validator](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS)
for more information.
*/
@interface AppsFlyerLib : NSObject
/**
Gets the singleton instance of the AppsFlyerLib class, creating it if
necessary.
@return The singleton instance of AppsFlyerLib.
*/
+ (AppsFlyerLib *)shared;
/**
In case you use your own user ID in your app, you can set this property to that ID.
Enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs
*/
@property(nonatomic, strong, nullable) NSString * customerUserID;
/**
In case you use custom data and you want to receive it in the raw reports.
@see [Setting additional custom data](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS#setting-additional-custom-data) for more information.
*/
@property(nonatomic, strong, nullable, setter = setAdditionalData:) NSDictionary * customData;
/**
Use this property to set your AppsFlyer's dev key
*/
@property(nonatomic, strong) NSString * appsFlyerDevKey;
/**
Use this property to set your app's Apple ID(taken from the app's page on iTunes Connect)
*/
@property(nonatomic, strong) NSString * appleAppID;
#ifndef AFSDK_NO_IDFA
/**
AppsFlyer SDK collect Apple's `advertisingIdentifier` if the `AdSupport.framework` included in the SDK.
You can disable this behavior by setting the following property to YES
*/
@property(nonatomic) BOOL disableAdvertisingIdentifier;
@property(nonatomic, strong, readonly) NSString *advertisingIdentifier;
/**
Waits for request user authorization to access app-related data
*/
- (void)waitForATTUserAuthorizationWithTimeoutInterval:(NSTimeInterval)timeoutInterval
NS_SWIFT_NAME(waitForATTUserAuthorization(timeoutInterval:));
#endif
@property(nonatomic) BOOL disableSKAdNetwork;
/**
In case of in app purchase events, you can set the currency code your user has purchased with.
The currency code is a 3 letter code according to ISO standards
Objective-C:
<pre>
[[AppsFlyerLib shared] setCurrencyCode:@"USD"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().currencyCode = "USD"
</pre>
*/
@property(nonatomic, strong, nullable) NSString *currencyCode;
/**
Prints SDK messages to the console log. This property should only be used in `DEBUG` mode.
The default value is `NO`
*/
@property(nonatomic) BOOL isDebug;
/**
Set this flag to `YES`, to collect the current device name(e.g. "My iPhone"). Default value is `NO`
*/
@property(nonatomic) BOOL shouldCollectDeviceName;
/**
Set your `OneLink ID` from OneLink configuration. Used in User Invites to generate a OneLink.
*/
@property(nonatomic, strong, nullable, setter = setAppInviteOneLink:) NSString * appInviteOneLinkID;
/**
Opt-out logging for specific user
*/
@property(atomic) BOOL anonymizeUser;
/**
Opt-out for Apple Search Ads attributions
*/
@property(atomic) BOOL disableCollectASA;
@property(nonatomic) BOOL disableAppleAdsAttribution;
/**
AppsFlyer delegate. See `AppsFlyerLibDelegate`
*/
@property(weak, nonatomic) id<AppsFlyerLibDelegate> delegate;
@property(weak, nonatomic) id<AppsFlyerDeepLinkDelegate> deepLinkDelegate;
/**
In app purchase receipt validation Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useReceiptValidationSandbox;
/**
Set this flag to test uninstall on Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useUninstallSandbox;
/**
For advertisers who wrap OneLink within another Universal Link.
An advertiser will be able to deeplink from a OneLink wrapped within another Universal Link and also log this retargeting conversion.
Objective-C:
<pre>
[[AppsFlyerLib shared] setResolveDeepLinkURLs:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *resolveDeepLinkURLs;
/**
For advertisers who use vanity OneLinks.
Objective-C:
<pre>
[[AppsFlyerLib shared] oneLinkCustomDomains:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *oneLinkCustomDomains;
/*
* Set phone number for each `start` event. `phoneNumber` will be sent as SHA256 string
*/
@property(nonatomic, nullable) NSString *phoneNumber;
- (NSString *)phoneNumber UNAVAILABLE_ATTRIBUTE;
/**
To disable app's vendor identifier(IDFV), set disableIDFVCollection to true
*/
@property(nonatomic) BOOL disableIDFVCollection;
/**
Enable the collection of Facebook Deferred AppLinks
Requires Facebook SDK and Facebook app on target/client device.
This API must be invoked prior to initializing the AppsFlyer SDK in order to function properly.
Objective-C:
<pre>
[[AppsFlyerLib shared] enableFacebookDeferredApplinksWithClass:[FBSDKAppLinkUtility class]]
</pre>
Swift:
<pre>
AppsFlyerLib.shared().enableFacebookDeferredApplinks(with: FBSDKAppLinkUtility.self)
</pre>
@param facebookAppLinkUtilityClass requeries method call `[FBSDKAppLinkUtility class]` as param.
*/
- (void)enableFacebookDeferredApplinksWithClass:(Class _Nullable)facebookAppLinkUtilityClass;
/**
Use this to send the user's emails
@param userEmails The list of strings that hold mails
@param type Hash algoritm
*/
- (void)setUserEmails:(NSArray<NSString *> * _Nullable)userEmails withCryptType:(EmailCryptType)type;
/**
Start SDK session
Add the following method at the `applicationDidBecomeActive` in AppDelegate class
*/
- (void)start;
- (void)startWithCompletionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler;
/**
Use this method to log an events with multiple values. See AppsFlyer's documentation for details.
Objective-C:
<pre>
[[AppsFlyerLib shared] logEvent:AFEventPurchase
withValues: @{AFEventParamRevenue : @200,
AFEventParamCurrency : @"USD",
AFEventParamQuantity : @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"}];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().logEvent(AFEventPurchase,
withValues: [AFEventParamRevenue : "1200",
AFEventParamContent : "shoes",
AFEventParamContentId: "123"])
</pre>
@param eventName Contains name of event that could be provided from predefined constants in `AppsFlyerLib.h`
@param values Contains dictionary of values for handling by backend
*/
- (void)logEvent:(NSString *)eventName withValues:(NSDictionary * _Nullable)values;
- (void)logEventWithEventName:(NSString *)eventName
eventValues:(NSDictionary<NSString * , id> * _Nullable)eventValues
completionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler
NS_SWIFT_NAME(logEvent(name:values:completionHandler:));
/**
To log and validate in app purchases you can call this method from the completeTransaction: method on
your `SKPaymentTransactionObserver`.
@param productIdentifier The product identifier
@param price The product price
@param currency The product currency
@param transactionId The purchase transaction Id
@param params The additional param, which you want to receive it in the raw reports
@param successBlock The success callback
@param failedBlock The failure callback
*/
- (void)validateAndLogInAppPurchase:(NSString * _Nullable)productIdentifier
price:(NSString * _Nullable)price
currency:(NSString * _Nullable)currency
transactionId:(NSString * _Nullable)transactionId
additionalParameters:(NSDictionary * _Nullable)params
success:(void (^ _Nullable)(NSDictionary * response))successBlock
failure:(void (^ _Nullable)(NSError * _Nullable error, id _Nullable reponse))failedBlock NS_AVAILABLE(10_7, 7_0);
/**
To log location for geo-fencing. Does the same as code below.
<pre>
AppsFlyerLib.shared().logEvent(AFEventLocation, withValues: [AFEventParamLong:longitude, AFEventParamLat:latitude])
</pre>
@param longitude The location longitude
@param latitude The location latitude
*/
- (void)logLocation:(double)longitude latitude:(double)latitude NS_SWIFT_NAME(logLocation(longitude:latitude:));
/**
This method returns AppsFlyer's internal id(unique for your app)
@return Internal AppsFlyer Id
*/
- (NSString *)getAppsFlyerUID;
/**
In case you want to log deep linking. Does the same as `-handleOpenURL:sourceApplication:withAnnotation`.
@warning Preferred to use `-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url sourceApplication:(NSString * _Nullable)sourceApplication API_UNAVAILABLE(macos);
/**
In case you want to log deep linking.
Call this method from inside your AppDelegate `-application:openURL:sourceApplication:annotation:`
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
@param annotation The annotation that passed to your app delegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url
sourceApplication:(NSString * _Nullable)sourceApplication
withAnnotation:(id _Nullable)annotation API_UNAVAILABLE(macos);
/**
Call this method from inside of your AppDelegate `-application:openURL:options:` method.
This method is functionally the same as calling the AppsFlyer method
`-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your app delegate
@param options The options dictionary that was passed to your AppDelegate.
*/
- (void)handleOpenUrl:(NSURL * _Nullable)url options:(NSDictionary * _Nullable)options API_UNAVAILABLE(macos);
/**
Allow AppsFlyer to handle restoration from an NSUserActivity.
Use this method to log deep links with OneLink.
@param userActivity The NSUserActivity that caused the app to be opened.
*/
- (BOOL)continueUserActivity:(NSUserActivity * _Nullable)userActivity
restorationHandler:(void (^ _Nullable)(NSArray * _Nullable))restorationHandler NS_AVAILABLE_IOS(9_0) API_UNAVAILABLE(macos);
/**
Enable AppsFlyer to handle a push notification.
@see [Learn more here](https://support.appsflyer.com/hc/en-us/articles/207364076-Measuring-Push-Notification-Re-Engagement-Campaigns)
@warning To make it work - set data, related to AppsFlyer under key @"af".
@param pushPayload The `userInfo` from received remote notification. One of root keys should be @"af".
*/
- (void)handlePushNotification:(NSDictionary * _Nullable)pushPayload;
/**
Register uninstall - you should register for remote notification and provide AppsFlyer the push device token.
@param deviceToken The `deviceToken` from `-application:didRegisterForRemoteNotificationsWithDeviceToken:`
*/
- (void)registerUninstall:(NSData * _Nullable)deviceToken;
/**
Get SDK version.
@return The AppsFlyer SDK version info.
*/
- (NSString *)getSDKVersion;
/**
This is for internal use.
*/
- (void)remoteDebuggingCallWithData:(NSString *)data;
/**
Used to force the trigger `onAppOpenAttribution` delegate.
Notice, re-engagement, session and launch won't be counted.
Only for OneLink/UniversalLink/Deeplink resolving.
@param URL The param to resolve into -[AppsFlyerLibDelegate onAppOpenAttribution:]
*/
- (void)performOnAppAttributionWithURL:(NSURL * _Nullable)URL;
/**
@brief This property accepts a string value representing the host name for all endpoints.
Can be used to Zero rate your application’s data usage. Contact your CSM for more information.
@warning To use `default` SDK endpoint – set value to `nil`.
Objective-C:
<pre>
[[AppsFlyerLib shared] setHost:@"example.com"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().host = "example.com"
</pre>
*/
@property(nonatomic, strong, readonly) NSString *host;
/**
* This function set the host name and prefix host name for all the endpoints
**/
- (void)setHost:(NSString *)host withHostPrefix:(NSString *)hostPrefix;
/**
* This property accepts a string value representing the prefix host name for all endpoints.
* for example "test" prefix with default host name will have the address "host.appsflyer.com"
*/
@property(nonatomic, strong, readonly) NSString *hostPrefix;
/**
This property is responsible for timeout between sessions in seconds.
Default value is 5 seconds.
*/
@property(atomic) NSUInteger minTimeBetweenSessions;
/**
API to shut down all SDK activities.
@warning This will disable all requests from AppsFlyer SDK.
*/
@property(atomic) BOOL isStopped;
/**
API to set manually Facebook deferred app link
*/
@property(nonatomic, nullable) NSURL *facebookDeferredAppLink;
/**
Block an events from being shared with ad networks and other 3rd party integrations
Must only include letters/digits or underscore, maximum length: 45
*/
@property(nonatomic, nullable) NSArray<NSString *> *sharingFilter;
@property(nonatomic) NSUInteger deepLinkTimeout;
/**
Block an events from being shared with any partner
This method overwrite -[AppsFlyerLib setSharingFilter:]
*/
-(void)setSharingFilterForAllPartners;
/**
Validate if URL contains certain string and append quiery
parameters to deeplink URL. In case if URL does not contain user-defined string,
parameters are not appended to the url.
@param containsString string to check in URL.
@param parameters NSDictionary, which containins parameters to append to the deeplink url after it passed validation.
*/
- (void)appendParametersToDeepLinkingURLWithString:(NSString *)containsString
parameters:(NSDictionary<NSString *, NSString*> *)parameters
NS_SWIFT_NAME(appendParametersToDeeplinkURL(contains:parameters:));
/**
Adds array of keys, which are used to compose key path
to resolve deeplink from push notification payload `userInfo`.
@param deepLinkPath an array of strings which contains keys to search for deeplink in payload.
*/
- (void)addPushNotificationDeepLinkPath:(NSArray<NSString *> *)deepLinkPath;
/**
* Allows sending custom data for partner integration purposes.
*
* @param partnerId ID of the partner (usually has "_int" suffix)
* @param partnerInfo customer data, depends on the integration nature with specific partner
*/
- (void)setPartnerDataWithPartnerId:(NSString * _Nullable)partnerId partnerInfo:(NSDictionary<NSString *, id> * _Nullable)partnerInfo
NS_SWIFT_NAME(setPartnerData(partnerId:partnerInfo:));
@end
NS_ASSUME_NONNULL_END
//
// LinkGenerator.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
Payload container for the `generateInviteUrlWithLinkGenerator:completionHandler:` from `AppsFlyerShareInviteHelper`
*/
@interface AppsFlyerLinkGenerator : NSObject
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
- (instancetype)init NS_UNAVAILABLE;
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
+ (instancetype)new NS_UNAVAILABLE;
@property(nonatomic, nullable) NSString *brandDomain;
/// The channel through which the invite was sent (e.g. Facebook/Gmail/etc.). Usage: Recommended
- (void)setChannel :(nonnull NSString *)channel;
/// ReferrerCustomerId setter
- (void)setReferrerCustomerId:(nonnull NSString *)referrerCustomerId;
/// A campaign name. Usage: Optional
- (void)setCampaign :(nonnull NSString *)campaign;
/// ReferrerUID setter
- (void)setReferrerUID :(nonnull NSString *)referrerUID;
/// Referrer name
- (void)setReferrerName :(nonnull NSString *)referrerName;
/// The URL to referrer user avatar. Usage: Optional
- (void)setReferrerImageURL :(nonnull NSString *)referrerImageURL;
/// AppleAppID
- (void)setAppleAppID :(nonnull NSString *)appleAppID;
/// Deeplink path
- (void)setDeeplinkPath :(nonnull NSString *)deeplinkPath;
/// Base deeplink path
- (void)setBaseDeeplink :(nonnull NSString *)baseDeeplink;
/// A single key value custom parameter. Usage: Optional
- (void)addParameterValue :(nonnull NSString *)value forKey:(NSString *)key;
/// Multiple key value custom parameters. Usage: Optional
- (void)addParameters :(nonnull NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
//
// ShareInviteHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
#import "AppsFlyerLinkGenerator.h"
/**
AppsFlyerShareInviteHelper
*/
@interface AppsFlyerShareInviteHelper : NSObject
NS_ASSUME_NONNULL_BEGIN
/**
* The AppsFlyerShareInviteHelper class builds the invite URL according to various setter methods
* which allow passing on additional information on the click.
* This information is available through `onConversionDataReceived:` when the user accepts the invite and installs the app.
* In addition, campaign and channel parameters are visible within the AppsFlyer Dashboard.
*/
+ (void)generateInviteUrlWithLinkGenerator:(AppsFlyerLinkGenerator *(^)(AppsFlyerLinkGenerator *generator))generatorCreator completionHandler:(void (^)(NSURL *_Nullable url))completionHandler;
/**
* It is recommended to generate an in-app event after the invite is sent to log the invites from the senders' perspective.
* This enables you to find the users that tend most to invite friends, and the media sources that get you these users.
*/
+ (void)logInvite:(nullable NSString *)channel parameters:(nullable NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
framework module AppsFlyerLib {
umbrella header "AppsFlyerLib.h"
export *
module * { export * }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>20D91</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>AppsFlyerLib</string>
<key>CFBundleIdentifier</key>
<string>com.appsflyer.sdk.lib</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>AppsFlyerLib</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>6.2.3</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>12C33</string>
<key>DTPlatformName</key>
<string>macosx</string>
<key>DTPlatformVersion</key>
<string>11.1</string>
<key>DTSDKBuild</key>
<string>20C63</string>
<key>DTSDKName</key>
<string>macosx11.1</string>
<key>DTXcode</key>
<string>1230</string>
<key>DTXcodeBuild</key>
<string>12C33</string>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<key>UIDeviceFamily</key>
<array>
<integer>2</integer>
</array>
</dict>
</plist>
//
// CrossPromotionHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
AppsFlyer allows you to log and attribute installs originating
from cross promotion campaigns of your existing apps.
Afterwards, you can optimize on your cross-promotion traffic to get even better results.
*/
@interface AppsFlyerCrossPromotionHelper : NSObject
/**
To log an impression use the following API call.
Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard.
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
*/
+ (void)logCrossPromoteImpression:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters;
/**
iOS allows you to utilize the StoreKit component to open
the App Store while remaining in the context of your app.
More details at https://support.appsflyer.com/hc/en-us/articles/115004481946-Cross-Promotion-Tracking#tracking-cross-promotion-impressions
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
@param openStoreBlock Contains promoted `clickURL`
*/
+ (void)logAndOpenStore:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters
openStore:(void (^)(NSURLSession *urlSession, NSURL *clickURL))openStoreBlock;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplink.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
NS_SWIFT_NAME(DeepLink)
@interface AppsFlyerDeepLink : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property (readonly, nonnull) NSDictionary<NSString *, id> *clickEvent;
@property (readonly, nullable) NSString *deeplinkValue;
@property (readonly, nullable) NSString *matchType;
@property (readonly, nullable) NSString *clickHTTPReferrer;
@property (readonly, nullable) NSString *mediaSource;
@property (readonly, nullable) NSString *campaign;
@property (readonly, nullable) NSString *campaignId;
@property (readonly, nullable) NSString *afSub1;
@property (readonly, nullable) NSString *afSub2;
@property (readonly, nullable) NSString *afSub3;
@property (readonly, nullable) NSString *afSub4;
@property (readonly, nullable) NSString *afSub5;
@property (readonly) BOOL isDeferred;
- (NSString *)toString;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplinkResult.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
@class AppsFlyerDeepLink;
typedef NS_CLOSED_ENUM(NSUInteger, AFSDKDeepLinkResultStatus) {
AFSDKDeepLinkResultStatusNotFound,
AFSDKDeepLinkResultStatusFound,
AFSDKDeepLinkResultStatusFailure,
} NS_SWIFT_NAME(DeepLinkResultStatus);
NS_SWIFT_NAME(DeepLinkResult)
@interface AppsFlyerDeepLinkResult : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property(readonly) AFSDKDeepLinkResultStatus status;
@property(readonly, nullable) AppsFlyerDeepLink *deepLink;
@property(readonly, nullable) NSError *error;
@end
//
// AppsFlyerLib.h
// AppsFlyerLib
//
// AppsFlyer iOS SDK 6.3.0 (11)
// Copyright (c) 2012-2020 AppsFlyer Ltd. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "AppsFlyerCrossPromotionHelper.h"
#import "AppsFlyerShareInviteHelper.h"
#import "AppsFlyerDeepLinkResult.h"
#import "AppsFlyerDeepLink.h"
NS_ASSUME_NONNULL_BEGIN
// In app event names constants
#define AFEventLevelAchieved @"af_level_achieved"
#define AFEventAddPaymentInfo @"af_add_payment_info"
#define AFEventAddToCart @"af_add_to_cart"
#define AFEventAddToWishlist @"af_add_to_wishlist"
#define AFEventCompleteRegistration @"af_complete_registration"
#define AFEventTutorial_completion @"af_tutorial_completion"
#define AFEventInitiatedCheckout @"af_initiated_checkout"
#define AFEventPurchase @"af_purchase"
#define AFEventRate @"af_rate"
#define AFEventSearch @"af_search"
#define AFEventSpentCredits @"af_spent_credits"
#define AFEventAchievementUnlocked @"af_achievement_unlocked"
#define AFEventContentView @"af_content_view"
#define AFEventListView @"af_list_view"
#define AFEventTravelBooking @"af_travel_booking"
#define AFEventShare @"af_share"
#define AFEventInvite @"af_invite"
#define AFEventLogin @"af_login"
#define AFEventReEngage @"af_re_engage"
#define AFEventUpdate @"af_update"
#define AFEventOpenedFromPushNotification @"af_opened_from_push_notification"
#define AFEventLocation @"af_location_coordinates"
#define AFEventCustomerSegment @"af_customer_segment"
#define AFEventSubscribe @"af_subscribe"
#define AFEventStartTrial @"af_start_trial"
#define AFEventAdClick @"af_ad_click"
#define AFEventAdView @"af_ad_view"
// In app event parameter names
#define AFEventParamContent @"af_content"
#define AFEventParamAchievementId @"af_achievement_id"
#define AFEventParamLevel @"af_level"
#define AFEventParamScore @"af_score"
#define AFEventParamSuccess @"af_success"
#define AFEventParamPrice @"af_price"
#define AFEventParamContentType @"af_content_type"
#define AFEventParamContentId @"af_content_id"
#define AFEventParamContentList @"af_content_list"
#define AFEventParamCurrency @"af_currency"
#define AFEventParamQuantity @"af_quantity"
#define AFEventParamRegistrationMethod @"af_registration_method"
#define AFEventParamPaymentInfoAvailable @"af_payment_info_available"
#define AFEventParamMaxRatingValue @"af_max_rating_value"
#define AFEventParamRatingValue @"af_rating_value"
#define AFEventParamSearchString @"af_search_string"
#define AFEventParamDateA @"af_date_a"
#define AFEventParamDateB @"af_date_b"
#define AFEventParamDestinationA @"af_destination_a"
#define AFEventParamDestinationB @"af_destination_b"
#define AFEventParamDescription @"af_description"
#define AFEventParamClass @"af_class"
#define AFEventParamEventStart @"af_event_start"
#define AFEventParamEventEnd @"af_event_end"
#define AFEventParamLat @"af_lat"
#define AFEventParamLong @"af_long"
#define AFEventParamCustomerUserId @"af_customer_user_id"
#define AFEventParamValidated @"af_validated"
#define AFEventParamRevenue @"af_revenue"
#define AFEventProjectedParamRevenue @"af_projected_revenue"
#define AFEventParamReceiptId @"af_receipt_id"
#define AFEventParamTutorialId @"af_tutorial_id"
#define AFEventParamVirtualCurrencyName @"af_virtual_currency_name"
#define AFEventParamDeepLink @"af_deep_link"
#define AFEventParamOldVersion @"af_old_version"
#define AFEventParamNewVersion @"af_new_version"
#define AFEventParamReviewText @"af_review_text"
#define AFEventParamCouponCode @"af_coupon_code"
#define AFEventParamOrderId @"af_order_id"
#define AFEventParam1 @"af_param_1"
#define AFEventParam2 @"af_param_2"
#define AFEventParam3 @"af_param_3"
#define AFEventParam4 @"af_param_4"
#define AFEventParam5 @"af_param_5"
#define AFEventParam6 @"af_param_6"
#define AFEventParam7 @"af_param_7"
#define AFEventParam8 @"af_param_8"
#define AFEventParam9 @"af_param_9"
#define AFEventParam10 @"af_param_10"
#define AFEventParamDepartingDepartureDate @"af_departing_departure_date"
#define AFEventParamReturningDepartureDate @"af_returning_departure_date"
#define AFEventParamDestinationList @"af_destination_list" //array of string
#define AFEventParamCity @"af_city"
#define AFEventParamRegion @"af_region"
#define AFEventParamCountry @"af_country"
#define AFEventParamDepartingArrivalDate @"af_departing_arrival_date"
#define AFEventParamReturningArrivalDate @"af_returning_arrival_date"
#define AFEventParamSuggestedDestinations @"af_suggested_destinations" //array of string
#define AFEventParamTravelStart @"af_travel_start"
#define AFEventParamTravelEnd @"af_travel_end"
#define AFEventParamNumAdults @"af_num_adults"
#define AFEventParamNumChildren @"af_num_children"
#define AFEventParamNumInfants @"af_num_infants"
#define AFEventParamSuggestedHotels @"af_suggested_hotels" //array of string
#define AFEventParamUserScore @"af_user_score"
#define AFEventParamHotelScore @"af_hotel_score"
#define AFEventParamPurchaseCurrency @"af_purchase_currency"
#define AFEventParamPreferredStarRatings @"af_preferred_star_ratings" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredPriceRange @"af_preferred_price_range" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredNeighborhoods @"af_preferred_neighborhoods" //array of string
#define AFEventParamPreferredNumStops @"af_preferred_num_stops"
#define AFEventParamAdRevenueAdType @"af_adrev_ad_type"
#define AFEventParamAdRevenueNetworkName @"af_adrev_network_name"
#define AFEventParamAdRevenuePlacementId @"af_adrev_placement_id"
#define AFEventParamAdRevenueAdSize @"af_adrev_ad_size"
#define AFEventParamAdRevenueMediatedNetworkName @"af_adrev_mediated_network_name"
/// Mail hashing type
typedef enum {
/// None
EmailCryptTypeNone = 0,
/// SHA1
EmailCryptTypeSHA1 = 1,
/// MD5
EmailCryptTypeMD5 = 2,
/// SHA256
EmailCryptTypeSHA256 = 3
} EmailCryptType;
NS_SWIFT_NAME(DeepLinkDelegate)
@protocol AppsFlyerDeepLinkDelegate <NSObject>
@optional
- (void)didResolveDeepLink:(AppsFlyerDeepLinkResult *_Nonnull)result;
@end
/**
Conform and subscribe to this protocol to allow getting data about conversion and
install attribution
*/
@protocol AppsFlyerLibDelegate <NSObject>
/**
`conversionInfo` contains information about install.
Organic/non-organic, etc.
@param conversionInfo May contain <code>null</code> values for some keys. Please handle this case.
*/
- (void)onConversionDataSuccess:(NSDictionary *)conversionInfo;
/**
Any errors that occurred during the conversion request.
*/
- (void)onConversionDataFail:(NSError *)error;
@optional
/**
`attributionData` contains information about OneLink, deeplink.
*/
- (void)onAppOpenAttribution:(NSDictionary *)attributionData;
/**
Any errors that occurred during the attribution request.
*/
- (void)onAppOpenAttributionFailure:(NSError *)error;
/**
@abstract Sets the HTTP header fields of the ESP resolving to the given
dictionary.
@discussion This method replaces all header fields that may have
existed before this method ESP resolving call.
To keep default SDK behavior - return nil;
*/
- (NSDictionary <NSString *, NSString *> * _Nullable)allHTTPHeaderFieldsForResolveDeepLinkURL:(NSURL *)URL;
@end
/**
You can log installs, app updates, sessions and additional in-app events
(including in-app purchases, game levels, etc.)
to evaluate ROI and user engagement.
The iOS SDK is compatible with all iOS/tvOS devices with iOS version 7 and above.
@see [SDK Integration Validator](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS)
for more information.
*/
@interface AppsFlyerLib : NSObject
/**
Gets the singleton instance of the AppsFlyerLib class, creating it if
necessary.
@return The singleton instance of AppsFlyerLib.
*/
+ (AppsFlyerLib *)shared;
/**
In case you use your own user ID in your app, you can set this property to that ID.
Enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs
*/
@property(nonatomic, strong, nullable) NSString * customerUserID;
/**
In case you use custom data and you want to receive it in the raw reports.
@see [Setting additional custom data](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS#setting-additional-custom-data) for more information.
*/
@property(nonatomic, strong, nullable, setter = setAdditionalData:) NSDictionary * customData;
/**
Use this property to set your AppsFlyer's dev key
*/
@property(nonatomic, strong) NSString * appsFlyerDevKey;
/**
Use this property to set your app's Apple ID(taken from the app's page on iTunes Connect)
*/
@property(nonatomic, strong) NSString * appleAppID;
#ifndef AFSDK_NO_IDFA
/**
AppsFlyer SDK collect Apple's `advertisingIdentifier` if the `AdSupport.framework` included in the SDK.
You can disable this behavior by setting the following property to YES
*/
@property(nonatomic) BOOL disableAdvertisingIdentifier;
@property(nonatomic, strong, readonly) NSString *advertisingIdentifier;
/**
Waits for request user authorization to access app-related data
*/
- (void)waitForATTUserAuthorizationWithTimeoutInterval:(NSTimeInterval)timeoutInterval
NS_SWIFT_NAME(waitForATTUserAuthorization(timeoutInterval:));
#endif
@property(nonatomic) BOOL disableSKAdNetwork;
/**
In case of in app purchase events, you can set the currency code your user has purchased with.
The currency code is a 3 letter code according to ISO standards
Objective-C:
<pre>
[[AppsFlyerLib shared] setCurrencyCode:@"USD"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().currencyCode = "USD"
</pre>
*/
@property(nonatomic, strong, nullable) NSString *currencyCode;
/**
Prints SDK messages to the console log. This property should only be used in `DEBUG` mode.
The default value is `NO`
*/
@property(nonatomic) BOOL isDebug;
/**
Set this flag to `YES`, to collect the current device name(e.g. "My iPhone"). Default value is `NO`
*/
@property(nonatomic) BOOL shouldCollectDeviceName;
/**
Set your `OneLink ID` from OneLink configuration. Used in User Invites to generate a OneLink.
*/
@property(nonatomic, strong, nullable, setter = setAppInviteOneLink:) NSString * appInviteOneLinkID;
/**
Opt-out logging for specific user
*/
@property(atomic) BOOL anonymizeUser;
/**
Opt-out for Apple Search Ads attributions
*/
@property(atomic) BOOL disableCollectASA;
@property(nonatomic) BOOL disableAppleAdsAttribution;
/**
AppsFlyer delegate. See `AppsFlyerLibDelegate`
*/
@property(weak, nonatomic) id<AppsFlyerLibDelegate> delegate;
@property(weak, nonatomic) id<AppsFlyerDeepLinkDelegate> deepLinkDelegate;
/**
In app purchase receipt validation Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useReceiptValidationSandbox;
/**
Set this flag to test uninstall on Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useUninstallSandbox;
/**
For advertisers who wrap OneLink within another Universal Link.
An advertiser will be able to deeplink from a OneLink wrapped within another Universal Link and also log this retargeting conversion.
Objective-C:
<pre>
[[AppsFlyerLib shared] setResolveDeepLinkURLs:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *resolveDeepLinkURLs;
/**
For advertisers who use vanity OneLinks.
Objective-C:
<pre>
[[AppsFlyerLib shared] oneLinkCustomDomains:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *oneLinkCustomDomains;
/*
* Set phone number for each `start` event. `phoneNumber` will be sent as SHA256 string
*/
@property(nonatomic, nullable) NSString *phoneNumber;
- (NSString *)phoneNumber UNAVAILABLE_ATTRIBUTE;
/**
To disable app's vendor identifier(IDFV), set disableIDFVCollection to true
*/
@property(nonatomic) BOOL disableIDFVCollection;
/**
Enable the collection of Facebook Deferred AppLinks
Requires Facebook SDK and Facebook app on target/client device.
This API must be invoked prior to initializing the AppsFlyer SDK in order to function properly.
Objective-C:
<pre>
[[AppsFlyerLib shared] enableFacebookDeferredApplinksWithClass:[FBSDKAppLinkUtility class]]
</pre>
Swift:
<pre>
AppsFlyerLib.shared().enableFacebookDeferredApplinks(with: FBSDKAppLinkUtility.self)
</pre>
@param facebookAppLinkUtilityClass requeries method call `[FBSDKAppLinkUtility class]` as param.
*/
- (void)enableFacebookDeferredApplinksWithClass:(Class _Nullable)facebookAppLinkUtilityClass;
/**
Use this to send the user's emails
@param userEmails The list of strings that hold mails
@param type Hash algoritm
*/
- (void)setUserEmails:(NSArray<NSString *> * _Nullable)userEmails withCryptType:(EmailCryptType)type;
/**
Start SDK session
Add the following method at the `applicationDidBecomeActive` in AppDelegate class
*/
- (void)start;
- (void)startWithCompletionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler;
/**
Use this method to log an events with multiple values. See AppsFlyer's documentation for details.
Objective-C:
<pre>
[[AppsFlyerLib shared] logEvent:AFEventPurchase
withValues: @{AFEventParamRevenue : @200,
AFEventParamCurrency : @"USD",
AFEventParamQuantity : @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"}];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().logEvent(AFEventPurchase,
withValues: [AFEventParamRevenue : "1200",
AFEventParamContent : "shoes",
AFEventParamContentId: "123"])
</pre>
@param eventName Contains name of event that could be provided from predefined constants in `AppsFlyerLib.h`
@param values Contains dictionary of values for handling by backend
*/
- (void)logEvent:(NSString *)eventName withValues:(NSDictionary * _Nullable)values;
- (void)logEventWithEventName:(NSString *)eventName
eventValues:(NSDictionary<NSString * , id> * _Nullable)eventValues
completionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler
NS_SWIFT_NAME(logEvent(name:values:completionHandler:));
/**
To log and validate in app purchases you can call this method from the completeTransaction: method on
your `SKPaymentTransactionObserver`.
@param productIdentifier The product identifier
@param price The product price
@param currency The product currency
@param transactionId The purchase transaction Id
@param params The additional param, which you want to receive it in the raw reports
@param successBlock The success callback
@param failedBlock The failure callback
*/
- (void)validateAndLogInAppPurchase:(NSString * _Nullable)productIdentifier
price:(NSString * _Nullable)price
currency:(NSString * _Nullable)currency
transactionId:(NSString * _Nullable)transactionId
additionalParameters:(NSDictionary * _Nullable)params
success:(void (^ _Nullable)(NSDictionary * response))successBlock
failure:(void (^ _Nullable)(NSError * _Nullable error, id _Nullable reponse))failedBlock NS_AVAILABLE(10_7, 7_0);
/**
To log location for geo-fencing. Does the same as code below.
<pre>
AppsFlyerLib.shared().logEvent(AFEventLocation, withValues: [AFEventParamLong:longitude, AFEventParamLat:latitude])
</pre>
@param longitude The location longitude
@param latitude The location latitude
*/
- (void)logLocation:(double)longitude latitude:(double)latitude NS_SWIFT_NAME(logLocation(longitude:latitude:));
/**
This method returns AppsFlyer's internal id(unique for your app)
@return Internal AppsFlyer Id
*/
- (NSString *)getAppsFlyerUID;
/**
In case you want to log deep linking. Does the same as `-handleOpenURL:sourceApplication:withAnnotation`.
@warning Preferred to use `-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url sourceApplication:(NSString * _Nullable)sourceApplication API_UNAVAILABLE(macos);
/**
In case you want to log deep linking.
Call this method from inside your AppDelegate `-application:openURL:sourceApplication:annotation:`
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
@param annotation The annotation that passed to your app delegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url
sourceApplication:(NSString * _Nullable)sourceApplication
withAnnotation:(id _Nullable)annotation API_UNAVAILABLE(macos);
/**
Call this method from inside of your AppDelegate `-application:openURL:options:` method.
This method is functionally the same as calling the AppsFlyer method
`-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your app delegate
@param options The options dictionary that was passed to your AppDelegate.
*/
- (void)handleOpenUrl:(NSURL * _Nullable)url options:(NSDictionary * _Nullable)options API_UNAVAILABLE(macos);
/**
Allow AppsFlyer to handle restoration from an NSUserActivity.
Use this method to log deep links with OneLink.
@param userActivity The NSUserActivity that caused the app to be opened.
*/
- (BOOL)continueUserActivity:(NSUserActivity * _Nullable)userActivity
restorationHandler:(void (^ _Nullable)(NSArray * _Nullable))restorationHandler NS_AVAILABLE_IOS(9_0) API_UNAVAILABLE(macos);
/**
Enable AppsFlyer to handle a push notification.
@see [Learn more here](https://support.appsflyer.com/hc/en-us/articles/207364076-Measuring-Push-Notification-Re-Engagement-Campaigns)
@warning To make it work - set data, related to AppsFlyer under key @"af".
@param pushPayload The `userInfo` from received remote notification. One of root keys should be @"af".
*/
- (void)handlePushNotification:(NSDictionary * _Nullable)pushPayload;
/**
Register uninstall - you should register for remote notification and provide AppsFlyer the push device token.
@param deviceToken The `deviceToken` from `-application:didRegisterForRemoteNotificationsWithDeviceToken:`
*/
- (void)registerUninstall:(NSData * _Nullable)deviceToken;
/**
Get SDK version.
@return The AppsFlyer SDK version info.
*/
- (NSString *)getSDKVersion;
/**
This is for internal use.
*/
- (void)remoteDebuggingCallWithData:(NSString *)data;
/**
Used to force the trigger `onAppOpenAttribution` delegate.
Notice, re-engagement, session and launch won't be counted.
Only for OneLink/UniversalLink/Deeplink resolving.
@param URL The param to resolve into -[AppsFlyerLibDelegate onAppOpenAttribution:]
*/
- (void)performOnAppAttributionWithURL:(NSURL * _Nullable)URL;
/**
@brief This property accepts a string value representing the host name for all endpoints.
Can be used to Zero rate your application’s data usage. Contact your CSM for more information.
@warning To use `default` SDK endpoint – set value to `nil`.
Objective-C:
<pre>
[[AppsFlyerLib shared] setHost:@"example.com"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().host = "example.com"
</pre>
*/
@property(nonatomic, strong, readonly) NSString *host;
/**
* This function set the host name and prefix host name for all the endpoints
**/
- (void)setHost:(NSString *)host withHostPrefix:(NSString *)hostPrefix;
/**
* This property accepts a string value representing the prefix host name for all endpoints.
* for example "test" prefix with default host name will have the address "host.appsflyer.com"
*/
@property(nonatomic, strong, readonly) NSString *hostPrefix;
/**
This property is responsible for timeout between sessions in seconds.
Default value is 5 seconds.
*/
@property(atomic) NSUInteger minTimeBetweenSessions;
/**
API to shut down all SDK activities.
@warning This will disable all requests from AppsFlyer SDK.
*/
@property(atomic) BOOL isStopped;
/**
API to set manually Facebook deferred app link
*/
@property(nonatomic, nullable) NSURL *facebookDeferredAppLink;
/**
Block an events from being shared with ad networks and other 3rd party integrations
Must only include letters/digits or underscore, maximum length: 45
*/
@property(nonatomic, nullable) NSArray<NSString *> *sharingFilter;
@property(nonatomic) NSUInteger deepLinkTimeout;
/**
Block an events from being shared with any partner
This method overwrite -[AppsFlyerLib setSharingFilter:]
*/
-(void)setSharingFilterForAllPartners;
/**
Validate if URL contains certain string and append quiery
parameters to deeplink URL. In case if URL does not contain user-defined string,
parameters are not appended to the url.
@param containsString string to check in URL.
@param parameters NSDictionary, which containins parameters to append to the deeplink url after it passed validation.
*/
- (void)appendParametersToDeepLinkingURLWithString:(NSString *)containsString
parameters:(NSDictionary<NSString *, NSString*> *)parameters
NS_SWIFT_NAME(appendParametersToDeeplinkURL(contains:parameters:));
/**
Adds array of keys, which are used to compose key path
to resolve deeplink from push notification payload `userInfo`.
@param deepLinkPath an array of strings which contains keys to search for deeplink in payload.
*/
- (void)addPushNotificationDeepLinkPath:(NSArray<NSString *> *)deepLinkPath;
/**
* Allows sending custom data for partner integration purposes.
*
* @param partnerId ID of the partner (usually has "_int" suffix)
* @param partnerInfo customer data, depends on the integration nature with specific partner
*/
- (void)setPartnerDataWithPartnerId:(NSString * _Nullable)partnerId partnerInfo:(NSDictionary<NSString *, id> * _Nullable)partnerInfo
NS_SWIFT_NAME(setPartnerData(partnerId:partnerInfo:));
@end
NS_ASSUME_NONNULL_END
//
// LinkGenerator.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
Payload container for the `generateInviteUrlWithLinkGenerator:completionHandler:` from `AppsFlyerShareInviteHelper`
*/
@interface AppsFlyerLinkGenerator : NSObject
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
- (instancetype)init NS_UNAVAILABLE;
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
+ (instancetype)new NS_UNAVAILABLE;
@property(nonatomic, nullable) NSString *brandDomain;
/// The channel through which the invite was sent (e.g. Facebook/Gmail/etc.). Usage: Recommended
- (void)setChannel :(nonnull NSString *)channel;
/// ReferrerCustomerId setter
- (void)setReferrerCustomerId:(nonnull NSString *)referrerCustomerId;
/// A campaign name. Usage: Optional
- (void)setCampaign :(nonnull NSString *)campaign;
/// ReferrerUID setter
- (void)setReferrerUID :(nonnull NSString *)referrerUID;
/// Referrer name
- (void)setReferrerName :(nonnull NSString *)referrerName;
/// The URL to referrer user avatar. Usage: Optional
- (void)setReferrerImageURL :(nonnull NSString *)referrerImageURL;
/// AppleAppID
- (void)setAppleAppID :(nonnull NSString *)appleAppID;
/// Deeplink path
- (void)setDeeplinkPath :(nonnull NSString *)deeplinkPath;
/// Base deeplink path
- (void)setBaseDeeplink :(nonnull NSString *)baseDeeplink;
/// A single key value custom parameter. Usage: Optional
- (void)addParameterValue :(nonnull NSString *)value forKey:(NSString *)key;
/// Multiple key value custom parameters. Usage: Optional
- (void)addParameters :(nonnull NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
//
// ShareInviteHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
#import "AppsFlyerLinkGenerator.h"
/**
AppsFlyerShareInviteHelper
*/
@interface AppsFlyerShareInviteHelper : NSObject
NS_ASSUME_NONNULL_BEGIN
/**
* The AppsFlyerShareInviteHelper class builds the invite URL according to various setter methods
* which allow passing on additional information on the click.
* This information is available through `onConversionDataReceived:` when the user accepts the invite and installs the app.
* In addition, campaign and channel parameters are visible within the AppsFlyer Dashboard.
*/
+ (void)generateInviteUrlWithLinkGenerator:(AppsFlyerLinkGenerator *(^)(AppsFlyerLinkGenerator *generator))generatorCreator completionHandler:(void (^)(NSURL *_Nullable url))completionHandler;
/**
* It is recommended to generate an in-app event after the invite is sent to log the invites from the senders' perspective.
* This enables you to find the users that tend most to invite friends, and the media sources that get you these users.
*/
+ (void)logInvite:(nullable NSString *)channel parameters:(nullable NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
framework module AppsFlyerLib {
umbrella header "AppsFlyerLib.h"
export *
module * { export * }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>20D91</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>AppsFlyerLib</string>
<key>CFBundleIdentifier</key>
<string>com.appsflyer.sdk.lib</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>AppsFlyerLib</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>6.2.3</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>12C33</string>
<key>DTPlatformName</key>
<string>macosx</string>
<key>DTPlatformVersion</key>
<string>11.1</string>
<key>DTSDKBuild</key>
<string>20C63</string>
<key>DTSDKName</key>
<string>macosx11.1</string>
<key>DTXcode</key>
<string>1230</string>
<key>DTXcodeBuild</key>
<string>12C33</string>
<key>LSMinimumSystemVersion</key>
<string>11.1</string>
</dict>
</plist>
//
// CrossPromotionHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
AppsFlyer allows you to log and attribute installs originating
from cross promotion campaigns of your existing apps.
Afterwards, you can optimize on your cross-promotion traffic to get even better results.
*/
@interface AppsFlyerCrossPromotionHelper : NSObject
/**
To log an impression use the following API call.
Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard.
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
*/
+ (void)logCrossPromoteImpression:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters;
/**
iOS allows you to utilize the StoreKit component to open
the App Store while remaining in the context of your app.
More details at https://support.appsflyer.com/hc/en-us/articles/115004481946-Cross-Promotion-Tracking#tracking-cross-promotion-impressions
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
@param openStoreBlock Contains promoted `clickURL`
*/
+ (void)logAndOpenStore:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters
openStore:(void (^)(NSURLSession *urlSession, NSURL *clickURL))openStoreBlock;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplink.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
NS_SWIFT_NAME(DeepLink)
@interface AppsFlyerDeepLink : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property (readonly, nonnull) NSDictionary<NSString *, id> *clickEvent;
@property (readonly, nullable) NSString *deeplinkValue;
@property (readonly, nullable) NSString *matchType;
@property (readonly, nullable) NSString *clickHTTPReferrer;
@property (readonly, nullable) NSString *mediaSource;
@property (readonly, nullable) NSString *campaign;
@property (readonly, nullable) NSString *campaignId;
@property (readonly, nullable) NSString *afSub1;
@property (readonly, nullable) NSString *afSub2;
@property (readonly, nullable) NSString *afSub3;
@property (readonly, nullable) NSString *afSub4;
@property (readonly, nullable) NSString *afSub5;
@property (readonly) BOOL isDeferred;
- (NSString *)toString;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplinkResult.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
@class AppsFlyerDeepLink;
typedef NS_CLOSED_ENUM(NSUInteger, AFSDKDeepLinkResultStatus) {
AFSDKDeepLinkResultStatusNotFound,
AFSDKDeepLinkResultStatusFound,
AFSDKDeepLinkResultStatusFailure,
} NS_SWIFT_NAME(DeepLinkResultStatus);
NS_SWIFT_NAME(DeepLinkResult)
@interface AppsFlyerDeepLinkResult : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property(readonly) AFSDKDeepLinkResultStatus status;
@property(readonly, nullable) AppsFlyerDeepLink *deepLink;
@property(readonly, nullable) NSError *error;
@end
//
// AppsFlyerLib.h
// AppsFlyerLib
//
// AppsFlyer iOS SDK 6.3.0 (11)
// Copyright (c) 2012-2020 AppsFlyer Ltd. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "AppsFlyerCrossPromotionHelper.h"
#import "AppsFlyerShareInviteHelper.h"
#import "AppsFlyerDeepLinkResult.h"
#import "AppsFlyerDeepLink.h"
NS_ASSUME_NONNULL_BEGIN
// In app event names constants
#define AFEventLevelAchieved @"af_level_achieved"
#define AFEventAddPaymentInfo @"af_add_payment_info"
#define AFEventAddToCart @"af_add_to_cart"
#define AFEventAddToWishlist @"af_add_to_wishlist"
#define AFEventCompleteRegistration @"af_complete_registration"
#define AFEventTutorial_completion @"af_tutorial_completion"
#define AFEventInitiatedCheckout @"af_initiated_checkout"
#define AFEventPurchase @"af_purchase"
#define AFEventRate @"af_rate"
#define AFEventSearch @"af_search"
#define AFEventSpentCredits @"af_spent_credits"
#define AFEventAchievementUnlocked @"af_achievement_unlocked"
#define AFEventContentView @"af_content_view"
#define AFEventListView @"af_list_view"
#define AFEventTravelBooking @"af_travel_booking"
#define AFEventShare @"af_share"
#define AFEventInvite @"af_invite"
#define AFEventLogin @"af_login"
#define AFEventReEngage @"af_re_engage"
#define AFEventUpdate @"af_update"
#define AFEventOpenedFromPushNotification @"af_opened_from_push_notification"
#define AFEventLocation @"af_location_coordinates"
#define AFEventCustomerSegment @"af_customer_segment"
#define AFEventSubscribe @"af_subscribe"
#define AFEventStartTrial @"af_start_trial"
#define AFEventAdClick @"af_ad_click"
#define AFEventAdView @"af_ad_view"
// In app event parameter names
#define AFEventParamContent @"af_content"
#define AFEventParamAchievementId @"af_achievement_id"
#define AFEventParamLevel @"af_level"
#define AFEventParamScore @"af_score"
#define AFEventParamSuccess @"af_success"
#define AFEventParamPrice @"af_price"
#define AFEventParamContentType @"af_content_type"
#define AFEventParamContentId @"af_content_id"
#define AFEventParamContentList @"af_content_list"
#define AFEventParamCurrency @"af_currency"
#define AFEventParamQuantity @"af_quantity"
#define AFEventParamRegistrationMethod @"af_registration_method"
#define AFEventParamPaymentInfoAvailable @"af_payment_info_available"
#define AFEventParamMaxRatingValue @"af_max_rating_value"
#define AFEventParamRatingValue @"af_rating_value"
#define AFEventParamSearchString @"af_search_string"
#define AFEventParamDateA @"af_date_a"
#define AFEventParamDateB @"af_date_b"
#define AFEventParamDestinationA @"af_destination_a"
#define AFEventParamDestinationB @"af_destination_b"
#define AFEventParamDescription @"af_description"
#define AFEventParamClass @"af_class"
#define AFEventParamEventStart @"af_event_start"
#define AFEventParamEventEnd @"af_event_end"
#define AFEventParamLat @"af_lat"
#define AFEventParamLong @"af_long"
#define AFEventParamCustomerUserId @"af_customer_user_id"
#define AFEventParamValidated @"af_validated"
#define AFEventParamRevenue @"af_revenue"
#define AFEventProjectedParamRevenue @"af_projected_revenue"
#define AFEventParamReceiptId @"af_receipt_id"
#define AFEventParamTutorialId @"af_tutorial_id"
#define AFEventParamVirtualCurrencyName @"af_virtual_currency_name"
#define AFEventParamDeepLink @"af_deep_link"
#define AFEventParamOldVersion @"af_old_version"
#define AFEventParamNewVersion @"af_new_version"
#define AFEventParamReviewText @"af_review_text"
#define AFEventParamCouponCode @"af_coupon_code"
#define AFEventParamOrderId @"af_order_id"
#define AFEventParam1 @"af_param_1"
#define AFEventParam2 @"af_param_2"
#define AFEventParam3 @"af_param_3"
#define AFEventParam4 @"af_param_4"
#define AFEventParam5 @"af_param_5"
#define AFEventParam6 @"af_param_6"
#define AFEventParam7 @"af_param_7"
#define AFEventParam8 @"af_param_8"
#define AFEventParam9 @"af_param_9"
#define AFEventParam10 @"af_param_10"
#define AFEventParamDepartingDepartureDate @"af_departing_departure_date"
#define AFEventParamReturningDepartureDate @"af_returning_departure_date"
#define AFEventParamDestinationList @"af_destination_list" //array of string
#define AFEventParamCity @"af_city"
#define AFEventParamRegion @"af_region"
#define AFEventParamCountry @"af_country"
#define AFEventParamDepartingArrivalDate @"af_departing_arrival_date"
#define AFEventParamReturningArrivalDate @"af_returning_arrival_date"
#define AFEventParamSuggestedDestinations @"af_suggested_destinations" //array of string
#define AFEventParamTravelStart @"af_travel_start"
#define AFEventParamTravelEnd @"af_travel_end"
#define AFEventParamNumAdults @"af_num_adults"
#define AFEventParamNumChildren @"af_num_children"
#define AFEventParamNumInfants @"af_num_infants"
#define AFEventParamSuggestedHotels @"af_suggested_hotels" //array of string
#define AFEventParamUserScore @"af_user_score"
#define AFEventParamHotelScore @"af_hotel_score"
#define AFEventParamPurchaseCurrency @"af_purchase_currency"
#define AFEventParamPreferredStarRatings @"af_preferred_star_ratings" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredPriceRange @"af_preferred_price_range" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredNeighborhoods @"af_preferred_neighborhoods" //array of string
#define AFEventParamPreferredNumStops @"af_preferred_num_stops"
#define AFEventParamAdRevenueAdType @"af_adrev_ad_type"
#define AFEventParamAdRevenueNetworkName @"af_adrev_network_name"
#define AFEventParamAdRevenuePlacementId @"af_adrev_placement_id"
#define AFEventParamAdRevenueAdSize @"af_adrev_ad_size"
#define AFEventParamAdRevenueMediatedNetworkName @"af_adrev_mediated_network_name"
/// Mail hashing type
typedef enum {
/// None
EmailCryptTypeNone = 0,
/// SHA1
EmailCryptTypeSHA1 = 1,
/// MD5
EmailCryptTypeMD5 = 2,
/// SHA256
EmailCryptTypeSHA256 = 3
} EmailCryptType;
NS_SWIFT_NAME(DeepLinkDelegate)
@protocol AppsFlyerDeepLinkDelegate <NSObject>
@optional
- (void)didResolveDeepLink:(AppsFlyerDeepLinkResult *_Nonnull)result;
@end
/**
Conform and subscribe to this protocol to allow getting data about conversion and
install attribution
*/
@protocol AppsFlyerLibDelegate <NSObject>
/**
`conversionInfo` contains information about install.
Organic/non-organic, etc.
@param conversionInfo May contain <code>null</code> values for some keys. Please handle this case.
*/
- (void)onConversionDataSuccess:(NSDictionary *)conversionInfo;
/**
Any errors that occurred during the conversion request.
*/
- (void)onConversionDataFail:(NSError *)error;
@optional
/**
`attributionData` contains information about OneLink, deeplink.
*/
- (void)onAppOpenAttribution:(NSDictionary *)attributionData;
/**
Any errors that occurred during the attribution request.
*/
- (void)onAppOpenAttributionFailure:(NSError *)error;
/**
@abstract Sets the HTTP header fields of the ESP resolving to the given
dictionary.
@discussion This method replaces all header fields that may have
existed before this method ESP resolving call.
To keep default SDK behavior - return nil;
*/
- (NSDictionary <NSString *, NSString *> * _Nullable)allHTTPHeaderFieldsForResolveDeepLinkURL:(NSURL *)URL;
@end
/**
You can log installs, app updates, sessions and additional in-app events
(including in-app purchases, game levels, etc.)
to evaluate ROI and user engagement.
The iOS SDK is compatible with all iOS/tvOS devices with iOS version 7 and above.
@see [SDK Integration Validator](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS)
for more information.
*/
@interface AppsFlyerLib : NSObject
/**
Gets the singleton instance of the AppsFlyerLib class, creating it if
necessary.
@return The singleton instance of AppsFlyerLib.
*/
+ (AppsFlyerLib *)shared;
/**
In case you use your own user ID in your app, you can set this property to that ID.
Enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs
*/
@property(nonatomic, strong, nullable) NSString * customerUserID;
/**
In case you use custom data and you want to receive it in the raw reports.
@see [Setting additional custom data](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS#setting-additional-custom-data) for more information.
*/
@property(nonatomic, strong, nullable, setter = setAdditionalData:) NSDictionary * customData;
/**
Use this property to set your AppsFlyer's dev key
*/
@property(nonatomic, strong) NSString * appsFlyerDevKey;
/**
Use this property to set your app's Apple ID(taken from the app's page on iTunes Connect)
*/
@property(nonatomic, strong) NSString * appleAppID;
#ifndef AFSDK_NO_IDFA
/**
AppsFlyer SDK collect Apple's `advertisingIdentifier` if the `AdSupport.framework` included in the SDK.
You can disable this behavior by setting the following property to YES
*/
@property(nonatomic) BOOL disableAdvertisingIdentifier;
@property(nonatomic, strong, readonly) NSString *advertisingIdentifier;
/**
Waits for request user authorization to access app-related data
*/
- (void)waitForATTUserAuthorizationWithTimeoutInterval:(NSTimeInterval)timeoutInterval
NS_SWIFT_NAME(waitForATTUserAuthorization(timeoutInterval:));
#endif
@property(nonatomic) BOOL disableSKAdNetwork;
/**
In case of in app purchase events, you can set the currency code your user has purchased with.
The currency code is a 3 letter code according to ISO standards
Objective-C:
<pre>
[[AppsFlyerLib shared] setCurrencyCode:@"USD"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().currencyCode = "USD"
</pre>
*/
@property(nonatomic, strong, nullable) NSString *currencyCode;
/**
Prints SDK messages to the console log. This property should only be used in `DEBUG` mode.
The default value is `NO`
*/
@property(nonatomic) BOOL isDebug;
/**
Set this flag to `YES`, to collect the current device name(e.g. "My iPhone"). Default value is `NO`
*/
@property(nonatomic) BOOL shouldCollectDeviceName;
/**
Set your `OneLink ID` from OneLink configuration. Used in User Invites to generate a OneLink.
*/
@property(nonatomic, strong, nullable, setter = setAppInviteOneLink:) NSString * appInviteOneLinkID;
/**
Opt-out logging for specific user
*/
@property(atomic) BOOL anonymizeUser;
/**
Opt-out for Apple Search Ads attributions
*/
@property(atomic) BOOL disableCollectASA;
@property(nonatomic) BOOL disableAppleAdsAttribution;
/**
AppsFlyer delegate. See `AppsFlyerLibDelegate`
*/
@property(weak, nonatomic) id<AppsFlyerLibDelegate> delegate;
@property(weak, nonatomic) id<AppsFlyerDeepLinkDelegate> deepLinkDelegate;
/**
In app purchase receipt validation Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useReceiptValidationSandbox;
/**
Set this flag to test uninstall on Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useUninstallSandbox;
/**
For advertisers who wrap OneLink within another Universal Link.
An advertiser will be able to deeplink from a OneLink wrapped within another Universal Link and also log this retargeting conversion.
Objective-C:
<pre>
[[AppsFlyerLib shared] setResolveDeepLinkURLs:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *resolveDeepLinkURLs;
/**
For advertisers who use vanity OneLinks.
Objective-C:
<pre>
[[AppsFlyerLib shared] oneLinkCustomDomains:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *oneLinkCustomDomains;
/*
* Set phone number for each `start` event. `phoneNumber` will be sent as SHA256 string
*/
@property(nonatomic, nullable) NSString *phoneNumber;
- (NSString *)phoneNumber UNAVAILABLE_ATTRIBUTE;
/**
To disable app's vendor identifier(IDFV), set disableIDFVCollection to true
*/
@property(nonatomic) BOOL disableIDFVCollection;
/**
Enable the collection of Facebook Deferred AppLinks
Requires Facebook SDK and Facebook app on target/client device.
This API must be invoked prior to initializing the AppsFlyer SDK in order to function properly.
Objective-C:
<pre>
[[AppsFlyerLib shared] enableFacebookDeferredApplinksWithClass:[FBSDKAppLinkUtility class]]
</pre>
Swift:
<pre>
AppsFlyerLib.shared().enableFacebookDeferredApplinks(with: FBSDKAppLinkUtility.self)
</pre>
@param facebookAppLinkUtilityClass requeries method call `[FBSDKAppLinkUtility class]` as param.
*/
- (void)enableFacebookDeferredApplinksWithClass:(Class _Nullable)facebookAppLinkUtilityClass;
/**
Use this to send the user's emails
@param userEmails The list of strings that hold mails
@param type Hash algoritm
*/
- (void)setUserEmails:(NSArray<NSString *> * _Nullable)userEmails withCryptType:(EmailCryptType)type;
/**
Start SDK session
Add the following method at the `applicationDidBecomeActive` in AppDelegate class
*/
- (void)start;
- (void)startWithCompletionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler;
/**
Use this method to log an events with multiple values. See AppsFlyer's documentation for details.
Objective-C:
<pre>
[[AppsFlyerLib shared] logEvent:AFEventPurchase
withValues: @{AFEventParamRevenue : @200,
AFEventParamCurrency : @"USD",
AFEventParamQuantity : @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"}];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().logEvent(AFEventPurchase,
withValues: [AFEventParamRevenue : "1200",
AFEventParamContent : "shoes",
AFEventParamContentId: "123"])
</pre>
@param eventName Contains name of event that could be provided from predefined constants in `AppsFlyerLib.h`
@param values Contains dictionary of values for handling by backend
*/
- (void)logEvent:(NSString *)eventName withValues:(NSDictionary * _Nullable)values;
- (void)logEventWithEventName:(NSString *)eventName
eventValues:(NSDictionary<NSString * , id> * _Nullable)eventValues
completionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler
NS_SWIFT_NAME(logEvent(name:values:completionHandler:));
/**
To log and validate in app purchases you can call this method from the completeTransaction: method on
your `SKPaymentTransactionObserver`.
@param productIdentifier The product identifier
@param price The product price
@param currency The product currency
@param transactionId The purchase transaction Id
@param params The additional param, which you want to receive it in the raw reports
@param successBlock The success callback
@param failedBlock The failure callback
*/
- (void)validateAndLogInAppPurchase:(NSString * _Nullable)productIdentifier
price:(NSString * _Nullable)price
currency:(NSString * _Nullable)currency
transactionId:(NSString * _Nullable)transactionId
additionalParameters:(NSDictionary * _Nullable)params
success:(void (^ _Nullable)(NSDictionary * response))successBlock
failure:(void (^ _Nullable)(NSError * _Nullable error, id _Nullable reponse))failedBlock NS_AVAILABLE(10_7, 7_0);
/**
To log location for geo-fencing. Does the same as code below.
<pre>
AppsFlyerLib.shared().logEvent(AFEventLocation, withValues: [AFEventParamLong:longitude, AFEventParamLat:latitude])
</pre>
@param longitude The location longitude
@param latitude The location latitude
*/
- (void)logLocation:(double)longitude latitude:(double)latitude NS_SWIFT_NAME(logLocation(longitude:latitude:));
/**
This method returns AppsFlyer's internal id(unique for your app)
@return Internal AppsFlyer Id
*/
- (NSString *)getAppsFlyerUID;
/**
In case you want to log deep linking. Does the same as `-handleOpenURL:sourceApplication:withAnnotation`.
@warning Preferred to use `-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url sourceApplication:(NSString * _Nullable)sourceApplication API_UNAVAILABLE(macos);
/**
In case you want to log deep linking.
Call this method from inside your AppDelegate `-application:openURL:sourceApplication:annotation:`
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
@param annotation The annotation that passed to your app delegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url
sourceApplication:(NSString * _Nullable)sourceApplication
withAnnotation:(id _Nullable)annotation API_UNAVAILABLE(macos);
/**
Call this method from inside of your AppDelegate `-application:openURL:options:` method.
This method is functionally the same as calling the AppsFlyer method
`-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your app delegate
@param options The options dictionary that was passed to your AppDelegate.
*/
- (void)handleOpenUrl:(NSURL * _Nullable)url options:(NSDictionary * _Nullable)options API_UNAVAILABLE(macos);
/**
Allow AppsFlyer to handle restoration from an NSUserActivity.
Use this method to log deep links with OneLink.
@param userActivity The NSUserActivity that caused the app to be opened.
*/
- (BOOL)continueUserActivity:(NSUserActivity * _Nullable)userActivity
restorationHandler:(void (^ _Nullable)(NSArray * _Nullable))restorationHandler NS_AVAILABLE_IOS(9_0) API_UNAVAILABLE(macos);
/**
Enable AppsFlyer to handle a push notification.
@see [Learn more here](https://support.appsflyer.com/hc/en-us/articles/207364076-Measuring-Push-Notification-Re-Engagement-Campaigns)
@warning To make it work - set data, related to AppsFlyer under key @"af".
@param pushPayload The `userInfo` from received remote notification. One of root keys should be @"af".
*/
- (void)handlePushNotification:(NSDictionary * _Nullable)pushPayload;
/**
Register uninstall - you should register for remote notification and provide AppsFlyer the push device token.
@param deviceToken The `deviceToken` from `-application:didRegisterForRemoteNotificationsWithDeviceToken:`
*/
- (void)registerUninstall:(NSData * _Nullable)deviceToken;
/**
Get SDK version.
@return The AppsFlyer SDK version info.
*/
- (NSString *)getSDKVersion;
/**
This is for internal use.
*/
- (void)remoteDebuggingCallWithData:(NSString *)data;
/**
Used to force the trigger `onAppOpenAttribution` delegate.
Notice, re-engagement, session and launch won't be counted.
Only for OneLink/UniversalLink/Deeplink resolving.
@param URL The param to resolve into -[AppsFlyerLibDelegate onAppOpenAttribution:]
*/
- (void)performOnAppAttributionWithURL:(NSURL * _Nullable)URL;
/**
@brief This property accepts a string value representing the host name for all endpoints.
Can be used to Zero rate your application’s data usage. Contact your CSM for more information.
@warning To use `default` SDK endpoint – set value to `nil`.
Objective-C:
<pre>
[[AppsFlyerLib shared] setHost:@"example.com"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().host = "example.com"
</pre>
*/
@property(nonatomic, strong, readonly) NSString *host;
/**
* This function set the host name and prefix host name for all the endpoints
**/
- (void)setHost:(NSString *)host withHostPrefix:(NSString *)hostPrefix;
/**
* This property accepts a string value representing the prefix host name for all endpoints.
* for example "test" prefix with default host name will have the address "host.appsflyer.com"
*/
@property(nonatomic, strong, readonly) NSString *hostPrefix;
/**
This property is responsible for timeout between sessions in seconds.
Default value is 5 seconds.
*/
@property(atomic) NSUInteger minTimeBetweenSessions;
/**
API to shut down all SDK activities.
@warning This will disable all requests from AppsFlyer SDK.
*/
@property(atomic) BOOL isStopped;
/**
API to set manually Facebook deferred app link
*/
@property(nonatomic, nullable) NSURL *facebookDeferredAppLink;
/**
Block an events from being shared with ad networks and other 3rd party integrations
Must only include letters/digits or underscore, maximum length: 45
*/
@property(nonatomic, nullable) NSArray<NSString *> *sharingFilter;
@property(nonatomic) NSUInteger deepLinkTimeout;
/**
Block an events from being shared with any partner
This method overwrite -[AppsFlyerLib setSharingFilter:]
*/
-(void)setSharingFilterForAllPartners;
/**
Validate if URL contains certain string and append quiery
parameters to deeplink URL. In case if URL does not contain user-defined string,
parameters are not appended to the url.
@param containsString string to check in URL.
@param parameters NSDictionary, which containins parameters to append to the deeplink url after it passed validation.
*/
- (void)appendParametersToDeepLinkingURLWithString:(NSString *)containsString
parameters:(NSDictionary<NSString *, NSString*> *)parameters
NS_SWIFT_NAME(appendParametersToDeeplinkURL(contains:parameters:));
/**
Adds array of keys, which are used to compose key path
to resolve deeplink from push notification payload `userInfo`.
@param deepLinkPath an array of strings which contains keys to search for deeplink in payload.
*/
- (void)addPushNotificationDeepLinkPath:(NSArray<NSString *> *)deepLinkPath;
/**
* Allows sending custom data for partner integration purposes.
*
* @param partnerId ID of the partner (usually has "_int" suffix)
* @param partnerInfo customer data, depends on the integration nature with specific partner
*/
- (void)setPartnerDataWithPartnerId:(NSString * _Nullable)partnerId partnerInfo:(NSDictionary<NSString *, id> * _Nullable)partnerInfo
NS_SWIFT_NAME(setPartnerData(partnerId:partnerInfo:));
@end
NS_ASSUME_NONNULL_END
//
// LinkGenerator.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
Payload container for the `generateInviteUrlWithLinkGenerator:completionHandler:` from `AppsFlyerShareInviteHelper`
*/
@interface AppsFlyerLinkGenerator : NSObject
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
- (instancetype)init NS_UNAVAILABLE;
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
+ (instancetype)new NS_UNAVAILABLE;
@property(nonatomic, nullable) NSString *brandDomain;
/// The channel through which the invite was sent (e.g. Facebook/Gmail/etc.). Usage: Recommended
- (void)setChannel :(nonnull NSString *)channel;
/// ReferrerCustomerId setter
- (void)setReferrerCustomerId:(nonnull NSString *)referrerCustomerId;
/// A campaign name. Usage: Optional
- (void)setCampaign :(nonnull NSString *)campaign;
/// ReferrerUID setter
- (void)setReferrerUID :(nonnull NSString *)referrerUID;
/// Referrer name
- (void)setReferrerName :(nonnull NSString *)referrerName;
/// The URL to referrer user avatar. Usage: Optional
- (void)setReferrerImageURL :(nonnull NSString *)referrerImageURL;
/// AppleAppID
- (void)setAppleAppID :(nonnull NSString *)appleAppID;
/// Deeplink path
- (void)setDeeplinkPath :(nonnull NSString *)deeplinkPath;
/// Base deeplink path
- (void)setBaseDeeplink :(nonnull NSString *)baseDeeplink;
/// A single key value custom parameter. Usage: Optional
- (void)addParameterValue :(nonnull NSString *)value forKey:(NSString *)key;
/// Multiple key value custom parameters. Usage: Optional
- (void)addParameters :(nonnull NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
//
// ShareInviteHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
#import "AppsFlyerLinkGenerator.h"
/**
AppsFlyerShareInviteHelper
*/
@interface AppsFlyerShareInviteHelper : NSObject
NS_ASSUME_NONNULL_BEGIN
/**
* The AppsFlyerShareInviteHelper class builds the invite URL according to various setter methods
* which allow passing on additional information on the click.
* This information is available through `onConversionDataReceived:` when the user accepts the invite and installs the app.
* In addition, campaign and channel parameters are visible within the AppsFlyer Dashboard.
*/
+ (void)generateInviteUrlWithLinkGenerator:(AppsFlyerLinkGenerator *(^)(AppsFlyerLinkGenerator *generator))generatorCreator completionHandler:(void (^)(NSURL *_Nullable url))completionHandler;
/**
* It is recommended to generate an in-app event after the invite is sent to log the invites from the senders' perspective.
* This enables you to find the users that tend most to invite friends, and the media sources that get you these users.
*/
+ (void)logInvite:(nullable NSString *)channel parameters:(nullable NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
framework module AppsFlyerLib {
umbrella header "AppsFlyerLib.h"
export *
module * { export * }
}
//
// CrossPromotionHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
AppsFlyer allows you to log and attribute installs originating
from cross promotion campaigns of your existing apps.
Afterwards, you can optimize on your cross-promotion traffic to get even better results.
*/
@interface AppsFlyerCrossPromotionHelper : NSObject
/**
To log an impression use the following API call.
Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard.
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
*/
+ (void)logCrossPromoteImpression:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters;
/**
iOS allows you to utilize the StoreKit component to open
the App Store while remaining in the context of your app.
More details at https://support.appsflyer.com/hc/en-us/articles/115004481946-Cross-Promotion-Tracking#tracking-cross-promotion-impressions
@param appID Promoted App ID
@param campaign A campaign name
@param parameters Additional params like `@{@"af_sub1": @"val", @"custom_param": @"val2" }`
@param openStoreBlock Contains promoted `clickURL`
*/
+ (void)logAndOpenStore:(nonnull NSString *)appID
campaign:(nullable NSString *)campaign
parameters:(nullable NSDictionary *)parameters
openStore:(void (^)(NSURLSession *urlSession, NSURL *clickURL))openStoreBlock;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplink.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
NS_SWIFT_NAME(DeepLink)
@interface AppsFlyerDeepLink : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property (readonly, nonnull) NSDictionary<NSString *, id> *clickEvent;
@property (readonly, nullable) NSString *deeplinkValue;
@property (readonly, nullable) NSString *matchType;
@property (readonly, nullable) NSString *clickHTTPReferrer;
@property (readonly, nullable) NSString *mediaSource;
@property (readonly, nullable) NSString *campaign;
@property (readonly, nullable) NSString *campaignId;
@property (readonly, nullable) NSString *afSub1;
@property (readonly, nullable) NSString *afSub2;
@property (readonly, nullable) NSString *afSub3;
@property (readonly, nullable) NSString *afSub4;
@property (readonly, nullable) NSString *afSub5;
@property (readonly) BOOL isDeferred;
- (NSString *)toString;
@end
NS_ASSUME_NONNULL_END
//
// AFSDKDeeplinkResult.h
// AppsFlyerLib
//
// Created by Andrii Hahan on 20.08.2020.
//
#import <Foundation/Foundation.h>
@class AppsFlyerDeepLink;
typedef NS_CLOSED_ENUM(NSUInteger, AFSDKDeepLinkResultStatus) {
AFSDKDeepLinkResultStatusNotFound,
AFSDKDeepLinkResultStatusFound,
AFSDKDeepLinkResultStatusFailure,
} NS_SWIFT_NAME(DeepLinkResultStatus);
NS_SWIFT_NAME(DeepLinkResult)
@interface AppsFlyerDeepLinkResult : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@property(readonly) AFSDKDeepLinkResultStatus status;
@property(readonly, nullable) AppsFlyerDeepLink *deepLink;
@property(readonly, nullable) NSError *error;
@end
//
// AppsFlyerLib.h
// AppsFlyerLib
//
// AppsFlyer iOS SDK 6.3.0 (11)
// Copyright (c) 2012-2020 AppsFlyer Ltd. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "AppsFlyerCrossPromotionHelper.h"
#import "AppsFlyerShareInviteHelper.h"
#import "AppsFlyerDeepLinkResult.h"
#import "AppsFlyerDeepLink.h"
NS_ASSUME_NONNULL_BEGIN
// In app event names constants
#define AFEventLevelAchieved @"af_level_achieved"
#define AFEventAddPaymentInfo @"af_add_payment_info"
#define AFEventAddToCart @"af_add_to_cart"
#define AFEventAddToWishlist @"af_add_to_wishlist"
#define AFEventCompleteRegistration @"af_complete_registration"
#define AFEventTutorial_completion @"af_tutorial_completion"
#define AFEventInitiatedCheckout @"af_initiated_checkout"
#define AFEventPurchase @"af_purchase"
#define AFEventRate @"af_rate"
#define AFEventSearch @"af_search"
#define AFEventSpentCredits @"af_spent_credits"
#define AFEventAchievementUnlocked @"af_achievement_unlocked"
#define AFEventContentView @"af_content_view"
#define AFEventListView @"af_list_view"
#define AFEventTravelBooking @"af_travel_booking"
#define AFEventShare @"af_share"
#define AFEventInvite @"af_invite"
#define AFEventLogin @"af_login"
#define AFEventReEngage @"af_re_engage"
#define AFEventUpdate @"af_update"
#define AFEventOpenedFromPushNotification @"af_opened_from_push_notification"
#define AFEventLocation @"af_location_coordinates"
#define AFEventCustomerSegment @"af_customer_segment"
#define AFEventSubscribe @"af_subscribe"
#define AFEventStartTrial @"af_start_trial"
#define AFEventAdClick @"af_ad_click"
#define AFEventAdView @"af_ad_view"
// In app event parameter names
#define AFEventParamContent @"af_content"
#define AFEventParamAchievementId @"af_achievement_id"
#define AFEventParamLevel @"af_level"
#define AFEventParamScore @"af_score"
#define AFEventParamSuccess @"af_success"
#define AFEventParamPrice @"af_price"
#define AFEventParamContentType @"af_content_type"
#define AFEventParamContentId @"af_content_id"
#define AFEventParamContentList @"af_content_list"
#define AFEventParamCurrency @"af_currency"
#define AFEventParamQuantity @"af_quantity"
#define AFEventParamRegistrationMethod @"af_registration_method"
#define AFEventParamPaymentInfoAvailable @"af_payment_info_available"
#define AFEventParamMaxRatingValue @"af_max_rating_value"
#define AFEventParamRatingValue @"af_rating_value"
#define AFEventParamSearchString @"af_search_string"
#define AFEventParamDateA @"af_date_a"
#define AFEventParamDateB @"af_date_b"
#define AFEventParamDestinationA @"af_destination_a"
#define AFEventParamDestinationB @"af_destination_b"
#define AFEventParamDescription @"af_description"
#define AFEventParamClass @"af_class"
#define AFEventParamEventStart @"af_event_start"
#define AFEventParamEventEnd @"af_event_end"
#define AFEventParamLat @"af_lat"
#define AFEventParamLong @"af_long"
#define AFEventParamCustomerUserId @"af_customer_user_id"
#define AFEventParamValidated @"af_validated"
#define AFEventParamRevenue @"af_revenue"
#define AFEventProjectedParamRevenue @"af_projected_revenue"
#define AFEventParamReceiptId @"af_receipt_id"
#define AFEventParamTutorialId @"af_tutorial_id"
#define AFEventParamVirtualCurrencyName @"af_virtual_currency_name"
#define AFEventParamDeepLink @"af_deep_link"
#define AFEventParamOldVersion @"af_old_version"
#define AFEventParamNewVersion @"af_new_version"
#define AFEventParamReviewText @"af_review_text"
#define AFEventParamCouponCode @"af_coupon_code"
#define AFEventParamOrderId @"af_order_id"
#define AFEventParam1 @"af_param_1"
#define AFEventParam2 @"af_param_2"
#define AFEventParam3 @"af_param_3"
#define AFEventParam4 @"af_param_4"
#define AFEventParam5 @"af_param_5"
#define AFEventParam6 @"af_param_6"
#define AFEventParam7 @"af_param_7"
#define AFEventParam8 @"af_param_8"
#define AFEventParam9 @"af_param_9"
#define AFEventParam10 @"af_param_10"
#define AFEventParamDepartingDepartureDate @"af_departing_departure_date"
#define AFEventParamReturningDepartureDate @"af_returning_departure_date"
#define AFEventParamDestinationList @"af_destination_list" //array of string
#define AFEventParamCity @"af_city"
#define AFEventParamRegion @"af_region"
#define AFEventParamCountry @"af_country"
#define AFEventParamDepartingArrivalDate @"af_departing_arrival_date"
#define AFEventParamReturningArrivalDate @"af_returning_arrival_date"
#define AFEventParamSuggestedDestinations @"af_suggested_destinations" //array of string
#define AFEventParamTravelStart @"af_travel_start"
#define AFEventParamTravelEnd @"af_travel_end"
#define AFEventParamNumAdults @"af_num_adults"
#define AFEventParamNumChildren @"af_num_children"
#define AFEventParamNumInfants @"af_num_infants"
#define AFEventParamSuggestedHotels @"af_suggested_hotels" //array of string
#define AFEventParamUserScore @"af_user_score"
#define AFEventParamHotelScore @"af_hotel_score"
#define AFEventParamPurchaseCurrency @"af_purchase_currency"
#define AFEventParamPreferredStarRatings @"af_preferred_star_ratings" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredPriceRange @"af_preferred_price_range" //array of int (basically a tuple (min,max) but we'll use array of int and instruct the developer to use two values)
#define AFEventParamPreferredNeighborhoods @"af_preferred_neighborhoods" //array of string
#define AFEventParamPreferredNumStops @"af_preferred_num_stops"
#define AFEventParamAdRevenueAdType @"af_adrev_ad_type"
#define AFEventParamAdRevenueNetworkName @"af_adrev_network_name"
#define AFEventParamAdRevenuePlacementId @"af_adrev_placement_id"
#define AFEventParamAdRevenueAdSize @"af_adrev_ad_size"
#define AFEventParamAdRevenueMediatedNetworkName @"af_adrev_mediated_network_name"
/// Mail hashing type
typedef enum {
/// None
EmailCryptTypeNone = 0,
/// SHA1
EmailCryptTypeSHA1 = 1,
/// MD5
EmailCryptTypeMD5 = 2,
/// SHA256
EmailCryptTypeSHA256 = 3
} EmailCryptType;
NS_SWIFT_NAME(DeepLinkDelegate)
@protocol AppsFlyerDeepLinkDelegate <NSObject>
@optional
- (void)didResolveDeepLink:(AppsFlyerDeepLinkResult *_Nonnull)result;
@end
/**
Conform and subscribe to this protocol to allow getting data about conversion and
install attribution
*/
@protocol AppsFlyerLibDelegate <NSObject>
/**
`conversionInfo` contains information about install.
Organic/non-organic, etc.
@param conversionInfo May contain <code>null</code> values for some keys. Please handle this case.
*/
- (void)onConversionDataSuccess:(NSDictionary *)conversionInfo;
/**
Any errors that occurred during the conversion request.
*/
- (void)onConversionDataFail:(NSError *)error;
@optional
/**
`attributionData` contains information about OneLink, deeplink.
*/
- (void)onAppOpenAttribution:(NSDictionary *)attributionData;
/**
Any errors that occurred during the attribution request.
*/
- (void)onAppOpenAttributionFailure:(NSError *)error;
/**
@abstract Sets the HTTP header fields of the ESP resolving to the given
dictionary.
@discussion This method replaces all header fields that may have
existed before this method ESP resolving call.
To keep default SDK behavior - return nil;
*/
- (NSDictionary <NSString *, NSString *> * _Nullable)allHTTPHeaderFieldsForResolveDeepLinkURL:(NSURL *)URL;
@end
/**
You can log installs, app updates, sessions and additional in-app events
(including in-app purchases, game levels, etc.)
to evaluate ROI and user engagement.
The iOS SDK is compatible with all iOS/tvOS devices with iOS version 7 and above.
@see [SDK Integration Validator](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS)
for more information.
*/
@interface AppsFlyerLib : NSObject
/**
Gets the singleton instance of the AppsFlyerLib class, creating it if
necessary.
@return The singleton instance of AppsFlyerLib.
*/
+ (AppsFlyerLib *)shared;
/**
In case you use your own user ID in your app, you can set this property to that ID.
Enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs
*/
@property(nonatomic, strong, nullable) NSString * customerUserID;
/**
In case you use custom data and you want to receive it in the raw reports.
@see [Setting additional custom data](https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS#setting-additional-custom-data) for more information.
*/
@property(nonatomic, strong, nullable, setter = setAdditionalData:) NSDictionary * customData;
/**
Use this property to set your AppsFlyer's dev key
*/
@property(nonatomic, strong) NSString * appsFlyerDevKey;
/**
Use this property to set your app's Apple ID(taken from the app's page on iTunes Connect)
*/
@property(nonatomic, strong) NSString * appleAppID;
#ifndef AFSDK_NO_IDFA
/**
AppsFlyer SDK collect Apple's `advertisingIdentifier` if the `AdSupport.framework` included in the SDK.
You can disable this behavior by setting the following property to YES
*/
@property(nonatomic) BOOL disableAdvertisingIdentifier;
@property(nonatomic, strong, readonly) NSString *advertisingIdentifier;
/**
Waits for request user authorization to access app-related data
*/
- (void)waitForATTUserAuthorizationWithTimeoutInterval:(NSTimeInterval)timeoutInterval
NS_SWIFT_NAME(waitForATTUserAuthorization(timeoutInterval:));
#endif
@property(nonatomic) BOOL disableSKAdNetwork;
/**
In case of in app purchase events, you can set the currency code your user has purchased with.
The currency code is a 3 letter code according to ISO standards
Objective-C:
<pre>
[[AppsFlyerLib shared] setCurrencyCode:@"USD"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().currencyCode = "USD"
</pre>
*/
@property(nonatomic, strong, nullable) NSString *currencyCode;
/**
Prints SDK messages to the console log. This property should only be used in `DEBUG` mode.
The default value is `NO`
*/
@property(nonatomic) BOOL isDebug;
/**
Set this flag to `YES`, to collect the current device name(e.g. "My iPhone"). Default value is `NO`
*/
@property(nonatomic) BOOL shouldCollectDeviceName;
/**
Set your `OneLink ID` from OneLink configuration. Used in User Invites to generate a OneLink.
*/
@property(nonatomic, strong, nullable, setter = setAppInviteOneLink:) NSString * appInviteOneLinkID;
/**
Opt-out logging for specific user
*/
@property(atomic) BOOL anonymizeUser;
/**
Opt-out for Apple Search Ads attributions
*/
@property(atomic) BOOL disableCollectASA;
@property(nonatomic) BOOL disableAppleAdsAttribution;
/**
AppsFlyer delegate. See `AppsFlyerLibDelegate`
*/
@property(weak, nonatomic) id<AppsFlyerLibDelegate> delegate;
@property(weak, nonatomic) id<AppsFlyerDeepLinkDelegate> deepLinkDelegate;
/**
In app purchase receipt validation Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useReceiptValidationSandbox;
/**
Set this flag to test uninstall on Apple environment(production or sandbox). The default value is NO
*/
@property(nonatomic) BOOL useUninstallSandbox;
/**
For advertisers who wrap OneLink within another Universal Link.
An advertiser will be able to deeplink from a OneLink wrapped within another Universal Link and also log this retargeting conversion.
Objective-C:
<pre>
[[AppsFlyerLib shared] setResolveDeepLinkURLs:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *resolveDeepLinkURLs;
/**
For advertisers who use vanity OneLinks.
Objective-C:
<pre>
[[AppsFlyerLib shared] oneLinkCustomDomains:@[@"domain.com", @"subdomain.domain.com"]];
</pre>
*/
@property(nonatomic, nullable) NSArray<NSString *> *oneLinkCustomDomains;
/*
* Set phone number for each `start` event. `phoneNumber` will be sent as SHA256 string
*/
@property(nonatomic, nullable) NSString *phoneNumber;
- (NSString *)phoneNumber UNAVAILABLE_ATTRIBUTE;
/**
To disable app's vendor identifier(IDFV), set disableIDFVCollection to true
*/
@property(nonatomic) BOOL disableIDFVCollection;
/**
Enable the collection of Facebook Deferred AppLinks
Requires Facebook SDK and Facebook app on target/client device.
This API must be invoked prior to initializing the AppsFlyer SDK in order to function properly.
Objective-C:
<pre>
[[AppsFlyerLib shared] enableFacebookDeferredApplinksWithClass:[FBSDKAppLinkUtility class]]
</pre>
Swift:
<pre>
AppsFlyerLib.shared().enableFacebookDeferredApplinks(with: FBSDKAppLinkUtility.self)
</pre>
@param facebookAppLinkUtilityClass requeries method call `[FBSDKAppLinkUtility class]` as param.
*/
- (void)enableFacebookDeferredApplinksWithClass:(Class _Nullable)facebookAppLinkUtilityClass;
/**
Use this to send the user's emails
@param userEmails The list of strings that hold mails
@param type Hash algoritm
*/
- (void)setUserEmails:(NSArray<NSString *> * _Nullable)userEmails withCryptType:(EmailCryptType)type;
/**
Start SDK session
Add the following method at the `applicationDidBecomeActive` in AppDelegate class
*/
- (void)start;
- (void)startWithCompletionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler;
/**
Use this method to log an events with multiple values. See AppsFlyer's documentation for details.
Objective-C:
<pre>
[[AppsFlyerLib shared] logEvent:AFEventPurchase
withValues: @{AFEventParamRevenue : @200,
AFEventParamCurrency : @"USD",
AFEventParamQuantity : @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"}];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().logEvent(AFEventPurchase,
withValues: [AFEventParamRevenue : "1200",
AFEventParamContent : "shoes",
AFEventParamContentId: "123"])
</pre>
@param eventName Contains name of event that could be provided from predefined constants in `AppsFlyerLib.h`
@param values Contains dictionary of values for handling by backend
*/
- (void)logEvent:(NSString *)eventName withValues:(NSDictionary * _Nullable)values;
- (void)logEventWithEventName:(NSString *)eventName
eventValues:(NSDictionary<NSString * , id> * _Nullable)eventValues
completionHandler:(void (^ _Nullable)(NSDictionary<NSString *, id> * _Nullable dictionary, NSError * _Nullable error))completionHandler
NS_SWIFT_NAME(logEvent(name:values:completionHandler:));
/**
To log and validate in app purchases you can call this method from the completeTransaction: method on
your `SKPaymentTransactionObserver`.
@param productIdentifier The product identifier
@param price The product price
@param currency The product currency
@param transactionId The purchase transaction Id
@param params The additional param, which you want to receive it in the raw reports
@param successBlock The success callback
@param failedBlock The failure callback
*/
- (void)validateAndLogInAppPurchase:(NSString * _Nullable)productIdentifier
price:(NSString * _Nullable)price
currency:(NSString * _Nullable)currency
transactionId:(NSString * _Nullable)transactionId
additionalParameters:(NSDictionary * _Nullable)params
success:(void (^ _Nullable)(NSDictionary * response))successBlock
failure:(void (^ _Nullable)(NSError * _Nullable error, id _Nullable reponse))failedBlock NS_AVAILABLE(10_7, 7_0);
/**
To log location for geo-fencing. Does the same as code below.
<pre>
AppsFlyerLib.shared().logEvent(AFEventLocation, withValues: [AFEventParamLong:longitude, AFEventParamLat:latitude])
</pre>
@param longitude The location longitude
@param latitude The location latitude
*/
- (void)logLocation:(double)longitude latitude:(double)latitude NS_SWIFT_NAME(logLocation(longitude:latitude:));
/**
This method returns AppsFlyer's internal id(unique for your app)
@return Internal AppsFlyer Id
*/
- (NSString *)getAppsFlyerUID;
/**
In case you want to log deep linking. Does the same as `-handleOpenURL:sourceApplication:withAnnotation`.
@warning Preferred to use `-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url sourceApplication:(NSString * _Nullable)sourceApplication API_UNAVAILABLE(macos);
/**
In case you want to log deep linking.
Call this method from inside your AppDelegate `-application:openURL:sourceApplication:annotation:`
@param url The URL that was passed to your AppDelegate.
@param sourceApplication The sourceApplication that passed to your AppDelegate.
@param annotation The annotation that passed to your app delegate.
*/
- (void)handleOpenURL:(NSURL * _Nullable)url
sourceApplication:(NSString * _Nullable)sourceApplication
withAnnotation:(id _Nullable)annotation API_UNAVAILABLE(macos);
/**
Call this method from inside of your AppDelegate `-application:openURL:options:` method.
This method is functionally the same as calling the AppsFlyer method
`-handleOpenURL:sourceApplication:withAnnotation`.
@param url The URL that was passed to your app delegate
@param options The options dictionary that was passed to your AppDelegate.
*/
- (void)handleOpenUrl:(NSURL * _Nullable)url options:(NSDictionary * _Nullable)options API_UNAVAILABLE(macos);
/**
Allow AppsFlyer to handle restoration from an NSUserActivity.
Use this method to log deep links with OneLink.
@param userActivity The NSUserActivity that caused the app to be opened.
*/
- (BOOL)continueUserActivity:(NSUserActivity * _Nullable)userActivity
restorationHandler:(void (^ _Nullable)(NSArray * _Nullable))restorationHandler NS_AVAILABLE_IOS(9_0) API_UNAVAILABLE(macos);
/**
Enable AppsFlyer to handle a push notification.
@see [Learn more here](https://support.appsflyer.com/hc/en-us/articles/207364076-Measuring-Push-Notification-Re-Engagement-Campaigns)
@warning To make it work - set data, related to AppsFlyer under key @"af".
@param pushPayload The `userInfo` from received remote notification. One of root keys should be @"af".
*/
- (void)handlePushNotification:(NSDictionary * _Nullable)pushPayload;
/**
Register uninstall - you should register for remote notification and provide AppsFlyer the push device token.
@param deviceToken The `deviceToken` from `-application:didRegisterForRemoteNotificationsWithDeviceToken:`
*/
- (void)registerUninstall:(NSData * _Nullable)deviceToken;
/**
Get SDK version.
@return The AppsFlyer SDK version info.
*/
- (NSString *)getSDKVersion;
/**
This is for internal use.
*/
- (void)remoteDebuggingCallWithData:(NSString *)data;
/**
Used to force the trigger `onAppOpenAttribution` delegate.
Notice, re-engagement, session and launch won't be counted.
Only for OneLink/UniversalLink/Deeplink resolving.
@param URL The param to resolve into -[AppsFlyerLibDelegate onAppOpenAttribution:]
*/
- (void)performOnAppAttributionWithURL:(NSURL * _Nullable)URL;
/**
@brief This property accepts a string value representing the host name for all endpoints.
Can be used to Zero rate your application’s data usage. Contact your CSM for more information.
@warning To use `default` SDK endpoint – set value to `nil`.
Objective-C:
<pre>
[[AppsFlyerLib shared] setHost:@"example.com"];
</pre>
Swift:
<pre>
AppsFlyerLib.shared().host = "example.com"
</pre>
*/
@property(nonatomic, strong, readonly) NSString *host;
/**
* This function set the host name and prefix host name for all the endpoints
**/
- (void)setHost:(NSString *)host withHostPrefix:(NSString *)hostPrefix;
/**
* This property accepts a string value representing the prefix host name for all endpoints.
* for example "test" prefix with default host name will have the address "host.appsflyer.com"
*/
@property(nonatomic, strong, readonly) NSString *hostPrefix;
/**
This property is responsible for timeout between sessions in seconds.
Default value is 5 seconds.
*/
@property(atomic) NSUInteger minTimeBetweenSessions;
/**
API to shut down all SDK activities.
@warning This will disable all requests from AppsFlyer SDK.
*/
@property(atomic) BOOL isStopped;
/**
API to set manually Facebook deferred app link
*/
@property(nonatomic, nullable) NSURL *facebookDeferredAppLink;
/**
Block an events from being shared with ad networks and other 3rd party integrations
Must only include letters/digits or underscore, maximum length: 45
*/
@property(nonatomic, nullable) NSArray<NSString *> *sharingFilter;
@property(nonatomic) NSUInteger deepLinkTimeout;
/**
Block an events from being shared with any partner
This method overwrite -[AppsFlyerLib setSharingFilter:]
*/
-(void)setSharingFilterForAllPartners;
/**
Validate if URL contains certain string and append quiery
parameters to deeplink URL. In case if URL does not contain user-defined string,
parameters are not appended to the url.
@param containsString string to check in URL.
@param parameters NSDictionary, which containins parameters to append to the deeplink url after it passed validation.
*/
- (void)appendParametersToDeepLinkingURLWithString:(NSString *)containsString
parameters:(NSDictionary<NSString *, NSString*> *)parameters
NS_SWIFT_NAME(appendParametersToDeeplinkURL(contains:parameters:));
/**
Adds array of keys, which are used to compose key path
to resolve deeplink from push notification payload `userInfo`.
@param deepLinkPath an array of strings which contains keys to search for deeplink in payload.
*/
- (void)addPushNotificationDeepLinkPath:(NSArray<NSString *> *)deepLinkPath;
/**
* Allows sending custom data for partner integration purposes.
*
* @param partnerId ID of the partner (usually has "_int" suffix)
* @param partnerInfo customer data, depends on the integration nature with specific partner
*/
- (void)setPartnerDataWithPartnerId:(NSString * _Nullable)partnerId partnerInfo:(NSDictionary<NSString *, id> * _Nullable)partnerInfo
NS_SWIFT_NAME(setPartnerData(partnerId:partnerInfo:));
@end
NS_ASSUME_NONNULL_END
//
// LinkGenerator.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
Payload container for the `generateInviteUrlWithLinkGenerator:completionHandler:` from `AppsFlyerShareInviteHelper`
*/
@interface AppsFlyerLinkGenerator : NSObject
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
- (instancetype)init NS_UNAVAILABLE;
/// Instance initialization is not allowed. Use generated instance
/// from `-[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:completionHandler]`
+ (instancetype)new NS_UNAVAILABLE;
@property(nonatomic, nullable) NSString *brandDomain;
/// The channel through which the invite was sent (e.g. Facebook/Gmail/etc.). Usage: Recommended
- (void)setChannel :(nonnull NSString *)channel;
/// ReferrerCustomerId setter
- (void)setReferrerCustomerId:(nonnull NSString *)referrerCustomerId;
/// A campaign name. Usage: Optional
- (void)setCampaign :(nonnull NSString *)campaign;
/// ReferrerUID setter
- (void)setReferrerUID :(nonnull NSString *)referrerUID;
/// Referrer name
- (void)setReferrerName :(nonnull NSString *)referrerName;
/// The URL to referrer user avatar. Usage: Optional
- (void)setReferrerImageURL :(nonnull NSString *)referrerImageURL;
/// AppleAppID
- (void)setAppleAppID :(nonnull NSString *)appleAppID;
/// Deeplink path
- (void)setDeeplinkPath :(nonnull NSString *)deeplinkPath;
/// Base deeplink path
- (void)setBaseDeeplink :(nonnull NSString *)baseDeeplink;
/// A single key value custom parameter. Usage: Optional
- (void)addParameterValue :(nonnull NSString *)value forKey:(NSString *)key;
/// Multiple key value custom parameters. Usage: Optional
- (void)addParameters :(nonnull NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
//
// ShareInviteHelper.h
// AppsFlyerLib
//
// Created by Gil Meroz on 27/01/2017.
//
//
#import <Foundation/Foundation.h>
#import "AppsFlyerLinkGenerator.h"
/**
AppsFlyerShareInviteHelper
*/
@interface AppsFlyerShareInviteHelper : NSObject
NS_ASSUME_NONNULL_BEGIN
/**
* The AppsFlyerShareInviteHelper class builds the invite URL according to various setter methods
* which allow passing on additional information on the click.
* This information is available through `onConversionDataReceived:` when the user accepts the invite and installs the app.
* In addition, campaign and channel parameters are visible within the AppsFlyer Dashboard.
*/
+ (void)generateInviteUrlWithLinkGenerator:(AppsFlyerLinkGenerator *(^)(AppsFlyerLinkGenerator *generator))generatorCreator completionHandler:(void (^)(NSURL *_Nullable url))completionHandler;
/**
* It is recommended to generate an in-app event after the invite is sent to log the invites from the senders' perspective.
* This enables you to find the users that tend most to invite friends, and the media sources that get you these users.
*/
+ (void)logInvite:(nullable NSString *)channel parameters:(nullable NSDictionary *)parameters;
@end
NS_ASSUME_NONNULL_END
framework module AppsFlyerLib {
umbrella header "AppsFlyerLib.h"
export *
module * { export * }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Headers/AppsFlyerCrossPromotionHelper.h</key>
<data>
ezewyhf50Apa+1HjqfRFE7nXZIE=
</data>
<key>Headers/AppsFlyerDeepLink.h</key>
<data>
jDznIDDggwXT7EmzE7TYcZjhMjA=
</data>
<key>Headers/AppsFlyerDeepLinkResult.h</key>
<data>
3J9juDAkVB2LUxC7/NDmKqgrzyQ=
</data>
<key>Headers/AppsFlyerLib.h</key>
<data>
mUVf5C/bLPxap0tT64QCqtDy98w=
</data>
<key>Headers/AppsFlyerLinkGenerator.h</key>
<data>
dmn7cx6Z5wxK92gRzGUwPeRiZFg=
</data>
<key>Headers/AppsFlyerShareInviteHelper.h</key>
<data>
d9/NIwpZ+CNQ8zsxhNkHTT7kpRE=
</data>
<key>Info.plist</key>
<data>
5u93R98kqyvnUwhcBXH2yO7BtG0=
</data>
<key>Modules/module.modulemap</key>
<data>
r+QHVTsITCgZyCe0Vpvj+KSPIWc=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/AppsFlyerCrossPromotionHelper.h</key>
<dict>
<key>hash</key>
<data>
ezewyhf50Apa+1HjqfRFE7nXZIE=
</data>
<key>hash2</key>
<data>
YgrwrWx/ZFYjXh2t5ZHY6S0EZTroYfe5Nprl3alq+Ho=
</data>
</dict>
<key>Headers/AppsFlyerDeepLink.h</key>
<dict>
<key>hash</key>
<data>
jDznIDDggwXT7EmzE7TYcZjhMjA=
</data>
<key>hash2</key>
<data>
Z5nW/ynpNNV+krqJXqy1Gb+gdnruPFWutZYYX7hSt3I=
</data>
</dict>
<key>Headers/AppsFlyerDeepLinkResult.h</key>
<dict>
<key>hash</key>
<data>
3J9juDAkVB2LUxC7/NDmKqgrzyQ=
</data>
<key>hash2</key>
<data>
QsQGXKix5206DUBBUdDxfg5ykma/3V9MoHOxbz8NaOs=
</data>
</dict>
<key>Headers/AppsFlyerLib.h</key>
<dict>
<key>hash</key>
<data>
mUVf5C/bLPxap0tT64QCqtDy98w=
</data>
<key>hash2</key>
<data>
TZqybw725YVAAJNEa+mh2Rssna9ALVCEGy69Bwu4J8k=
</data>
</dict>
<key>Headers/AppsFlyerLinkGenerator.h</key>
<dict>
<key>hash</key>
<data>
dmn7cx6Z5wxK92gRzGUwPeRiZFg=
</data>
<key>hash2</key>
<data>
n5nvQT7mm5XE6/p92Fwks9TR1rVR9k1TgTk06A14CMg=
</data>
</dict>
<key>Headers/AppsFlyerShareInviteHelper.h</key>
<dict>
<key>hash</key>
<data>
d9/NIwpZ+CNQ8zsxhNkHTT7kpRE=
</data>
<key>hash2</key>
<data>
dcwbMQEM8N0Ugem7QbAWWGP+hfO/0vlued2Pep6IKtc=
</data>
</dict>
<key>Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
r+QHVTsITCgZyCe0Vpvj+KSPIWc=
</data>
<key>hash2</key>
<data>
ZcaMjc66PAFkteksoe5Rzelk7opMMS8QdKiza/LgQwA=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>
Terms of Use
AppsFlyer Ltd. (“AppsFlyer” or “us”, “our”, “we”) provides a software development kit which allows the tracking of mobile application use, installations and downloads (the “Service(s)”). These Terms of use (this “Agreement”) govern your access and use of the Services, and any code provided by AppsFlyer. “You”/”Company” means any third party that uses the Service.
Please read this Agreement carefully. You must accept this Agreement prior to using the Service or any code provided by AppsFlyer. By downloading or installing the AppsFlyer code or using the Service, you signify your assent to this Agreement. Changes may be made to this Agreement from time to time. We will make reasonable commercial efforts to notify you of any material updates to this Agreement. Notwithstanding the foregoing, your continued use of the Service will be deemed acceptance to amended or updated Terms. As such, you should check frequently to see if we have updated this Agreement. If you do not agree to any terms or conditions of this Agreement, please do not use the Service.
1. Services. Subject to the terms and conditions hereof, during the Term (as defined below) AppsFlyer shall provide Company with the Services on a non-exclusive basis solely for Company’s own internal uses and, for this purpose, Company shall integrate the code provided by AppsFlyer, including AppsFlyer’s SDK, tracking links and APIs (collectively, the “Code”), into Company’s own proprietary mobile application (Company’s “Application”).
2. Registration. In order to use the Services, Company will be required to register with AppsFlyer and open an account. Company must provide all information necessary for the registration process. Company represents and warrants that all such information shall be accurate and complete. Company shall keep such information up-to-date. Company shall immediately notify AppsFlyer if there is any change in such information or security breach of the account.
3. Restrictions.
3.1. Except as set forth expressly herein or as permitted by the Services, Company shall not, and shall not permit any third party, to (a) reverse engineer or attempt to find the underlying code of the Services; (b) modify the Services, or insert any code or product, or in any other way manipulate the Services in any way; (c) modify the Code in any way without AppsFlyer’s prior written consent; (d) sublicense, sell, or distribute the Code or bypass any security measure of AppsFlyer with respect to the Services; (e) distribute the Code on a stand-alone basis; or (f) use the Services except for Company’s own internal purposes.
3.2. To the extent any of the restrictions set forth above are not enforceable under applicable law, Company shall inform AppsFlyer in writing prior to engaging in any of the applicable activities.
4. Warranties.
4.1. Mutual Warranties. Each party represents and warrants that (a) it is duly organized under applicable law and has sufficient authority to enter into this Agreement and that, (b) the execution and performance under this Agreement does not conflict with any contractual obligations such party has to any third party.
4.2. AppsFlyer Warranties. AppsFlyer represents and warrants that the Services (a) do not, to the best of its knowledge, infringe the intellectual property rights of any third party, (b) do not contain any defamatory, libelous, obscene or otherwise offensive material, (c) comply with all applicable law and regulations (provided, that with respect to data provided by Company to AppsFlyer, AppsFlyer’s compliance with applicable law is subject to Company’s full compliance with applicable law with respect to such data, including its transfer to, and processing by, AppsFlyer), (d) do not collect, use or transfer the data of end users except pursuant to the terms of this Agreement or for the provision of the Services, and (e) do not to the best of its knowledge contain any worms, viruses, spyware, adware or other malicious or intrusive software.
4.3. Company Warranties. Company represents and warrants that its Application and Data (a) do not, to the best of its knowledge, infringe the intellectual property rights of any third party, (b) do not contain any defamatory, libelous, obscene or otherwise offensive material, (c) comply with all applicable law and regulations, including applicable data protection law, (d) do not collect, use or transfer the data of end users in any manner not clearly and accurately disclosed pursuant to a privacy policy that complies with applicable law and regulations, and (e) do not contain any worms, viruses, spyware, adware or other malicious or intrusive software and (f) provides to its users a clear description of its use of the data, including its transfer to, and processing by, AppsFlyer.
5. Intellectual Property. Company shall have all right, title and interest in its Application. AppsFlyer shall have all right, title and interest in the Code and the Services, and all software that provides the Services. If Company provides AppsFlyer with any feedback regarding the Code and/or the Services, AppsFlyer may use all such feedback without restriction. Nothing herein shall be interpreted to provide Company any rights in the Code or the Services except the limited right to use the Code and receive the Service as set forth herein.
6. Payment. AppsFlyer offers several pricing plans, and Company must choose a pricing plan prior to downloading and using the Services. If required by law, Company must add applicable VAT to the amounts payable under such pricing plan. Company shall make payment to AppsFlyer without deduction for and free and clear of any taxes and government charges. Amounts are due and payable within 10 days of AppsFlyer’s issuance of the applicable invoice. Late payments shall bear interest at the rate of 12% per annum. If Company pays using a third party payment processor or credit card, AppsFlyer accepts no responsibility or liability for the actions, omissions or privacy policies of the third party payment processor.
7. Data, Privacy, Retention and Restricted Data.
7.1. The Services enable the Company to collect and track data concerning the characteristics and activities of Application end users as long as the Code is installed (“Data”). Company owns, and retains all right, title and interest in Data. Company may modify the categories of Data collected by the Service through configuration of the Services. Accordingly, to the extent the Services are configured as such, Data may contain personally-identifiable information. AppsFlyer shall not transfer Data to third parties except as set forth in this Agreement or as directed by Company. Company represents and warrants that Company is permitted to collect, use and transfer Data through the Services.
7.2. Any personally identifiable information or Personal Data, as such term is defined under the EU General Data Protection Regulation 2016/679 (“GDPR” and “Personal Data” respectively) provided to AppsFlyer on Company’s behalf, if any, and the processing thereof, shall be governed under the terms and conditions set forth in the AppsFlyer Data Processing Agreement (“DPA”). A current version of the DPA executed by AppsFlyer is available at https://www.appsflyer.com/gdpr/dpa.pdf, and shall become effective as of May 25 2018. AppsFlyer shall provide prior notification to Company in writing upon any material change to the DPA. The DPA is an integral part of this Agreement. Unless otherwise explicitly agreed in writing by the parties, it is agreed and acknowledged that with respect to any personally-identifiable information and Personal Data included in the Data, Company shall be considered as the Controller and AppsFlyer shall be considered as the Processor (as such terms are defined under the GDPR and the DPA).
7.3. AppsFlyer may use aggregated anonymized data, from time to time, for analytics, improvement of the Services and internal purposes (“Aggregated Data”). Aggregated Data may include data derived from the Company’s Data, provided that Aggregated Data does not contain data solely derived from Company’s Data and does not identify or trace to Company or any of Company’s end users.
7.4. AppsFlyer publishes a privacy policy, as required under applicable law, which describes AppsFlyer’s collection and use of data. A current copy of AppsFlyer’s privacy policy is available at https://www.appsflyer.com/privacy-policy (“Privacy Policy”). AppsFlyer shall provide prior notification to Company in writing upon any material change to the privacy policy.
7.5. AppsFlyer and its agents may process Data outside of the jurisdiction of Company.
7.6. AppsFlyer’ is required by certain third parties (such as advertising networks) to delete data they provide after a specified period of time. As such, AppsFlyer may delete Data provided by such third parties in accordance with its standard data retention policies.
7.7. Company may only provide to AppsFlyer, or otherwise have AppsFlyer (or anyone on its behalf) process, such Data types and parameters which are explicitly permitted under AppsFlyer’s Privacy Policy (“Permitted Controller Personal Data Types and Parameters”, as also defined under the DPA). Solely Company (and not AppsFlyer) shall be liable for any data which is provided or otherwise made available to AppsFlyer or anyone on its behalf in excess of the Permitted Controller Personal Data Types and Parameters (“Excess Data”). AppsFlyer’s obligations under the Agreement or the DPA shall not apply to any such Excess Data.
7.8. Without derogating from any of the obligations of Company hereunder, Company shall not provide to AppsFlyer any data regarding children, or any health, financial, or insurance data or other data subject to specific regulatory or statutory protection regimes, except as may otherwise be expressly agreed in writing between the parties and in accordance with applicable law.
8. Confidentiality.
8.1. In the context of the relationship under this Agreement, either party (a “Disclosing Party”) may disclose to the other party (a “Receiving Party”) certain confidential information regarding its technology and business (“Confidential Information”). AppsFlyer’s Confidential Information includes, among others, the terms and pricing of this Agreement.
8.2. Subject to the terms and conditions of this Agreement, Receiving Party agrees to keep confidential and not disclose or use any Confidential Information except to support its use or provision of the Services. Confidential Information shall not include information that Receiving Party can show (a) was already lawfully known to or independently developed by Receiving Party without access to or use of Confidential Information, (b) was received by Receiving Party from any third party without restrictions, (c) is publicly and generally available, free of confidentiality restrictions; or (d) is required to be disclosed by law, regulation or is requested in the context of a law enforcement investigation, provided that Receiving Party provides Disclosing Party with prompt notice of such requirement and cooperates in order to minimize such requirement. Receiving Party shall restrict disclosure of Confidential Information to those of its employees and contractors with a reasonable need to know such information and which are bound by written confidentiality obligations no less restrictive than those set out herein. Company will not disclose any information regarding the results of any testing or evaluation of the Services to any third party without AppsFlyer’s prior written consent.
8.3. The non-disclosure and non-use obligations set forth in this Section 8 shall survive the termination or expiration of this Agreement for a period of 5 years.
9. Analytics. The Services include the provision of certain reports and analytics regarding the Data (“Analytics”). AppsFlyer makes no warranty that the Analytics provided shall be useful to Company’s business. Company is solely responsible for any actions Company may take based on the Analytics.
10. Support. Company may contact AppsFlyer with regard to support for the Services by sending an email to support@appsflyer.com. AppsFlyer shall provide up to 5 hours of support each month at no additional charge.
11. Service Levels. AppsFlyer shall provide Services in accordance with the service commitments in Appendix B.
12. Indemnification.
12.1. AppsFlyer Indemnification.
12.1.1. AppsFlyer shall defend, indemnify and hold harmless Company (and its affiliates, officers, directors and employees) from and against any and all damages, costs, losses, liabilities or expenses (including court costs and reasonable attorneys’ legal fees) which Company may suffer or incur in connection with any actual claim, demand, action or other proceeding by any third party arising from: (a) any breach of AppsFlyer’s obligations, representations or warranties herein; or (b) a claim that the Code and/or Services infringe the intellectual property rights of a third party. This Section 12.1 sets forth AppsFlyer’s sole obligations and Company’s sole remedies for any claim that the Code and/or Services infringe the intellectual property rights of a third party.
12.1.2. Notwithstanding the foregoing, AppsFlyer shall have no responsibility or liability for any claim to the extent resulting from or arising out of (a) the use of the Code or Services not in compliance with this Agreement or applicable law, (b) the combination of the Code or Services with any code or services not provided by AppsFlyer, (c) the modification of any Code or Services by any party other than AppsFlyer or (d) the use of any Code that is not the most up-to-date Code.
12.1.3. If the Services shall be the subject of an infringement claim, or AppsFlyer reasonably believes that the Services shall be the subject of an infringement claim, AppsFlyer may terminate this Agreement with written notice if modification of the Services to be non-infringing is not reasonably practical.
12.2. Company Indemnification. Company shall defend and indemnify AppsFlyer (and its affiliates, officers, directors and employees) from and against any and all damages, costs, losses, liabilities or expenses (including court costs and attorneys’ fees) which AppsFlyer may suffer or incur in connection with any actual claim, demand, action or other proceeding by any third party arising from: (a) any breach of Company’s obligations, representations or warranties herein; or (b) any use or distribution of the Company’s Application in violation of this Agreement or applicable law or regulations.
12.3. Procedure. The obligations of either party to provide indemnification under this Agreement will be contingent upon the indemnified party (i) providing the indemnifying party with prompt written notice of any claim for which indemnification is sought (provided that the indemnified party’s failure to notify the indemnifying party will not diminish the indemnifying party’s obligations under this Section 12 except to the extent that the indemnifying party is materially prejudiced as a result of such failure), (ii) cooperating fully with the indemnifying party (at the indemnifying party’s expense), and (iii) allowing the indemnifying party to control the defense and settlement of such claim, provided that no settlement may be entered into without the consent of the indemnified party if such settlement would require any action on the part of the indemnified party other than to cease using any allegedly infringing or illegal content or services. Subject to the foregoing, an indemnified party will at all times have the option to participate in any matter or litigation through counsel of its own selection at its own expense.
13. Disclaimer of Warranties. EXCEPT AS EXPRESSLY PROVIDED HEREIN, COMPANY ACCEPTS THE CODE AND SERVICES “AS IS” AND ACKNOWLEDGES THAT APPSFLYER MAKES NO OTHER WARRANTY AND DISCLAIMS ALL IMPLIED AND STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.
14. Limitation of Liability.
14.1. IN NO EVENT SHALL APPSFLYER, ITS DIRECTORS, OFFICERS, AFFILIATES OR AGENTS BE LIABLE FOR ANY CONSEQUENTIAL, INDIRECT, SPECIAL OR PUNITIVE DAMAGES, ARISING OUT OF OR RELATING TO THE SERVICES OR THE ARRANGEMENTS CONTEMPLATED HEREIN.
14.2. EXCEPT FOR INTENTIONAL MISCONDUCT, GROSS NEGLIGENCE, BREACH OF CONFIDENTIALITY, DATA OR PRIVACY OBLIGATIONS AND APPSFLYER’S INDEMNIFICATION OBLIGATIONS FOR INTELLECTUAL PROPERTY INFRINGEMENT (THE “CARVE-OUT CLAIMS”), APPSFLYER’S ENTIRE LIABILITY FOR THE PROVISION OF THE SERVICES OR UNDER ANY PROVISION OF THIS AGREEMENT SHALL NOT EXCEED THE AMOUNT OF PAYMENT RECEIVED BY APPSFLYER FROM COMPANY IN THE 12 MONTHS PRECEDING THE APPLICABLE CLAIM, IN THE AGGREGATE. WITH RESPECT TO THE CARVE-OUT CLAIMS, APPSFLYER’S ENTIRE LIABILITY FOR THE PROVISION OF THE SERVICES OR UNDER ANY PROVISION OF THIS AGREEMENT SHALL NOT EXCEED TWO (2) TIMES THE AMOUNT OF PAYMENT RECEIVED BY APPSFLYER FROM COMPANY IN THE TWELVE (12) MONTHS PRECEDING THE APPLICABLE CLAIM, IN THE AGGREGATE.
15. Term and Termination.
15.1. The term of this Agreement shall commence as of the day you accept this Agreement or, if earlier, the date that you integrate the Code into an Application and shall continue in effect for a period of twelve (12) months (the “Initial Term”); provided that if Company selects the “Basic Pay-Per-Use” package, as shown on AppsFlyer’s website, this Agreement shall be in effect on a month-to-month basis. Following the Initial Term, this Agreement shall automatically renew for subsequent terms of twelve (12) months each (each a “Renewal Term” and together with the Initial Term, the “Term”), unless one of the parties notifies the other party of its intention not to renew the Agreement at least 45 days prior to the commencement of any Renewal Term.
15.2. Either party may terminate this Agreement with written notice if it has reason to believe that the other Party is in material breach of this Agreement, and such breach is not cured within 30 days from the receipt of written notice of such breach. In addition, either party shall have the right to terminate this Agreement upon 30 days’ written notice to the other party pursuant to section 5.3 of the DPA.
15.3. This agreement is based on a reasonable and fair use of the Services. Notwithstanding anything to the contrary herein, any use that is not aligned with such fair use may be overcharged or terminated immediately by AppsFlyer.
15.4. Upon any termination or expiration of this Agreement, AppsFlyer will cease providing the Services. In the event of any termination (a) Company will not be entitled to any refunds of any nonrefundable fees, (b) any outstanding balance for Services rendered through the date of termination will be immediately due and payable in full, and (c) Company’s historical data will be available for download through AppsFlyer’s standard user interface for a period of 30 days. Any obligations of the Parties that by their nature are intended to survive the termination or expiration of this Agreement, including the obligations of the Parties in Sections 3 – 9 and 12 – 15 of this Agreement, shall survive any termination thereof.
16. Publicity. During the Term, AppsFlyer may refer to Company as a customer of AppsFlyer, including by displaying Company’s name and logo on AppsFlyer’s website and other marketing materials.
17. Miscellaneous.
17.1. This Agreement represents the entire agreement between the parties regarding the subject matter hereof and supersedes any and all other agreements between the parties, whether written or oral, regarding the subject matter hereof. For clarity, the provisions of this Agreement supersede any earlier non-disclosure or confidentiality agreements between the parties. Except as expressly set forth herein, this Agreement may not be modified or amended except in a writing executed by both parties.
17.2. All waivers must be in writing. A waiver of any default hereunder or of any of the terms and conditions of this Agreement shall not be deemed to be a continuing waiver or a waiver of any other default or of any other term or condition, but shall apply solely to the instance to which such waiver is directed. AppsFlyer may provide Company with notices required hereunder by contacting Company at any email address Company provided, including in its registration information.
17.3. Neither Party may assign any of its rights and obligations under this Agreement without the prior written consent of the other Party, such consent not to be required in the event of an assignment by one of the Parties to a purchaser of all or substantially all of the assignor’s assets or share capital. The assignor shall provide the other Party with written notice of the assignment. Assignment in violation of the foregoing shall be void.
17.4. If any part of this Agreement shall be invalid or unenforceable, such part shall be interpreted to give the maximum force possible to such terms as possible under applicable law, and such invalidity or unenforceability shall not affect the validity or enforceability of any other part or provision of this Agreement which shall remain in full force and effect.
17.5. This Agreement shall be governed by the laws of the State of New York, and the competent courts in the city of New York shall have exclusive jurisdiction to hear any disputes arising hereunder.
Appendix A: Fees and Services
[PACKAGE OF SERVICES TO BE CHOSEN BY COMPANY]
Appendix B: Service Levels
AppsFlyer service commitments do not include downtime to extent resulting from: previously scheduled maintenance and events beyond AppsFlyer’s reasonable control, such as any down time (a) caused by outages to any public Internet backbones, networks or servers, (b) caused by any failures of Company’s Application, equipment, systems or local access services, or (c) strikes, riots, insurrection, fires, floods, explosions, war, governmental action, labor conditions, earthquakes or natural disasters.
<img src="https://www.appsflyer.com/wp-content/uploads/2016/11/logo-1.svg" width="450">
# AppsFlyerFramework
[![Version](https://img.shields.io/cocoapods/v/AppsFlyerFramework.svg?style=flat)](http://cocoapods.org/pods/AppsFlyerFramework)
[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
In order to download and/or get instruction on how to integrate AppsFlyer iOS SDK please visit the following page - [iOS SDK](https://support.appsflyer.com/hc/en-us/sections/201691546-iOS-SDK)
---
In order for us to provide optimal support, we would kindly ask you to submit any issues to support@appsflyer.com
When submitting an issue please specify your AppsFlyer sign-up (account) email , your app ID , reproduction steps, logs, code snippets and any additional relevant information.
---
## Swift Package Manager
### Introduction
AppsFlyer SDK version 6.1.x+ supports installation via [Swift Package Manager](https://swift.org/package-manager/).
### Installation
In Xcode go to: ```File -> Swift Packages -> Add Package Dependency...```
![Step 1](https://github.com/amit-kremer93/resources/blob/main/1.png)
Enter the AppsFlyer SDK GitHub repository - ```https://github.com/AppsFlyerSDK/AppsFlyerFramework```
![Step 2](https://github.com/amit-kremer93/resources/blob/main/2.png)
Select the SDK version
![Step 3](https://github.com/amit-kremer93/resources/blob/main/3.png)
Select the AppsFlyerLib library
![Step 4](https://github.com/amit-kremer93/resources/blob/main/4.png)
In your ```AppDelegate``` file: import AppsFlyerLib module
![Step 5](https://github.com/amit-kremer93/resources/blob/main/5.png)
Start to use AppsFlyer SDK
![Step 6](https://github.com/amit-kremer93/resources/blob/main/6.png)
...@@ -2,6 +2,9 @@ PODS: ...@@ -2,6 +2,9 @@ PODS:
- AlgoliaSearchClient (8.8.1): - AlgoliaSearchClient (8.8.1):
- Logging - Logging
- AmazonPublisherServicesSDK (4.0.0) - AmazonPublisherServicesSDK (4.0.0)
- AppsFlyerFramework (6.3.0):
- AppsFlyerFramework/Main (= 6.3.0)
- AppsFlyerFramework/Main (6.3.0)
- BezierKit (0.11.0) - BezierKit (0.11.0)
- Cirque (1.0.3) - Cirque (1.0.3)
- FBAudienceNetwork (6.4.1): - FBAudienceNetwork (6.4.1):
...@@ -167,6 +170,7 @@ PODS: ...@@ -167,6 +170,7 @@ PODS:
DEPENDENCIES: DEPENDENCIES:
- AlgoliaSearchClient (~> 8.2) - AlgoliaSearchClient (~> 8.2)
- AmazonPublisherServicesSDK - AmazonPublisherServicesSDK
- AppsFlyerFramework
- BezierKit - BezierKit
- Cirque (from `https://github.com/StepanetsDmtry/Cirque.git`) - Cirque (from `https://github.com/StepanetsDmtry/Cirque.git`)
- Firebase/Analytics - Firebase/Analytics
...@@ -190,6 +194,7 @@ SPEC REPOS: ...@@ -190,6 +194,7 @@ SPEC REPOS:
trunk: trunk:
- AlgoliaSearchClient - AlgoliaSearchClient
- AmazonPublisherServicesSDK - AmazonPublisherServicesSDK
- AppsFlyerFramework
- BezierKit - BezierKit
- FBAudienceNetwork - FBAudienceNetwork
- FBSDKCoreKit - FBSDKCoreKit
...@@ -241,6 +246,7 @@ CHECKOUT OPTIONS: ...@@ -241,6 +246,7 @@ CHECKOUT OPTIONS:
SPEC CHECKSUMS: SPEC CHECKSUMS:
AlgoliaSearchClient: bbafe7f014cc0b474646d794ae3675ef4e92f0d5 AlgoliaSearchClient: bbafe7f014cc0b474646d794ae3675ef4e92f0d5
AmazonPublisherServicesSDK: f73e281872525d1b929dca506c3a0332d4f902fa AmazonPublisherServicesSDK: f73e281872525d1b929dca506c3a0332d4f902fa
AppsFlyerFramework: e5b13250a1b68887213efcd854238791d17cf50b
BezierKit: 8b9bc3aaaa34ede809ff7c7c8aecc2bbe3b86a89 BezierKit: 8b9bc3aaaa34ede809ff7c7c8aecc2bbe3b86a89
Cirque: 1eb134f2180b33107106dc72e47340aefb054da3 Cirque: 1eb134f2180b33107106dc72e47340aefb054da3
FBAudienceNetwork: 1974ec59ef88102f284c29941d73d0cbec3f2874 FBAudienceNetwork: 1974ec59ef88102f284c29941d73d0cbec3f2874
...@@ -276,6 +282,6 @@ SPEC CHECKSUMS: ...@@ -276,6 +282,6 @@ SPEC CHECKSUMS:
Swarm: 95393cd52715744c94e3a8475bc20b4de5d79f35 Swarm: 95393cd52715744c94e3a8475bc20b4de5d79f35
XMLCoder: f884dfa894a6f8b7dce465e4f6c02963bf17e028 XMLCoder: f884dfa894a6f8b7dce465e4f6c02963bf17e028
PODFILE CHECKSUM: 2a940ee71b11c8df13e5b37774edf13ede6b06bb PODFILE CHECKSUM: c1f0b84cb7820c37e25a84eaaa21727fc604a5b6
COCOAPODS: 1.10.1 COCOAPODS: 1.10.1
This source diff could not be displayed because it is too large. You can view the blob instead.
${PODS_ROOT}/Target Support Files/AppsFlyerFramework/AppsFlyerFramework-xcframeworks.sh
${PODS_ROOT}/AppsFlyerFramework/AppsFlyerLib.xcframework
\ No newline at end of file
${PODS_XCFRAMEWORKS_BUILD_DIR}/AppsFlyerLib
\ No newline at end of file
#!/bin/sh
set -e
set -u
set -o pipefail
function on_error {
echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
}
trap 'on_error $LINENO' ERR
# This protects against multiple targets copying the same framework dependency at the same time. The solution
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
copy_dir()
{
local source="$1"
local destination="$2"
# Use filter instead of exclude so missing patterns don't throw errors.
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}\" \"${destination}\""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}" "${destination}"
}
SELECT_SLICE_RETVAL=""
select_slice() {
local paths=("$@")
# Locate the correct slice of the .xcframework for the current architectures
local target_path=""
# Split archs on space so we can find a slice that has all the needed archs
local target_archs=$(echo $ARCHS | tr " " "\n")
local target_variant=""
if [[ "$PLATFORM_NAME" == *"simulator" ]]; then
target_variant="simulator"
fi
if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then
target_variant="maccatalyst"
fi
for i in ${!paths[@]}; do
local matched_all_archs="1"
for target_arch in $target_archs
do
if ! [[ "${paths[$i]}" == *"$target_variant"* ]]; then
matched_all_archs="0"
break
fi
# Verifies that the path contains the variant string (simulator or maccatalyst) if the variant is set.
if [[ -z "$target_variant" && ("${paths[$i]}" == *"simulator"* || "${paths[$i]}" == *"maccatalyst"*) ]]; then
matched_all_archs="0"
break
fi
# This regex matches all possible variants of the arch in the folder name:
# Let's say the folder name is: ios-armv7_armv7s_arm64_arm64e/CoconutLib.framework
# We match the following: -armv7_, _armv7s_, _arm64_ and _arm64e/.
# If we have a specific variant: ios-i386_x86_64-simulator/CoconutLib.framework
# We match the following: -i386_ and _x86_64-
# When the .xcframework wraps a static library, the folder name does not include
# any .framework. In that case, the folder name can be: ios-arm64_armv7
# We also match _armv7$ to handle that case.
local target_arch_regex="[_\-]${target_arch}([\/_\-]|$)"
if ! [[ "${paths[$i]}" =~ $target_arch_regex ]]; then
matched_all_archs="0"
break
fi
done
if [[ "$matched_all_archs" == "1" ]]; then
# Found a matching slice
echo "Selected xcframework slice ${paths[$i]}"
SELECT_SLICE_RETVAL=${paths[$i]}
break
fi
done
}
install_library() {
local source="$1"
local name="$2"
local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}"
# Libraries can contain headers, module maps, and a binary, so we'll copy everything in the folder over
local source="$binary"
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}/*\" \"${destination}\""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}/*" "${destination}"
}
# Copies a framework to derived data for use in later build phases
install_framework()
{
local source="$1"
local name="$2"
local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}"
if [ ! -d "$destination" ]; then
mkdir -p "$destination"
fi
copy_dir "$source" "$destination"
echo "Copied $source to $destination"
}
install_xcframework_library() {
local basepath="$1"
local name="$2"
local paths=("$@")
# Locate the correct slice of the .xcframework for the current architectures
select_slice "${paths[@]}"
local target_path="$SELECT_SLICE_RETVAL"
if [[ -z "$target_path" ]]; then
echo "warning: [CP] Unable to find matching .xcframework slice in '${paths[@]}' for the current build architectures ($ARCHS)."
return
fi
install_framework "$basepath/$target_path" "$name"
}
install_xcframework() {
local basepath="$1"
local name="$2"
local package_type="$3"
local paths=("$@")
# Locate the correct slice of the .xcframework for the current architectures
select_slice "${paths[@]}"
local target_path="$SELECT_SLICE_RETVAL"
if [[ -z "$target_path" ]]; then
echo "warning: [CP] Unable to find matching .xcframework slice in '${paths[@]}' for the current build architectures ($ARCHS)."
return
fi
local source="$basepath/$target_path"
local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}"
if [ ! -d "$destination" ]; then
mkdir -p "$destination"
fi
copy_dir "$source/" "$destination"
echo "Copied $source to $destination"
}
install_xcframework "${PODS_ROOT}/AppsFlyerFramework/AppsFlyerLib.xcframework" "AppsFlyerLib" "framework" "ios-arm64_x86_64-maccatalyst" "ios-arm64_i386_x86_64-simulator" "ios-arm64_armv7"
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AppsFlyerFramework
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppsFlyerFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppsFlyerLib"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_LDFLAGS = $(inherited) -framework "CoreTelephony" -framework "Security" -framework "SystemConfiguration"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/AppsFlyerFramework
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AppsFlyerFramework
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AppsFlyerFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppsFlyerLib"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_LDFLAGS = $(inherited) -framework "CoreTelephony" -framework "Security" -framework "SystemConfiguration"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/AppsFlyerFramework
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
...@@ -35,6 +35,10 @@ These materials may include third party software that is copyrighted by other pa ...@@ -35,6 +35,10 @@ These materials may include third party software that is copyrighted by other pa
These materials are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. These materials are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## AppsFlyerFramework
Copyright 2018 AppsFlyer Ltd. All rights reserved.
## BezierKit ## BezierKit
MIT License MIT License
......
...@@ -60,6 +60,16 @@ These materials are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDI ...@@ -60,6 +60,16 @@ These materials are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDI
</dict> </dict>
<dict> <dict>
<key>FooterText</key> <key>FooterText</key>
<string>Copyright 2018 AppsFlyer Ltd. All rights reserved.</string>
<key>License</key>
<string>Proprietary</string>
<key>Title</key>
<string>AppsFlyerFramework</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>MIT License <string>MIT License
Copyright (c) 2017 Holmes Futrell Copyright (c) 2017 Holmes Futrell
......
...@@ -3,12 +3,12 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO ...@@ -3,12 +3,12 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
EXCLUDED_ARCHS[sdk=appletvsimulator*] = arm64 EXCLUDED_ARCHS[sdk=appletvsimulator*] = arm64
EXCLUDED_ARCHS[sdk=iphoneos*] = i386 x86_64 EXCLUDED_ARCHS[sdk=iphoneos*] = i386 x86_64
EXCLUDED_ARCHS[sdk=watchsimulator*] = arm64 EXCLUDED_ARCHS[sdk=watchsimulator*] = arm64
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AlgoliaSearchClient" "${PODS_CONFIGURATION_BUILD_DIR}/BezierKit" "${PODS_CONFIGURATION_BUILD_DIR}/Cirque" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/Localize-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/Logging" "${PODS_CONFIGURATION_BUILD_DIR}/PKHUD" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/Swarm" "${PODS_CONFIGURATION_BUILD_DIR}/XMLCoder" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" "${PODS_CONFIGURATION_BUILD_DIR}/mopub-ios-sdk" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/AmazonPublisherServicesSDK/APS_iOS_SDK-4.0.0" "${PODS_ROOT}/FBAudienceNetwork/Static" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKCore" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKMRAID" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKVideo" "${PODS_ROOT}/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_ROOT}/GoogleMobileAdsMediationFacebook/FacebookAdapter-6.4.1.0" "${PODS_ROOT}/GoogleMobileAdsMediationFyber/FyberAdapter-7.8.5.0" "${PODS_ROOT}/GoogleMobileAdsMediationMoPub/MoPubAdapter-5.16.2.0" "${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release" "${PODS_ROOT}/MORichNotification/Frameworks" "${PODS_ROOT}/MoEngage-iOS-SDK/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/DTBiOSSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FacebookAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FyberAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleMobileAds" "${PODS_XCFRAMEWORKS_BUILD_DIR}/MoPubAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UserMessagingPlatform" FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AlgoliaSearchClient" "${PODS_CONFIGURATION_BUILD_DIR}/BezierKit" "${PODS_CONFIGURATION_BUILD_DIR}/Cirque" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/Localize-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/Logging" "${PODS_CONFIGURATION_BUILD_DIR}/PKHUD" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/Swarm" "${PODS_CONFIGURATION_BUILD_DIR}/XMLCoder" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" "${PODS_CONFIGURATION_BUILD_DIR}/mopub-ios-sdk" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/AmazonPublisherServicesSDK/APS_iOS_SDK-4.0.0" "${PODS_ROOT}/AppsFlyerFramework" "${PODS_ROOT}/FBAudienceNetwork/Static" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKCore" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKMRAID" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKVideo" "${PODS_ROOT}/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_ROOT}/GoogleMobileAdsMediationFacebook/FacebookAdapter-6.4.1.0" "${PODS_ROOT}/GoogleMobileAdsMediationFyber/FyberAdapter-7.8.5.0" "${PODS_ROOT}/GoogleMobileAdsMediationMoPub/MoPubAdapter-5.16.2.0" "${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release" "${PODS_ROOT}/MORichNotification/Frameworks" "${PODS_ROOT}/MoEngage-iOS-SDK/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppsFlyerLib" "${PODS_XCFRAMEWORKS_BUILD_DIR}/DTBiOSSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FacebookAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FyberAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleMobileAds" "${PODS_XCFRAMEWORKS_BUILD_DIR}/MoPubAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UserMessagingPlatform"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) FBSDKCOCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) FBSDKCOCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AlgoliaSearchClient/AlgoliaSearchClient.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/BezierKit/BezierKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Cirque/Cirque.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK/Flurry_iOS_SDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Localize-Swift/Localize_Swift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Logging/Logging.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PKHUD/PKHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Swarm/Swarm.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/XMLCoder/XMLCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/mopub-ios-sdk/MoPubSDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/Fyber_Marketplace_SDK" $(inherited) ${PODS_ROOT}/Firebase/CoreOnly/Sources "${PODS_TARGET_SRCROOT}/Sources/FBLPromises/include" HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AlgoliaSearchClient/AlgoliaSearchClient.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/BezierKit/BezierKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Cirque/Cirque.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK/Flurry_iOS_SDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Localize-Swift/Localize_Swift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Logging/Logging.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PKHUD/PKHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Swarm/Swarm.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/XMLCoder/XMLCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/mopub-ios-sdk/MoPubSDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/Fyber_Marketplace_SDK" $(inherited) ${PODS_ROOT}/Firebase/CoreOnly/Sources "${PODS_TARGET_SRCROOT}/Sources/FBLPromises/include"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Flurry-iOS-SDK/Flurry" "${PODS_ROOT}/mopub-ios-sdk/MoPubSDK/Internal/Viewability/OMSDK" LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Flurry-iOS-SDK/Flurry" "${PODS_ROOT}/mopub-ios-sdk/MoPubSDK/Internal/Viewability/OMSDK"
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"stdc++" -l"xml2" -l"xml2.2" -l"z" -framework "AVFoundation" -framework "AVKit" -framework "AdSupport" -framework "AlgoliaSearchClient" -framework "AudioToolbox" -framework "BezierKit" -framework "CFNetwork" -framework "Cirque" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "DTBiOSSDK" -framework "EventKit" -framework "EventKitUI" -framework "FBAudienceNetwork" -framework "FBLPromises" -framework "FBSDKCoreKit" -framework "FacebookAdapter" -framework "FirebaseABTesting" -framework "FirebaseAnalytics" -framework "FirebaseCore" -framework "FirebaseCoreDiagnostics" -framework "FirebaseCrashlytics" -framework "FirebaseInstallations" -framework "FirebaseRemoteConfig" -framework "Flurry_iOS_SDK" -framework "Foundation" -framework "FyberAdapter" -framework "GoogleAppMeasurement" -framework "GoogleDataTransport" -framework "GoogleMobileAds" -framework "GoogleUtilities" -framework "IASDKCore" -framework "IASDKMRAID" -framework "IASDKVideo" -framework "Localize_Swift" -framework "Logging" -framework "Lottie" -framework "MOAnalytics" -framework "MOMessaging" -framework "MORichNotification" -framework "MediaPlayer" -framework "MessageUI" -framework "MoEngage" -framework "MoEngageCore" -framework "MoPubAdapter" -framework "MoPubSDK" -framework "MobileCoreServices" -framework "PKHUD" -framework "QuartzCore" -framework "SafariServices" -framework "Security" -framework "SnapKit" -framework "StoreKit" -framework "Swarm" -framework "SystemConfiguration" -framework "UIKit" -framework "UserMessagingPlatform" -framework "UserNotifications" -framework "UserNotificationsUI" -framework "WebKit" -framework "XMLCoder" -framework "nanopb" -weak_framework "Accelerate" -weak_framework "Accounts" -weak_framework "AdSupport" -weak_framework "AppTrackingTransparency" -weak_framework "AudioToolbox" -weak_framework "CFNetwork" -weak_framework "CoreGraphics" -weak_framework "CoreMotion" -weak_framework "CoreTelephony" -weak_framework "Foundation" -weak_framework "JavaScriptCore" -weak_framework "LocalAuthentication" -weak_framework "QuartzCore" -weak_framework "SafariServices" -weak_framework "Security" -weak_framework "Social" -weak_framework "StoreKit" -weak_framework "SystemConfiguration" -weak_framework "UIKit" -weak_framework "UserNotifications" -weak_framework "VideoToolbox" -weak_framework "WebKit" OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"stdc++" -l"xml2" -l"xml2.2" -l"z" -framework "AVFoundation" -framework "AVKit" -framework "AdSupport" -framework "AlgoliaSearchClient" -framework "AppsFlyerLib" -framework "AudioToolbox" -framework "BezierKit" -framework "CFNetwork" -framework "Cirque" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "DTBiOSSDK" -framework "EventKit" -framework "EventKitUI" -framework "FBAudienceNetwork" -framework "FBLPromises" -framework "FBSDKCoreKit" -framework "FacebookAdapter" -framework "FirebaseABTesting" -framework "FirebaseAnalytics" -framework "FirebaseCore" -framework "FirebaseCoreDiagnostics" -framework "FirebaseCrashlytics" -framework "FirebaseInstallations" -framework "FirebaseRemoteConfig" -framework "Flurry_iOS_SDK" -framework "Foundation" -framework "FyberAdapter" -framework "GoogleAppMeasurement" -framework "GoogleDataTransport" -framework "GoogleMobileAds" -framework "GoogleUtilities" -framework "IASDKCore" -framework "IASDKMRAID" -framework "IASDKVideo" -framework "Localize_Swift" -framework "Logging" -framework "Lottie" -framework "MOAnalytics" -framework "MOMessaging" -framework "MORichNotification" -framework "MediaPlayer" -framework "MessageUI" -framework "MoEngage" -framework "MoEngageCore" -framework "MoPubAdapter" -framework "MoPubSDK" -framework "MobileCoreServices" -framework "PKHUD" -framework "QuartzCore" -framework "SafariServices" -framework "Security" -framework "SnapKit" -framework "StoreKit" -framework "Swarm" -framework "SystemConfiguration" -framework "UIKit" -framework "UserMessagingPlatform" -framework "UserNotifications" -framework "UserNotificationsUI" -framework "WebKit" -framework "XMLCoder" -framework "nanopb" -weak_framework "Accelerate" -weak_framework "Accounts" -weak_framework "AdSupport" -weak_framework "AppTrackingTransparency" -weak_framework "AudioToolbox" -weak_framework "CFNetwork" -weak_framework "CoreGraphics" -weak_framework "CoreMotion" -weak_framework "CoreTelephony" -weak_framework "Foundation" -weak_framework "JavaScriptCore" -weak_framework "LocalAuthentication" -weak_framework "QuartzCore" -weak_framework "SafariServices" -weak_framework "Security" -weak_framework "Social" -weak_framework "StoreKit" -weak_framework "SystemConfiguration" -weak_framework "UIKit" -weak_framework "UserNotifications" -weak_framework "VideoToolbox" -weak_framework "WebKit"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
PODS_BUILD_DIR = ${BUILD_DIR} PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
......
...@@ -3,12 +3,12 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO ...@@ -3,12 +3,12 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
EXCLUDED_ARCHS[sdk=appletvsimulator*] = arm64 EXCLUDED_ARCHS[sdk=appletvsimulator*] = arm64
EXCLUDED_ARCHS[sdk=iphoneos*] = i386 x86_64 EXCLUDED_ARCHS[sdk=iphoneos*] = i386 x86_64
EXCLUDED_ARCHS[sdk=watchsimulator*] = arm64 EXCLUDED_ARCHS[sdk=watchsimulator*] = arm64
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AlgoliaSearchClient" "${PODS_CONFIGURATION_BUILD_DIR}/BezierKit" "${PODS_CONFIGURATION_BUILD_DIR}/Cirque" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/Localize-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/Logging" "${PODS_CONFIGURATION_BUILD_DIR}/PKHUD" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/Swarm" "${PODS_CONFIGURATION_BUILD_DIR}/XMLCoder" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" "${PODS_CONFIGURATION_BUILD_DIR}/mopub-ios-sdk" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/AmazonPublisherServicesSDK/APS_iOS_SDK-4.0.0" "${PODS_ROOT}/FBAudienceNetwork/Static" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKCore" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKMRAID" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKVideo" "${PODS_ROOT}/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_ROOT}/GoogleMobileAdsMediationFacebook/FacebookAdapter-6.4.1.0" "${PODS_ROOT}/GoogleMobileAdsMediationFyber/FyberAdapter-7.8.5.0" "${PODS_ROOT}/GoogleMobileAdsMediationMoPub/MoPubAdapter-5.16.2.0" "${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release" "${PODS_ROOT}/MORichNotification/Frameworks" "${PODS_ROOT}/MoEngage-iOS-SDK/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/DTBiOSSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FacebookAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FyberAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleMobileAds" "${PODS_XCFRAMEWORKS_BUILD_DIR}/MoPubAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UserMessagingPlatform" FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AlgoliaSearchClient" "${PODS_CONFIGURATION_BUILD_DIR}/BezierKit" "${PODS_CONFIGURATION_BUILD_DIR}/Cirque" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/Localize-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/Logging" "${PODS_CONFIGURATION_BUILD_DIR}/PKHUD" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/Swarm" "${PODS_CONFIGURATION_BUILD_DIR}/XMLCoder" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" "${PODS_CONFIGURATION_BUILD_DIR}/mopub-ios-sdk" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/AmazonPublisherServicesSDK/APS_iOS_SDK-4.0.0" "${PODS_ROOT}/AppsFlyerFramework" "${PODS_ROOT}/FBAudienceNetwork/Static" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKCore" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKMRAID" "${PODS_ROOT}/Fyber_Marketplace_SDK/IASDKVideo" "${PODS_ROOT}/Google-Mobile-Ads-SDK/Frameworks/GoogleMobileAdsFramework-Current" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_ROOT}/GoogleMobileAdsMediationFacebook/FacebookAdapter-6.4.1.0" "${PODS_ROOT}/GoogleMobileAdsMediationFyber/FyberAdapter-7.8.5.0" "${PODS_ROOT}/GoogleMobileAdsMediationMoPub/MoPubAdapter-5.16.2.0" "${PODS_ROOT}/GoogleUserMessagingPlatform/Frameworks/Release" "${PODS_ROOT}/MORichNotification/Frameworks" "${PODS_ROOT}/MoEngage-iOS-SDK/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppsFlyerLib" "${PODS_XCFRAMEWORKS_BUILD_DIR}/DTBiOSSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FacebookAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FyberAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleMobileAds" "${PODS_XCFRAMEWORKS_BUILD_DIR}/MoPubAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UserMessagingPlatform"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) FBSDKCOCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) FBSDKCOCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AlgoliaSearchClient/AlgoliaSearchClient.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/BezierKit/BezierKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Cirque/Cirque.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK/Flurry_iOS_SDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Localize-Swift/Localize_Swift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Logging/Logging.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PKHUD/PKHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Swarm/Swarm.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/XMLCoder/XMLCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/mopub-ios-sdk/MoPubSDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/Fyber_Marketplace_SDK" $(inherited) ${PODS_ROOT}/Firebase/CoreOnly/Sources "${PODS_TARGET_SRCROOT}/Sources/FBLPromises/include" HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AlgoliaSearchClient/AlgoliaSearchClient.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/BezierKit/BezierKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Cirque/Cirque.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK/Flurry_iOS_SDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Localize-Swift/Localize_Swift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Logging/Logging.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PKHUD/PKHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Swarm/Swarm.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/XMLCoder/XMLCoder.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/mopub-ios-sdk/MoPubSDK.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/Fyber_Marketplace_SDK" $(inherited) ${PODS_ROOT}/Firebase/CoreOnly/Sources "${PODS_TARGET_SRCROOT}/Sources/FBLPromises/include"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Flurry-iOS-SDK/Flurry" "${PODS_ROOT}/mopub-ios-sdk/MoPubSDK/Internal/Viewability/OMSDK" LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Flurry-iOS-SDK/Flurry" "${PODS_ROOT}/mopub-ios-sdk/MoPubSDK/Internal/Viewability/OMSDK"
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"stdc++" -l"xml2" -l"xml2.2" -l"z" -framework "AVFoundation" -framework "AVKit" -framework "AdSupport" -framework "AlgoliaSearchClient" -framework "AudioToolbox" -framework "BezierKit" -framework "CFNetwork" -framework "Cirque" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "DTBiOSSDK" -framework "EventKit" -framework "EventKitUI" -framework "FBAudienceNetwork" -framework "FBLPromises" -framework "FBSDKCoreKit" -framework "FacebookAdapter" -framework "FirebaseABTesting" -framework "FirebaseAnalytics" -framework "FirebaseCore" -framework "FirebaseCoreDiagnostics" -framework "FirebaseCrashlytics" -framework "FirebaseInstallations" -framework "FirebaseRemoteConfig" -framework "Flurry_iOS_SDK" -framework "Foundation" -framework "FyberAdapter" -framework "GoogleAppMeasurement" -framework "GoogleDataTransport" -framework "GoogleMobileAds" -framework "GoogleUtilities" -framework "IASDKCore" -framework "IASDKMRAID" -framework "IASDKVideo" -framework "Localize_Swift" -framework "Logging" -framework "Lottie" -framework "MOAnalytics" -framework "MOMessaging" -framework "MORichNotification" -framework "MediaPlayer" -framework "MessageUI" -framework "MoEngage" -framework "MoEngageCore" -framework "MoPubAdapter" -framework "MoPubSDK" -framework "MobileCoreServices" -framework "PKHUD" -framework "QuartzCore" -framework "SafariServices" -framework "Security" -framework "SnapKit" -framework "StoreKit" -framework "Swarm" -framework "SystemConfiguration" -framework "UIKit" -framework "UserMessagingPlatform" -framework "UserNotifications" -framework "UserNotificationsUI" -framework "WebKit" -framework "XMLCoder" -framework "nanopb" -weak_framework "Accelerate" -weak_framework "Accounts" -weak_framework "AdSupport" -weak_framework "AppTrackingTransparency" -weak_framework "AudioToolbox" -weak_framework "CFNetwork" -weak_framework "CoreGraphics" -weak_framework "CoreMotion" -weak_framework "CoreTelephony" -weak_framework "Foundation" -weak_framework "JavaScriptCore" -weak_framework "LocalAuthentication" -weak_framework "QuartzCore" -weak_framework "SafariServices" -weak_framework "Security" -weak_framework "Social" -weak_framework "StoreKit" -weak_framework "SystemConfiguration" -weak_framework "UIKit" -weak_framework "UserNotifications" -weak_framework "VideoToolbox" -weak_framework "WebKit" OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"stdc++" -l"xml2" -l"xml2.2" -l"z" -framework "AVFoundation" -framework "AVKit" -framework "AdSupport" -framework "AlgoliaSearchClient" -framework "AppsFlyerLib" -framework "AudioToolbox" -framework "BezierKit" -framework "CFNetwork" -framework "Cirque" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "DTBiOSSDK" -framework "EventKit" -framework "EventKitUI" -framework "FBAudienceNetwork" -framework "FBLPromises" -framework "FBSDKCoreKit" -framework "FacebookAdapter" -framework "FirebaseABTesting" -framework "FirebaseAnalytics" -framework "FirebaseCore" -framework "FirebaseCoreDiagnostics" -framework "FirebaseCrashlytics" -framework "FirebaseInstallations" -framework "FirebaseRemoteConfig" -framework "Flurry_iOS_SDK" -framework "Foundation" -framework "FyberAdapter" -framework "GoogleAppMeasurement" -framework "GoogleDataTransport" -framework "GoogleMobileAds" -framework "GoogleUtilities" -framework "IASDKCore" -framework "IASDKMRAID" -framework "IASDKVideo" -framework "Localize_Swift" -framework "Logging" -framework "Lottie" -framework "MOAnalytics" -framework "MOMessaging" -framework "MORichNotification" -framework "MediaPlayer" -framework "MessageUI" -framework "MoEngage" -framework "MoEngageCore" -framework "MoPubAdapter" -framework "MoPubSDK" -framework "MobileCoreServices" -framework "PKHUD" -framework "QuartzCore" -framework "SafariServices" -framework "Security" -framework "SnapKit" -framework "StoreKit" -framework "Swarm" -framework "SystemConfiguration" -framework "UIKit" -framework "UserMessagingPlatform" -framework "UserNotifications" -framework "UserNotificationsUI" -framework "WebKit" -framework "XMLCoder" -framework "nanopb" -weak_framework "Accelerate" -weak_framework "Accounts" -weak_framework "AdSupport" -weak_framework "AppTrackingTransparency" -weak_framework "AudioToolbox" -weak_framework "CFNetwork" -weak_framework "CoreGraphics" -weak_framework "CoreMotion" -weak_framework "CoreTelephony" -weak_framework "Foundation" -weak_framework "JavaScriptCore" -weak_framework "LocalAuthentication" -weak_framework "QuartzCore" -weak_framework "SafariServices" -weak_framework "Security" -weak_framework "Social" -weak_framework "StoreKit" -weak_framework "SystemConfiguration" -weak_framework "UIKit" -weak_framework "UserNotifications" -weak_framework "VideoToolbox" -weak_framework "WebKit"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
PODS_BUILD_DIR = ${BUILD_DIR} PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment