数据获取 - iOS

在 iOS 端收集 Airbridge 事件所需的数据。

数据获取(Fetching)

请参考以下内容。

Airbridge Device ID

Airbridge 的设备标识符。(示例:82A16EC9-A273-48B6-9BB2-017EAB641109)

iOS SDK (v4)

12345
import Airbridge

Airbridge.fetchDeviceUUID { deviceUUID in

}

iOS SDK (旧版本)

123
import AirBridge

AirBridge.deviceUUID

Airbridge Generated UUID

Airbridge 在安装时按设备生成的随机 UUID。(示例:82A16EC9-A273-48B6-9BB2-017EAB641109)

iOS SDK (v4)

12345
import Airbridge

Airbridge.fetchAirbridgeGeneratedUUID { airbridgeGeneratedUUID in

}

iOS SDK (旧版本)

12345
import AirBridge

AirBridge.fetchAirbridgeGeneratedUUID { uuid in

}

IDFA

Apple 发行的广告 ID。(示例:82A16EC9-A273-48B6-9BB2-017EAB641109)

123
import AdSupport

ASIdentifierManager.shared().advertisingIdentifier.uuidString

IDFV

用于子渠道识别特定用户安装了哪款 App 的唯一 ID。(示例:82A16EC9-A273-48B6-9BB2-017EAB641109)

1
UIDevice.current.identifierForVendor?.uuidString

Limit Ad Tracking

设备的 Limit Ad Tracking 信息。(示例:true)

123
import AdSupport

ASIdentifierManager.shared().isAdvertisingTrackingEnabled

Device Model

设备的型号名称。(示例:iPhone)

1
UIDevice.current.localizedModel

Device Identifier

设备的型号标识符。(示例:iPhone9,3)

1234
var systemInfo = utsname()
uname(&systemInfo)
        
return String(cString: &systemInfo.machine.0, encoding: .utf8)

Device Manufacturer

设备的制造商信息。(示例:Apple)

1
"Apple"

OS Name

设备的 OS 名称。(示例:iOS)

1
UIDevice.current.systemName

OS Version

设备的 OS 版本。(示例:13.3)

1
UIDevice.current.systemVersion

Locale

设备的 Locale 设置值。(示例:en-US)

1234567891011121314151617181920212223242526
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
}

Timezone

设备的时区设置值。(示例:US/Pacific)

1
TimeZone.current.description

Orientation

设备的屏幕方向值,可为 “portrait” 或 “landscape”。

12345
if UIDevice.current.orientation.isLandscape {
    return @"landscape"
} else {
    return @"portrait"
}

Screen Density

设备的实际屏幕密度值。(示例:3.000)

1
String(format: "%.3f", UIScreen.main.scale)

Screen Width

设备的实际屏幕宽度值。(示例:375.0)

1
String(format: "%.f", UIScreen.main.bounds.size.width)

Screen Height

设备的实际屏幕高度值。(示例:667.0)

1
String(format: "%.f", UIScreen.main.bounds.size.height)

Network Carrier

该设备的移动通讯运营商信息。

1234567891011
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
}

Cellular Status

该设备的移动数据使用状态。(示例:true)

12345678910111213141516171819202122232425262728293031323334353637383940414243
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 Status

该设备的 WiFi 数据使用状态。(示例:true)

12345678910111213141516171819202122232425262728293031323334353637383940414243
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
    }
}

Package Name

该 App 的包名。(示例:co.ab180.ablog)

1
Bundle.main.bundleIdentifier

Version

该 App 的版本名称。(示例:1.0.0)

1
Bundle.main.infoDictionary?["CFBundleShortVersionString"]

Event Timestamp

该事件的发送时间(Milliseconds)。(示例:1581043739682)

1
UInt64(Date().timeIntervalSince1970 * 1000)

Was this page helpful?

Have any questions or suggestions?