如何从API检索iPhone IDFA?

问题描述 投票:0回答:13

我想获得该设备

IDFA
。如何从iOS官方API获取这些信息?

ios iphone tvos idfa
13个回答
100
投票

首先,您必须征得用户的许可才能使用他们的 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);

86
投票

您首先必须检查用户是否决定退出广告跟踪。只有他允许你才可以使用

IDFA

可以通过调用

isAdvertisingTrackingEnabled
ASIdentifierManager
方法来检查。

已启用广告跟踪

在进行任何广告之前检查该财产的价值 追踪。如果值为

NO
,则仅将广告标识符用于 以下目的:频次上限、转化事件、 估计唯一用户的数量、安全和欺诈检测、 和调试。

以下代码片段展示了如何获取字符串值

IDFA

对象C

@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
}

23
投票

IDFA
- 广告标识符

isAdvertisingTrackingEnabled -> trackingAuthorizationStatus

iOS v14 Apple 弃用了

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
}

14
投票

ASIdentifierManager 是从运行 iOS 6+ 的设备获取广告识别号的官方方法。您可以使用

-[[ASIdentifierManager sharedManager] advertisingIdentifier];
来获取它。


12
投票

在 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
    }

7
投票

从 iOS 10 开始,当用户启用“限制广告跟踪”时,操作系统将发送带有新值“00000000-0000-0000-0000-000000000000”的广告标识符。

根据本文:https://fpf.org/2016/08/02/ios-10-feature-stronger-limit-ad-tracking/


6
投票

这里有一个 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 }
    

6
投票

斯威夫特 3 和 4

var IDFA = String() if ASIdentifierManager.shared().isAdvertisingTrackingEnabled { IDFA = ASIdentifierManager.shared().advertisingIdentifier }
    

4
投票
请注意,在 iOS 14 中,

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 } }
    

2
投票
如果通过 iOS 设置禁用跟踪,则获取 IDFA 或 nil 的更好方法是使用(私有)扩展:

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 } }
    

1
投票
为了扩展 Amro 的 Swift 答案,这里有一个方法中包含的类似代码:

import AdSupport ... func provideIdentifierForAdvertisingIfAvailable() -> String? { if ASIdentifierManager.sharedManager().advertisingTrackingEnabled { return ASIdentifierManager.sharedManager().advertisingIdentifier?.UUIDString ?? nil } else { return nil } }
    

0
投票

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 } }
    

0
投票
这是一个完整的SwiftUI程序。

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>
    
© www.soinside.com 2019 - 2024. All rights reserved.