我想获得该设备
IDFA
。如何从iOS官方API获取这些信息?
首先,您必须征得用户的许可才能使用他们的 IDFA:
#import <AppTrackingTransparency/AppTrackingTransparency.h>
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
// Tracking authorization completed. Start loading ads here.
}];
此权限流程只会在第一次调用时运行一次,即使您重新启动应用程序和/或再次调用它也是如此。如果您想以不同的方式回答,则必须从设备或模拟器中完全删除该应用程序并重新安装。请注意,无论权限流的答案是什么,iOS 模拟器都会返回空白的 IDFA(全零)。请参阅https://developer.apple.com/documentation/apptrackingtransparency了解详细信息,包括如何自定义在要求跟踪用户时向用户显示的消息。请注意,许多广告 SDK 都有自己可以使用的同意流程调用。
获得许可后实际获取 IDFA:
#import <AdSupport/ASIdentifierManager.h>
如果您想将其作为 NSString 获取,请使用:
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]
所以你的代码可能如下所示:
NSString *idfaString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
NSLog (@"IDFA: %@", idfaString);
您首先必须检查用户是否决定退出广告跟踪。只有他允许你才可以使用
IDFA
。
可以通过调用
isAdvertisingTrackingEnabled
的ASIdentifierManager
方法来检查。
已启用广告跟踪
在进行任何广告之前检查该财产的价值 追踪。如果值为
,则仅将广告标识符用于 以下目的:频次上限、转化事件、 估计唯一用户的数量、安全和欺诈检测、 和调试。NO
以下代码片段展示了如何获取字符串值
IDFA
。
@import AdSupport;
- (NSString *)identifierForAdvertising {
// Check whether advertising tracking is enabled
if([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
NSUUID *identifier = [[ASIdentifierManager sharedManager] advertisingIdentifier];
return [identifier UUIDString];
}
// Get and return IDFA
return nil;
}
import AdSupport
func identifierForAdvertising() -> String? {
// Check whether advertising tracking is enabled
guard ASIdentifierManager.shared().isAdvertisingTrackingEnabled else {
return nil
}
// Get and return IDFA
return ASIdentifierManager.shared().advertisingIdentifier.uuidString
}
IDFA
- 广告标识符
isAdvertisingTrackingEnabled -> trackingAuthorizationStatus
isAdvertisingTrackingEnabled
并将逻辑移至 AppTrackingTransparency
框架。现在用户必须授予读取权限idfa
(与位置权限相同)
用户可以通过以下方式控制:
#iOS 13
#AdSupport
#ASIdentifierManager.shared().isAdvertisingTrackingEnabled
Settings -> Privacy -> Advertising -> Limit Ad Tracking
#iOS 14
#AppTrackingTransparency
#ATTrackingManager.trackingAuthorizationStatus
#a global flag
Settings -> Privacy -> Tracking -> `Allow Apps to Request to Track`
#or select an app from list to control every app separately
#a local flag
Settings -> <app_name> -> Allow Tracking
实施
import AppTrackingTransparency
import AdSupport
func getIDFA() -> String? {
// Check whether advertising tracking is enabled
if #available(iOS 14, *) {
if ATTrackingManager.trackingAuthorizationStatus != ATTrackingManager.AuthorizationStatus.authorized {
return nil
}
} else {
if ASIdentifierManager.shared().isAdvertisingTrackingEnabled == false {
return nil
}
}
return ASIdentifierManager.shared().advertisingIdentifier.uuidString
}
ASIdentifierManager 是从运行 iOS 6+ 的设备获取广告识别号的官方方法。您可以使用
-[[ASIdentifierManager sharedManager] advertisingIdentifier];
来获取它。
在 Swift 中获取 IDFA:
import AdSupport
...
let myIDFA: String?
// Check if Advertising Tracking is Enabled
if ASIdentifierManager.sharedManager().advertisingTrackingEnabled {
// Set the IDFA
myIDFA = ASIdentifierManager.sharedManager().advertisingIdentifier.UUIDString
} else {
myIDFA = nil
}
从 iOS 10 开始,当用户启用“限制广告跟踪”时,操作系统将发送带有新值“00000000-0000-0000-0000-000000000000”的广告标识符。
根据本文:https://fpf.org/2016/08/02/ios-10-feature-stronger-limit-ad-tracking/
这里有一个 Swift 中带注释的 helper 类,如果用户关闭了广告跟踪,它将为您提供一个 nil
对象作为标识符:
import AdSupport
class IDFA {
// MARK: - Stored Type Properties
static let shared = IDFA()
// MARK: - Computed Instance Properties
/// Returns `true` if the user has turned off advertisement tracking, else `false`.
var limited: Bool {
return !ASIdentifierManager.shared().isAdvertisingTrackingEnabled
}
/// Returns the identifier if the user has turned advertisement tracking on, else `nil`.
var identifier: String? {
guard !limited else { return nil }
return ASIdentifierManager.shared().advertisingIdentifier.uuidString
}
}
只需
将其添加到您的项目中(例如在名为 IDFA.swift
的文件中)并通过“常规设置”选项卡中的“链接的框架和库”部分将
AdSupport.framework
链接到您的目标中。然后你就可以
这样使用它:
if let identifier = IDFA.shared.identifier {
// use the identifier
} else {
// put any fallback logic in here
}
斯威夫特 3 和 4
var IDFA = String()
if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
IDFA = ASIdentifierManager.shared().advertisingIdentifier
}
ASIdentifierManager.shared().isAdvertisingTrackingEnabled
已被弃用。请使用
ATTrackingManager.trackingAuthorizationStatus == .authorized
代替。
import AdSupport
import AppTrackingTransparency
extension ASIdentifierManager {
//NOTE: if the user has enabled Limit Ad Tracking, this IDFA will be all zeros on a physical device
static var identifierForAdvertising: String {
// Check whether advertising tracking is enabled
if #available(iOS 14, *) {
guard ATTrackingManager.trackingAuthorizationStatus == .authorized else {
return ""
}
} else {
guard ASIdentifierManager.shared().isAdvertisingTrackingEnabled else {
return ""
}
}
// Get and return IDFA
return ASIdentifierManager.shared().advertisingIdentifier.uuidString
}
}
import AdSupport
class YourClass {
func printIDFA() {
print(ASIdentifierManager.shared().advertisingIdentifierIfPresent)
}
}
private extension ASIdentifierManager {
/// IDFA or nil if ad tracking is disabled via iOS system settings
var advertisingIdentifierIfPresent: String? {
if isAdvertisingTrackingEnabled {
return advertisingIdentifier.uuidString
}
return nil
}
}
import AdSupport
...
func provideIdentifierForAdvertisingIfAvailable() -> String? {
if ASIdentifierManager.sharedManager().advertisingTrackingEnabled {
return ASIdentifierManager.sharedManager().advertisingIdentifier?.UUIDString ?? nil
} else {
return nil
}
}
Swift 5封装:
import AdSupport
struct ID{
static var advertising: String? {
// Firstly, Check whether advertising tracking is enabled
guard ASIdentifierManager.shared().isAdvertisingTrackingEnabled else {
return nil
}
// Then, Get and return IDFA
return ASIdentifierManager.shared().advertisingIdentifier.uuidString
}
}
import SwiftUI
import AdSupport
import AppTrackingTransparency
struct ContentView: View {
@State var idfa: UUID!
var body: some View {
VStack {
Button("Get IDFA"){
idfa = ASIdentifierManager.shared().advertisingIdentifier
print(idfa!)
}
if let idfa{
Text("\(idfa)")
}
}
.padding()
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in })
}
}
}
#Preview {
ContentView()
}
您必须更新 Info.plist 并添加跟踪使用说明:
<key>NSUserTrackingUsageDescription</key>
<string>This identifier will be used to deliver personalized ads to you.</string>