> ## Documentation Index
> Fetch the complete documentation index at: https://help.airbridge.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 데이터 패칭 - iOS

에어브릿지 이벤트 구성에 필요한 데이터를 iOS에서 수집합니다.

## 데이터 패칭하기

아래 내용을 참고해 주세요.

### Airbridge Device ID

Airbridge의 기기 식별자 입니다. (예시: 82A16EC9-A273-48B6-9BB2-017EAB641109)

#### iOS SDK

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import Airbridge

  Airbridge.fetchDeviceUUID { deviceUUID in

  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <Airbridge/Airbridge.h>

  [Airbridge fetchDeviceUUID:^(NSString * _Nonnull deviceUUID) {

  }];
  ```
</CodeGroup>

#### iOS SDK (Deprecated)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import AirBridge

  AirBridge.deviceUUID
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/AirBridge.h>

  AirBridge.deviceUUID;
  ```
</CodeGroup>

### Airbridge Generated UUID

Airbridge에서 기기별로 인스톨시에 부여하는 랜덤한 UUID 입니다. (예시: 82A16EC9-A273-48B6-9BB2-017EAB641109)

#### iOS SDK

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import Airbridge

  Airbridge.fetchAirbridgeGeneratedUUID { airbridgeGeneratedUUID in

  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      #import <Airbridge/Airbridge.h>

      [Airbridge fetchAirbridgeGeneratedUUID:^(NSString * _Nonnull airbridgeGeneratedUUID) {
          
      }];
  ```
</CodeGroup>

#### iOS SDK (Deprecated)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import AirBridge

  AirBridge.fetchAirbridgeGeneratedUUID { uuid in

  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      #import <AirBridge/AirBridge.h>

      [AirBridge fetchAirbridgeGeneratedUUID:^(NSString * _Nonnull uuid) {
          
      }];
  ```
</CodeGroup>

### ATT (App Tracking Transparency)

iOS 14.5 이상에서 앱이 사용자를 추적하려면 명시적인 사용자 동의가 필요합니다. ATT(App Tracking Transparency)는 Apple이 도입한 개인정보 보호 프레임워크로, 사용자가 앱의 추적 허용 여부를 직접 선택할 수 있도록 합니다.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import AppTrackingTransparency

  let status = ATTrackingManager.trackingAuthorizationStatus

  switch status {
  case .notDetermined:
      // User has not yet made a decision - popup can be shown
  case .authorized:
      // Tracking permission granted
  case .denied:
      // Tracking permission denied
  case .restricted:
      // Tracking is restricted (by device settings)
  @unknown default:
      break
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AppTrackingTransparency/AppTrackingTransparency.h>

  ATTrackingManagerAuthorizationStatus status = [ATTrackingManager trackingAuthorizationStatus];

  switch (status) {
      case ATTrackingManagerAuthorizationStatusNotDetermined:
          // User has not yet made a decision - popup can be shown
          break;
      case ATTrackingManagerAuthorizationStatusAuthorized:
          // Tracking permission granted
          break;
      case ATTrackingManagerAuthorizationStatusDenied:
          // Tracking permission denied
          break;
      case ATTrackingManagerAuthorizationStatusRestricted:
          // Tracking is restricted (by device settings)
          break;
  }
  ```
</CodeGroup>

### IDFA

애플에서 발급하는 Advertising ID 입니다. (예시: 82A16EC9-A273-48B6-9BB2-017EAB641109)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import AdSupport

  ASIdentifierManager.shared().advertisingIdentifier.uuidString
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AdSupport/AdSupport.h>

  ASIdentifierManager.sharedManager.advertisingIdentifier.UUIDString;
  ```
</CodeGroup>

### IDFV

퍼블리셔가 특정 사용자가 어떤 앱을 설치했는지 파악하는 데 사용할 수 있는 고유 ID 입니다. (예시: 82A16EC9-A273-48B6-9BB2-017EAB641109)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UIDevice.current.identifierForVendor?.uuidString
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UIDevice.currentDevice.identifierForVendor.UUIDString;
  ```
</CodeGroup>

### Limit AD Tracking

기기의 Limit AD Tracking 정보 입니다. (예시: true)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import AdSupport

  ASIdentifierManager.shared().isAdvertisingTrackingEnabled
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AdSupport/AdSupport.h>

  ASIdentifierManager.sharedManager.advertisingTrackingEnabled;
  ```
</CodeGroup>

### Device Model

기기의 모델 이름 입니다. (예시: iPhone)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UIDevice.current.localizedModel
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UIDevice.currentDevice.localizedModel;
  ```
</CodeGroup>

### Device Identifier

기기의 모델 식별자 입니다. (예시: iPhone9,3)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  var systemInfo = utsname()
  uname(&systemInfo)
          
  return String(cString: &systemInfo.machine.0, encoding: .utf8)
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <sys/utsname.h>

  struct utsname systemInfo;
  uname(&systemInfo);
          
  return [NSString stringWithCString:systemInfo.machine
                            encoding:NSUTF8StringEncoding];
  ```
</CodeGroup>

### Device Manufacturer

기기의 제조사 정보 입니다. (예시: Apple)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  "Apple"
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  @"Apple"
  ```
</CodeGroup>

### OS Name

기기의 OS 이름입니다. (예시: iOS)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UIDevice.current.systemName
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UIDevice.currentDevice.systemName;
  ```
</CodeGroup>

### OS Version

기기의 OS 버전입니다. (예시: 13.3)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UIDevice.current.systemVersion
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UIDevice.currentDevice.systemVersion;
  ```
</CodeGroup>

### Locale

기기의 Locale 설정 값 입니다. (예시: en-US)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func getSystemLocale() -> String? {
      guard let language = getSystemLanguage() else { return nil }
      guard let country = getSystemCountry() else { return nil }
      
      return "\(language)-\(country)"
  }

  func getSystemLanguage() -> String? {
      let languages = Locale.preferredLanguages
      
      if languages.count < 1 {
          return nil
      }
      
      let languageSource = languages[0]
      
      guard let barIndex = languageSource.range(of: "-") else {
          return languageSource
      }
      
      return String(languageSource[..<barIndex.lowerBound])
  }

  func getSystemCountry() -> String? {
      return Locale.autoupdatingCurrent.regionCode
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  + (NSString *)getSystemLocale {
      NSString* language = [#ClassName# getSystemLanguage];
      NSString* country = [#ClassName# getSystemCountry];
      if(language == nil || country == nil) {
          return nil;
      }
      return [NSString stringWithFormat:@"%@-%@", language, country];
  }

  + (NSString*) getSystemLanguage {
      NSArray* preferredLanguages = NSLocale.preferredLanguages;
      if (preferredLanguages.count < 1) {
          return nil;
      }
      NSString* languageSource = preferredLanguages[0];
      if (languageSource == nil) {
          return nil;
      }
      NSRange barIndex = [languageSource rangeOfString:@"-"];
      if (barIndex.location != NSNotFound) {
          languageSource = [languageSource substringToIndex:barIndex.location];
      }
      return languageSource;
  }

  + (NSString*) getSystemCountry {
      NSLocale* locale = NSLocale.autoupdatingCurrentLocale;
      if (locale == nil) {
          return nil;
      }
      return [locale objectForKey:NSLocaleCountryCode];
  }
  ```
</CodeGroup>

### Timezone

기기의 Timezone 설정 값 입니다. (예시: US/Pacific)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  TimeZone.current.description
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  NSTimeZone.systemTimeZone.name;
  ```
</CodeGroup>

### Orientation

기기의 화면 방향 값 입니다. "portrait" 혹은 "landscape" 둘 중 하나의 값 입니다. (예시: portrait)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  if UIDevice.current.orientation.isLandscape {
      return @"landscape"
  } else {
      return @"portrait"
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
  if (UIInterfaceOrientationIsLandscape(orientation))
      return @"landscape";
  else
      return @"portrait";
  ```
</CodeGroup>

### Screen Density

기기의 실제 화면 Density 값 입니다. (예시: 3.000)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  String(format: "%.3f", UIScreen.main.scale)
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [NSString stringWithFormat:@"%.3f", UIScreen.mainScreen.scale];
  ```
</CodeGroup>

### Screen Width

기기의 실제 화면 너비 값 입니다. (예시: 375.0)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  String(format: "%.f", UIScreen.main.bounds.size.width)
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [NSString stringWithFormat:@"%.f", UIScreen.mainScreen.bounds.size.width];
  ```
</CodeGroup>

### Screen Height

기기의 실제 화면 높이 값 입니다. (예시: 667.0)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  String(format: "%.f", UIScreen.main.bounds.size.height)
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [NSString stringWithFormat:@"%.f", UIScreen.mainScreen.bounds.size.height];
  ```
</CodeGroup>

### Network Carrier

해당 기기의 네트워크 사업자 정보 입니다.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import CoreTelephony

  let info = CTTelephonyNetworkInfo()

  if #available(iOS 12.1, *) {
      let providers = info.serviceSubscriberCellularProviders
      return providers?.values.first?.carrierName
  } else {
      let provider = info.subscriberCellularProvider
      return provider?.carrierName
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <CoreTelephony/CTCarrier.h>
  #import <CoreTelephony/CTTelephonyNetworkInfo.h>

  CTTelephonyNetworkInfo* networkInfo = [[CTTelephonyNetworkInfo alloc] init];

  if (@available(iOS 12.1, *)) {
      NSDictionary<NSString*, CTCarrier*>* providers = [networkInfo serviceSubscriberCellularProviders];
      return providers.allValues.firstObject.carrierName;
  } else {
      CTCarrier* provider = [networkInfo subscriberCellularProvider];
      return provider.carrierName;
  }
  ```
</CodeGroup>

### Cellular Status

해당 기기의 모바일 데이터 사용 여부 입니다. (예시: true)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import SystemConfiguration

  func isCellular() -> Bool {
      return network() == .cellular
  }

  enum Network {
      case wifi
      case cellular
      case none
  }

  func getNetworkInfo() -> Network {
      var zeroAddress = sockaddr()
      bzero(&zeroAddress, MemoryLayout.size(ofValue: zeroAddress))
      zeroAddress.sa_len = __uint8_t(MemoryLayout.size(ofValue: zeroAddress))
      zeroAddress.sa_family = sa_family_t(AF_INET)

      guard let reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, &zeroAddress) else {
          return .none
      }

      var flags = SCNetworkReachabilityFlags()
      if !SCNetworkReachabilityGetFlags(reachability, &flags) {
          return .none
      }

      if !flags.contains(.reachable) {
          return .none
      }

      if flags.contains(.connectionRequired)
          && !((flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic))
              && !flags.contains(.interventionRequired)) {
          return .none
      }
      
      if flags.contains(.isWWAN) {
          return .cellular
      } else {
          return .wifi
      }
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <SystemConfiguration/SystemConfiguration.h>
  #import <netinet/in.h>

  + (BOOL) isCellular {
      return [#ClassName# getNetworkInfo] == CELLULAR;
  }

  typedef enum : NSInteger {
      WIFI,
      CELLULAR,
      NONE
  } ABNetwork;

  + (ABNetwork) getNetworkInfo {
      struct sockaddr_in zeroAddress;
      bzero(&zeroAddress, sizeof(zeroAddress));
      zeroAddress.sin_len = sizeof(zeroAddress);
      zeroAddress.sin_family = AF_INET;
      SCNetworkReachabilityRef reachability
          = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress);
      if (reachability == nil) {
          return NONE;
      }
      SCNetworkReachabilityFlags flags;
      if (!SCNetworkReachabilityGetFlags(reachability, &flags)) {
          return NONE;
      }
      if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) {
          return NONE;
      }
      if (((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0)
          && !(((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0 || (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)
               && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0))
      {
          return NONE;
      }
      if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) {
          return CELLULAR;
      } else {
          return WIFI;
      }
  }
  ```
</CodeGroup>

### WiFi Status

해당 기기의 Wifi 데이 사용 여부 입니다. (예시: true)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import SystemConfiguration

  func isWifi() -> Bool {
      return network() == .wifi
  }

  enum Network {
      case wifi
      case cellular
      case none
  }

  func getNetworkInfo() -> Network {
      var zeroAddress = sockaddr()
      bzero(&zeroAddress, MemoryLayout.size(ofValue: zeroAddress))
      zeroAddress.sa_len = __uint8_t(MemoryLayout.size(ofValue: zeroAddress))
      zeroAddress.sa_family = sa_family_t(AF_INET)

      guard let reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, &zeroAddress) else {
          return .none
      }

      var flags = SCNetworkReachabilityFlags()
      if !SCNetworkReachabilityGetFlags(reachability, &flags) {
          return .none
      }

      if !flags.contains(.reachable) {
          return .none
      }

      if flags.contains(.connectionRequired)
          && !((flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic))
              && !flags.contains(.interventionRequired)) {
          return .none
      }
      
      if flags.contains(.isWWAN) {
          return .cellular
      } else {
          return .wifi
      }
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <SystemConfiguration/SystemConfiguration.h>
  #import <netinet/in.h>

  + (BOOL) isWifi {
      return [#ClassName# getNetworkInfo] == WIFI;
  }

  typedef enum : NSInteger {
      WIFI,
      CELLULAR,
      NONE
  } ABNetwork;

  + (ABNetwork) getNetworkInfo {
      struct sockaddr_in zeroAddress;
      bzero(&zeroAddress, sizeof(zeroAddress));
      zeroAddress.sin_len = sizeof(zeroAddress);
      zeroAddress.sin_family = AF_INET;
      SCNetworkReachabilityRef reachability
          = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress);
      if (reachability == nil) {
          return NONE;
      }
      SCNetworkReachabilityFlags flags;
      if (!SCNetworkReachabilityGetFlags(reachability, &flags)) {
          return NONE;
      }
      if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) {
          return NONE;
      }
      if (((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0)
          && !(((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0 || (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)
               && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0))
      {
          return NONE;
      }
      if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) {
          return CELLULAR;
      } else {
          return WIFI;
      }
  }
  ```
</CodeGroup>

### Package Name

해당 어플리케이션의 패키지 명 입니다. (예시: co.ab180.ablog)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  Bundle.main.bundleIdentifier
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  NSBundle.mainBundle.bundleIdentifier;
  ```
</CodeGroup>

### Version

해당 어플리케이션의 버전 이름 입니다. (예시: 1.0.0)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  Bundle.main.infoDictionary?["CFBundleShortVersionString"]
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [NSBundle.mainBundle.infoDictionary objectForKey:@"CFBundleShortVersionString"];
  ```
</CodeGroup>

### Event Timestamp

해당 이벤트의 발송 시간(Milliseconds) 입니다. (예시: 1581043739682)

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  UInt64(Date().timeIntervalSince1970 * 1000)
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [NSNumber numberWithUnsignedLongLong:NSDate.date.timeIntervalSince1970 * 1000];
  ```
</CodeGroup>

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/fetching-guide-for-ios-sdk" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/fetching-guide-for-ios-sdk" />
