数据获取 - 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 helpful?

    Any questions or suggestions?