에어브릿지 이벤트 구성에 필요한 데이터를 iOS에서 수집합니다.
아래 내용을 참고해 주세요.
에어브릿지가 제공하는 디바이스 식별자입니다. 타입은 NSString*입니다.
예시) 82a16ec9-a273-48b6-9bb2-017eab641109
#import <AirBridge/AirBridge.h>
AirBridge.deviceUUID;
import AirBridge
AirBridge.deviceUUID
에어브릿지에서 디바이스별로 앱 설치 이벤트가 발생하면 부여하는 임의의 UUID입니다. UUID 버전4 형식입니다. 타입은 NSString*입니다.
예시) 82a16ec9-a273-48b6-9bb2-017eab641109
#import <AirBridge/AirBridge.h>
[AirBridge fetchAirbridgeGeneratedUUID:^(NSString * _Nonnull uuid) {
}];
import AirBridge
AirBridge.fetchAirbridgeGeneratedUUID { uuid in
}
애플이 제공하는 광고 식별자입니다. 타입은 NSString*입니다.
예시) 82a16ec9-a273-48b6-9bb2-017eab641109
#import <AdSupport/AdSupport.h>
ASIdentifierManager.sharedManager.advertisingIdentifier.UUIDString;
import AdSupport
ASIdentifierManager.shared().advertisingIdentifier.uuidString
애플이 제공하는 광고 식별자로 IFV라고 표기되기도 합니다. 타입은 NSString*입니다.
예시) 82a16ec9-a273-48b6-9bb2-017eab641109
UIDevice.currentDevice.identifierForVendor.UUIDString;
UIDevice.current.identifierForVendor?.uuidString
LAT(Limit AD Tracking)에 따른 광고 추적 제한 여부입니다. 타입은 boolean입니다.
#import <AdSupport/AdSupport.h>
ASIdentifierManager.sharedManager.advertisingTrackingEnabled;
import AdSupport
ASIdentifierManager.shared().isAdvertisingTrackingEnabled
디바이스 모델 이름입니다. 타입은 NSString*입니다.
예시) iPhone
UIDevice.currentDevice.localizedModel;
UIDevice.current.localizedModel
디바이스 식별자입니다. 타입은 NSString*입니다.
예시) iPhone9,3
#import <sys/utsname.h>
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
var systemInfo = utsname()
uname(&systemInfo)
return String(cString: &systemInfo.machine.0, encoding: .utf8)
디바이스 제조사입니다. 타입은 NSString*입니다.
예시) Apple
@"Apple"
"Apple"
운영체제(OS) 이름입니다. 타입은 NSString*입니다.
예시) iOS
UIDevice.currentDevice.systemName;
UIDevice.current.systemName
운영체제(OS) 이름 버전입니다. 타입은 NSString*입니다.
예시) 13.3
UIDevice.currentDevice.systemVersion;
UIDevice.current.systemVersion
디바이스 위치입니다. 타입은 NSString*입니다.
예시) ko-KR
+ (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];
}
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*입니다.
예시) Asia/Seoul
NSTimeZone.systemTimeZone.name;
TimeZone.current.description
디바이스 방향입니다. 타입은 NSString*입니다.
예시) portrait
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIInterfaceOrientationIsLandscape(orientation))
return @"landscape";
else
return @"portrait";
if UIDevice.current.orientation.isLandscape {
return @"landscape"
} else {
return @"portrait"
}
디바이스 화면의 밀도입니다. 타입은 NSString*입니다.
예시) 3.000
[NSString stringWithFormat:@"%.3f", UIScreen.mainScreen.scale];
String(format: "%.3f", UIScreen.main.scale)
디바이스 화면의 세로 길이입니다. 타입은 NSString*입니다.
예시) 667.0
[NSString stringWithFormat:@"%.f", UIScreen.mainScreen.bounds.size.height];
String(format: "%.f", UIScreen.main.bounds.size.height)
디바이스 화면의 가로 길이입니다. 타입은 NSString*입니다.
예시) 375.0
[NSString stringWithFormat:@"%.f", UIScreen.mainScreen.bounds.size.width];
String(format: "%.f", UIScreen.main.bounds.size.width)
네트워크 사업자 정보를 확인할 수 있습니다. 타입은 NSString*입니다.
#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;
}
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
}
디바이스의 데이터 사용 상태입니다. 타입은 boolean입니다.
#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;
}
}
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
}
}
WiFi 사용 여부를 확인할 수 있습니다. 타입은 boolean입니다.
#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;
}
}
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
}
}
애플리케이션 패키지 이름입니다. 타입은 NSString*입니다.
NSBundle.mainBundle.bundleIdentifier;
Bundle.main.bundleIdentifier
애플리케이션 버전입니다. 타입은 NSString*입니다.
[NSBundle.mainBundle.infoDictionary objectForKey:@"CFBundleShortVersionString"];
Bundle.main.infoDictionary?["CFBundleShortVersionString"]
이벤트 발생 시간입니다. 타입은 NSNumber*입니다.
예시) 1581043739682
[NSNumber numberWithUnsignedLongLong:NSDate.date.timeIntervalSince1970 * 1000];
UInt64(Date().timeIntervalSince1970 * 1000)
도움이 되었나요?