Я хотел бы получить устройство IDFA
. Как получить эту информацию из официального API iOS?
Как получить iPhone IDFA из API?
Ответы (12)
Прежде всего:
#import <AdSupport/ASIdentifierManager.h>
Если вы хотите получить его как NSString, используйте:
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]
Таким образом, ваш код может выглядеть так:
NSString *idfaString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
import AdSupport
, затем ASIdentifierManager.sharedManager().advertisingIdentifier
, чтобы получить IDFA!
- person nodebase; 13.09.2016
Сначала необходимо проверить, не решил ли пользователь отказаться от отслеживания рекламы. Только если он это разрешил, вы можете использовать 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
}
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
}
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
}
Начиная с iOS 10, когда пользователь включает «Ограничить отслеживание рекламы», ОС будет отправлять рекламный идентификатор с новым значением «00000000-0000-0000-0000-000000000000».
Согласно этой статье: https://fpf.org/2016/08/02/ios-10-feature-stronger-limit-ad-tracking/
Вот прокомментированный вспомогательный класс в 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
}
Свифт 3 и 4
var IDFA = String()
if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
IDFA = ASIdentifierManager.shared().advertisingIdentifier
}
Более удобный способ получить 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
}
}
Просто чтобы расширить ответ 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
}
}
Обратите внимание, что в 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
}
}