SKAdNetwork
A class that validates advertiser-driven app installations.
可以在保證用戶隱私的同時,衡量廣告系列的成功程度。涉及到3個參與者:
-
Ad networks - 廣告平臺
注冊并提供network ID Registering an Ad Network
提供經過簽名的廣告給展示廣告的App Signing and Providing Ads.
接收被廣告展示的App安裝成功的postback
驗證postback Verifying an Install Validation Postback.
-
Source apps - 展示廣告的App
添加network ID到info.plist
顯示經過ad network簽名的廣告
-
Advertised apps - 被廣告展示的App
SKAdNetwork APIs are designed to maintain user privacy. Apps don't need to use App Tracking Transparency before calling SKAdNetwork APIs, and can call these APIs regardless of their tracking authorization status. For more information about privacy, see User Privacy and Data Use.
ATT - AppTrackingTransparency
IDFA - Identifier For Advertising
IDFA 存儲在手機系統(tǒng)中,可被設備上的每個 APP 獲取,因此可以打通不同 APP 之間的廣告。這就相當于廣告追蹤,你所有的瀏覽歷史都有可能會別的商家利用,給你推相同或相似的廣告。
ATTrackingManager
open class func requestTrackingAuthorization(completionHandler completion: @escaping (ATTrackingManager.AuthorizationStatus) -> Void)
class var trackingAuthorizationStatus: ATTrackingManager.AuthorizationStatus
@available(iOS 14, *)
public enum AuthorizationStatus : UInt {
case notDetermined = 0
case restricted = 1
case denied = 2
case authorized = 3
}

1. SKStoreProductViewController -> loadProduct(withParameters:completionBlock:)
func loadProduct(withParametersparameters: [String : Any], completionBlockblock: ((Bool, Error?) -> Void)? = nil)
主要傳遞parameters包含SKStoreProductParameterITunesItemIdentifier,廣告應用的商店ID。
其它參數:
// iTunes Store item identifier (NSNumber) of the product
@available(iOS 6.0, *)
public let SKStoreProductParameterITunesItemIdentifier: String
// SKU for the In-App Purchase product (NSString) to render at the top of the product page
@available(iOS 11.0, *)
public let SKStoreProductParameterProductIdentifier: String
// iTunes Store affiliate token (NSString)
@available(iOS 8.0, *)
public let SKStoreProductParameterAffiliateToken: String
// iTunes Store affiliate campaign token (NSString)
@available(iOS 8.0, *)
public let SKStoreProductParameterCampaignToken: String
// Analytics provider token (NSString)
@available(iOS 8.3, *)
public let SKStoreProductParameterProviderToken: String
// Advertising partner token (NSString)
@available(iOS 9.3, *)
public let SKStoreProductParameterAdvertisingPartnerToken: String
// Advertising network's cryptographic signature for the atribution params (NSString)
@available(iOS 11.3, *)
public let SKStoreProductParameterAdNetworkAttributionSignature: String
// Advertising network campaign identifier (NSNumber)
@available(iOS 11.3, *)
public let SKStoreProductParameterAdNetworkCampaignIdentifier: String
// Advertising network identifier (NSString)
@available(iOS 11.3, *)
public let SKStoreProductParameterAdNetworkIdentifier: String
// Random entropy value for security (NSUUID)
@available(iOS 11.3, *)
public let SKStoreProductParameterAdNetworkNonce: String
// Timestamp for this ad impression (NSNumber)
@available(iOS 11.3, *)
public let SKStoreProductParameterAdNetworkTimestamp: String
// App Store item identifier of the source app (NSNumber)
@available(iOS 14.0, *)
public let SKStoreProductParameterAdNetworkSourceAppStoreIdentifier: String
@available(iOS 14.0, *)
public let SKStoreProductParameterAdNetworkVersion: String
2. SKAdNetwork
-> registerAppForAdNetworkAttribution()
-> updateConversionValue(_ conversionValue: Int)
在廣告主應用第一次調用registerAppForAdNetworkAttribution()后,會在24小時內的時間窗結束后,發(fā)送歸因的postback給adnetwork。如果在這個時間窗內,調用了updateConversionValues(_:)則將install postback事件再次推遲24小時(會延遲1天到64天之間,且最多傳64種轉化)。根據Singular的demo,該值在0-63。
@available(iOS 11.3, *)
open class SKAdNetwork : NSObject {
// Participating apps should call this on launch to complete the install+open action associated with a product view
@available(iOS 11.3, *)
open class func registerAppForAdNetworkAttribution()
@available(iOS 14.0, *)
open class func updateConversionValue(_ conversionValue: Int)
}
AppsFlyer 解決方案:
新增ATT權限獲取
func requestAppTrackingAuthorization() {
if #available(iOS 14.5, *) {
ATTrackingManager.requestTrackingAuthorization { (status) in
var permissionStatusStr = ""
switch status {
case .authorized:
permissionStatusStr = "authorized"
case .denied:
permissionStatusStr = "denied"
case .restricted:
permissionStatusStr = "restricted"
case .notDetermined:
permissionStatusStr = "notDetermined"
@unknown default:
permissionStatusStr = "unknown"
}
}
}
}
設置延遲方法
if #available(iOS 14.5, *) {
AppsFlyerLib.shared().waitForATTUserAuthorization(timeoutInterval: 60)
}
Other Tips
Build Phases -> Link Binary With Libraries -> optional