Как получить iPhone IDFA из API?

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


person fvisticot    schedule 17.10.2012    source источник
comment
Обратите внимание, что теперь Apple не рекомендует использовать IDFA в приложениях без рекламы: github. com/mixpanel/mixpanel-iphone/issues/109   -  person Louis St-Amour    schedule 02.02.2014


Ответы (12)


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

#import <AdSupport/ASIdentifierManager.h> 

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

[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]

Таким образом, ваш код может выглядеть так:

NSString *idfaString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
person Zachary Drake    schedule 03.10.2013
comment
Помните: #import ‹AdSupport/ASIdentifierManager.h› - person parsley72; 09.12.2013
comment
@parsley72 вы можете использовать @import AdSupport; вместо этого у вас нет дополнительного шага по добавлению фреймворка. Отредактировал ответ, чтобы включить это. - person vinnybad; 12.10.2015
comment
Используя Swift: import AdSupport, затем ASIdentifierManager.sharedManager().advertisingIdentifier, чтобы получить IDFA! - person nodebase; 13.09.2016
comment
Обратите внимание, что в iOS 10, если пользователь включил ограничение отслеживания рекламы, этот IDFA будет состоять из нулей на физическом устройстве. (В симуляторе с семенем Xcode 8 GM он по-прежнему возвращает произвольный IDFA.) - person Zachary Drake; 14.09.2016
comment
Обратите внимание, что вскоре (по состоянию на сентябрь 2020 г.) вам придется запрашивать у пользователя разрешение на использование IDFA. Для этого необходимо использовать прозрачность отслеживания приложений: developer.apple.com/documentation/apptrackingtransparency. - person Zachary Drake; 14.09.2020

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

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

отслеживание рекламы включено

Проверьте значение этого свойства, прежде чем выполнять какое-либо отслеживание рекламы. Если значение равно 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
}
person Rafa de King    schedule 22.04.2014
comment
Нужно ли использовать IDFA для AdMob? - person Roger C S Wernersson; 09.01.2015

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

person CodaFi    schedule 17.10.2012

Получите 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
    }
person Amr Hossam    schedule 23.04.2015

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
}
person yoAlex5    schedule 21.09.2020

Начиная с iOS 10, когда пользователь включает «Ограничить отслеживание рекламы», ОС будет отправлять рекламный идентификатор с новым значением «00000000-0000-0000-0000-000000000000».

Согласно этой статье: https://fpf.org/2016/08/02/ios-10-feature-stronger-limit-ad-tracking/

person Vlad    schedule 09.09.2016

Вот прокомментированный вспомогательный класс в 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
}
person Jeehut    schedule 06.02.2017
comment
круто, но вам не нужно использовать IDFA как синглтон, ASIdentifierManager уже является синглтоном, поэтому просто сделайте var как класс var, чтобы использовать их напрямую - person busta117; 21.11.2018

Свифт 3 и 4

var IDFA = String()
if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
            IDFA = ASIdentifierManager.shared().advertisingIdentifier
}
person Oscar Falmer    schedule 31.07.2017

Более удобный способ получить IDFA или ноль, если отслеживание отключено с помощью настройки 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 isAdvertisingTrackingEnabled {
            return advertisingIdentifier.uuidString
        }

        return nil 
    }        
}
person Jochen Holzer    schedule 16.11.2018

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

import AdSupport

...

func provideIdentifierForAdvertisingIfAvailable() -> String? {
    if ASIdentifierManager.sharedManager().advertisingTrackingEnabled {
      return ASIdentifierManager.sharedManager().advertisingIdentifier?.UUIDString ?? nil
    } else {
      return nil
    }
  }
person worthbak    schedule 24.09.2015

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
     }
}
person black_pearl    schedule 30.04.2020

Обратите внимание, что в 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
    }
}
person yonivav    schedule 26.07.2021