Как извлечь iPhone IDFA из API?

Я хотел бы получить устройство IDFA, Как получить эту информацию из официального API iOS?

12 ответов

Прежде всего:

#import <AdSupport/ASIdentifierManager.h> 

Если вы хотите получить его как NSString, используйте:

[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]

Так что ваш код может выглядеть так:

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

Сначала вы должны проверить , решил ли пользователь отказаться от отслеживания рекламы. Только если он позволил, вы можете использовать IDFA,

Вы можете проверить это, позвонив isAdvertisingTrackingEnabled метод ASIdentifierManager,

isAdvertisingTrackingEnabled

Проверьте значение этого свойства перед выполнением отслеживания рекламы. Если значение NOиспользуйте рекламный идентификатор только в следующих целях: ограничение частоты показов, события конверсии, оценка количества уникальных пользователей, обнаружение мошенничества и безопасности, а также отладка.

Следующий фрагмент кода показывает, как получить строковое значение 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
}

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
}

ASIdentifierManager - это официальный способ получения рекламного идентификационного номера с устройства под управлением iOS 6+. Ты можешь использовать -[[ASIdentifierManager sharedManager] advertisingIdentifier]; чтобы получить это.

Получить IDFA в Swift:

    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/

Свифт 3 и 4

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

Вот прокомментированный вспомогательный класс в 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
}

Обратите внимание, что в iOS 14 устарел. пожалуйста, используйте вместо.

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

Более хороший подход для получения IDFA или nil, если отслеживание отключено через настройку iOS, использует (личное) расширение:

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 ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
            return ASIdentifierManager.shared().advertisingIdentifier.uuidString
        }

        return nil        
}

Просто чтобы расширить ответ Amro Swift, вот похожий код, заключенный в метод:

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
     }
}
Другие вопросы по тегам