에어브릿지 이벤트 구성에 필요한 데이터를 iOS에서 수집합니다.
아래 내용을 참고해 주세요.
Airbridge의 기기 식별자 입니다. (예시: 82A16EC9-A273-48B6-9BB2-017EAB641109)
import Airbridge
Airbridge.fetchDeviceUUID { deviceUUID in
}#import <Airbridge/Airbridge.h>
[Airbridge fetchDeviceUUID:^(NSString * _Nonnull deviceUUID) {
}];import AirBridge
AirBridge.deviceUUID#import <AirBridge/AirBridge.h>
AirBridge.deviceUUID;Airbridge에서 기기별로 인스톨시에 부여하는 랜덤한 UUID 입니다. (예시: 82A16EC9-A273-48B6-9BB2-017EAB641109)
import Airbridge
Airbridge.fetchAirbridgeGeneratedUUID { airbridgeGeneratedUUID in
}    #import <Airbridge/Airbridge.h>
    [Airbridge fetchAirbridgeGeneratedUUID:^(NSString * _Nonnull airbridgeGeneratedUUID) {
        
    }];import AirBridge
AirBridge.fetchAirbridgeGeneratedUUID { uuid in
}    #import <AirBridge/AirBridge.h>
    [AirBridge fetchAirbridgeGeneratedUUID:^(NSString * _Nonnull uuid) {
        
    }];애플에서 발급하는 Advertising ID 입니다. (예시: 82A16EC9-A273-48B6-9BB2-017EAB641109)
import AdSupport
ASIdentifierManager.shared().advertisingIdentifier.uuidString#import <AdSupport/AdSupport.h>
ASIdentifierManager.sharedManager.advertisingIdentifier.UUIDString;퍼블리셔가 특정 사용자가 어떤 앱을 설치했는지 파악하는 데 사용할 수 있는 고유 ID 입니다. (예시: 82A16EC9-A273-48B6-9BB2-017EAB641109)
UIDevice.current.identifierForVendor?.uuidStringUIDevice.currentDevice.identifierForVendor.UUIDString;기기의 Limit AD Tracking 정보 입니다. (예시: true)
import AdSupport
ASIdentifierManager.shared().isAdvertisingTrackingEnabled#import <AdSupport/AdSupport.h>
ASIdentifierManager.sharedManager.advertisingTrackingEnabled;기기의 모델 이름 입니다. (예시: iPhone)
UIDevice.current.localizedModelUIDevice.currentDevice.localizedModel;기기의 모델 식별자 입니다. (예시: iPhone9,3)
var systemInfo = utsname()
uname(&systemInfo)
        
return String(cString: &systemInfo.machine.0, encoding: .utf8)#import <sys/utsname.h>
struct utsname systemInfo;
uname(&systemInfo);
        
return [NSString stringWithCString:systemInfo.machine
                          encoding:NSUTF8StringEncoding];기기의 제조사 정보 입니다. (예시: Apple)
"Apple"@"Apple"기기의 OS 이름입니다. (예시: iOS)
UIDevice.current.systemNameUIDevice.currentDevice.systemName;기기의 OS 버전입니다. (예시: 13.3)
UIDevice.current.systemVersionUIDevice.currentDevice.systemVersion;기기의 Locale 설정 값 입니다. (예시: en-US)
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
}+ (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];
}기기의 Timezone 설정 값 입니다. (예시: US/Pacific)
TimeZone.current.descriptionNSTimeZone.systemTimeZone.name;기기의 화면 방향 값 입니다. "portrait" 혹은 "landscape" 둘 중 하나의 값 입니다. (예시: portrait)
if UIDevice.current.orientation.isLandscape {
    return @"landscape"
} else {
    return @"portrait"
}UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIInterfaceOrientationIsLandscape(orientation))
    return @"landscape";
else
    return @"portrait";기기의 실제 화면 Density 값 입니다. (예시: 3.000)
String(format: "%.3f", UIScreen.main.scale)[NSString stringWithFormat:@"%.3f", UIScreen.mainScreen.scale];기기의 실제 화면 너비 값 입니다. (예시: 375.0)
String(format: "%.f", UIScreen.main.bounds.size.width)[NSString stringWithFormat:@"%.f", UIScreen.mainScreen.bounds.size.width];기기의 실제 화면 높이 값 입니다. (예시: 667.0)
String(format: "%.f", UIScreen.main.bounds.size.height)[NSString stringWithFormat:@"%.f", UIScreen.mainScreen.bounds.size.height];해당 기기의 네트워크 사업자 정보 입니다.
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
}#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;
}해당 기기의 모바일 데이터 사용 여부 입니다. (예시: true)
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
    }
}#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;
    }
}해당 기기의 Wifi 데이 사용 여부 입니다. (예시: true)
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
    }
}#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;
    }
}해당 어플리케이션의 패키지 명 입니다. (예시: co.ab180.ablog)
Bundle.main.bundleIdentifierNSBundle.mainBundle.bundleIdentifier;해당 어플리케이션의 버전 이름 입니다. (예시: 1.0.0)
Bundle.main.infoDictionary?["CFBundleShortVersionString"][NSBundle.mainBundle.infoDictionary objectForKey:@"CFBundleShortVersionString"];해당 이벤트의 발송 시간(Milliseconds) 입니다. (예시: 1581043739682)
UInt64(Date().timeIntervalSince1970 * 1000)[NSNumber numberWithUnsignedLongLong:NSDate.date.timeIntervalSince1970 * 1000];도움이 되었나요?