【问题标题】:How to retrieve iPhone IDFA from API?如何从 API 中检索 iPhone IDFA?
【发布时间】:2012-10-08 07:29:38
【问题描述】:

我想获得设备IDFA。如何从 iOS 官方 API 获取这些信息?

【问题讨论】:

标签: ios iphone tvos idfa


【解决方案1】:

首先:

#import <AdSupport/ASIdentifierManager.h> 

如果您想将其作为 NSString 获取,请使用:

[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]

所以您的代码可能如下所示:

NSString *idfaString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

【讨论】:

  • 记住:#import
  • @parsley72 你可以使用“@import AdSupport;”相反,因此您没有添加框架的额外步骤。编辑了答案以包含此内容。
  • 使用 Swift:import AdSupport,然后ASIdentifierManager.sharedManager().advertisingIdentifier 获取 IDFA!
  • 请注意,在 iOS 10 上,如果用户启用了限制广告跟踪,则此 IDFA 在物理设备上将全为零。 (在 Xcode 8 GM 种子的模拟器中,它似乎仍然返回任意 IDFA。)
  • 请注意,很快(截至 2020 年 9 月),您必须征得用户许可才能使用 IDFA。您必须使用 App Tracking Transparency 来执行此操作:developer.apple.com/documentation/apptrackingtransparency
【解决方案2】:

您首先必须检查用户是否决定退出广告跟踪。只有在他允许的情况下,您才能使用IDFA

你可以通过调用ASIdentifierManagerisAdvertisingTrackingEnabled方法来查看。

isAdvertisingTrackingEnabled

在执行任何广告之前检查此属性的值 追踪。如果值为NO,则仅将广告标识符用于 以下用途:频次上限、转化事件、 估计唯一用户的数量、安全性和欺诈检测, 和调试。

下面的代码sn -p展示了如何获取IDFA的字符串值。

ObjC

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

【讨论】:

  • 我是否必须为 AdMob 使用 IDFA?
【解决方案3】:

IDFA - 广告标识符

isAdvertisingTrackingEnabled -> trackingAuthorizationStatus

iOS v14 Apple 弃用了isAdvertisingTrackingEnabled,并将逻辑移至AppTrackingTransparency Framework。现在用户必须获得阅读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
}

【讨论】:

    【解决方案4】:

    ASIdentifierManager 是从运行 iOS 6+ 的设备获取广告识别号的官方方式。您可以使用-[[ASIdentifierManager sharedManager] advertisingIdentifier]; 获取。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          这里有一个注释的 Swift 中的帮助类,如果用户关闭了广告跟踪,它将为您提供一个 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
          }
          

          【讨论】:

          • 很酷,但是你不需要将IDFA用作单例,ASIdentifierManager已经是单例了,所以,只需将var作为类var即可直接使用它们
          【解决方案8】:

          Swift 3 和 4

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

          【讨论】:

            【解决方案9】:

            如果通过 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 
                }        
            }
            

            【讨论】:

              【解决方案10】:

              请注意,在 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
                  }
              }
              

              【讨论】:

                【解决方案11】:

                只是为了扩展 Amro 的 Swift 答案,下面是包装在方法中的类似代码:

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

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    猜你喜欢
                    • 2019-11-14
                    • 2021-11-13
                    • 2014-11-09
                    • 1970-01-01
                    • 2018-02-12
                    • 2012-11-21
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-01-11
                    相关资源
                    最近更新 更多