关闭

iOS网络(Swift)

1212人阅读 评论(1) 收藏 举报
分类:

//

//  NetworkStatus.swift

//

//  Created by A on 15/10/26.

//  Copyright © 2015 A. All rights reserved.

//


import Foundation

import CoreTelephony.CTTelephonyNetworkInfo

import SystemConfiguration.CaptiveNetwork

//import NetworkExtension.NEHotspotHelper


enum NetworkReachable {

    case CanReachable

    case NotReachable

}


enum NetworkType {

    case WiFi

    case Unknown

    case Cellular2G

    case Cellular3G

    case Cellular4G

}


struct NetworkStatus {

    

    func getCurrentWifiInfo() -> (String, String) {

        if let interfaces = CNCopySupportedInterfaces() {

            let if0: UnsafePointer<Void>? = CFArrayGetValueAtIndex(interfaces, 0)

            let interfaceName: CFStringRef = unsafeBitCast(if0!, CFStringRef.self)

            let ssidNSDic = CNCopyCurrentNetworkInfo(interfaceName) as NSDictionary?

            var ssid = String()

            var bssid = String()

            if ssidNSDic != nil { // 未连接WiFi的情况会返回nil

                ssid =  ssidNSDic!["SSID"] as! String

                bssid = ssidNSDic!["BSSID"] as! String

                return (bssid, ssid)

            } else {

                return ("", "")

            }

        }

        return ("", "")

    }

    

    /*

     * 在调用该接口之前一定要用isNetworkReachable()来确保有网络连接

     */

    func currentNetworkType() -> NetworkType {

        

        let networkType = CTTelephonyNetworkInfo().currentRadioAccessTechnology

        if networkType == nil { // 非蜂窝网络下会返回nil

            // 排除是WiFi还是无网络

            if isNetworkReachable() == .CanReachable { // 这下可以判断是Wifi

                return .WiFi

            } else {

                assert(false, "要是仅仅判断有无网络的话就用isNetworkReachable(),该接口是判断网络类型的,你应该在确保有网络的情况下调用该接口")

                return .Unknown

            }

            

        } else {

            switch networkType! {

            case CTRadioAccessTechnologyGPRS:

                return .Cellular2G

            case CTRadioAccessTechnologyEdge:

                return .Cellular2G // 2.75GEDGE网络

            case CTRadioAccessTechnologyWCDMA:

                return .Cellular3G

            case CTRadioAccessTechnologyHSDPA:

                return .Cellular3G // 3.5G网络

            case CTRadioAccessTechnologyHSUPA:

                return .Cellular3G // 3.5G网络

            case CTRadioAccessTechnologyCDMA1x:

                return .Cellular2G // CDMA2G网络

            case CTRadioAccessTechnologyCDMAEVDORev0,

                 CTRadioAccessTechnologyCDMAEVDORevA,

                 CTRadioAccessTechnologyCDMAEVDORevB:

                return .Cellular3G

            case CTRadioAccessTechnologyeHRPD:

                return .Cellular3G // 电信的怪胎,只能算3G

            case CTRadioAccessTechnologyLTE:

                return .Cellular4G

            default:

                return .Unknown

            }

        }

    }

    

    func isNetworkReachable() -> NetworkReachable {

        

        var isCellularReachable = false // wifi 是否连接了

        let networkType = CTTelephonyNetworkInfo().currentRadioAccessTechnology

        if networkType == nil { // 非蜂窝网络下会返回nil

            isCellularReachable = false

        } else {

            isCellularReachable = true

        }

        

        /*

         * there are total three condition

         * 1.not reachable, 2.cellular, 3.wifi

         */

        var isWifiReachable = false // wifi 是否连接了

        if let interfaces = CNCopySupportedInterfaces() {

            let if0: UnsafePointer<Void>? = CFArrayGetValueAtIndex(interfaces, 0)

            let interfaceName: CFStringRef = unsafeBitCast(if0!, CFStringRef.self)

            let ssidNSDic = CNCopyCurrentNetworkInfo(interfaceName) as NSDictionary?

            if ssidNSDic == nil {

                isWifiReachable = false

            } else {

                isWifiReachable = true

            }

        }

        

        if isCellularReachable == false && isWifiReachable == false { // 非蜂窝网络下会返回nil && 未连接WiFi的情况会返回nil

            return .NotReachable

        } else {

            return .CanReachable

        }

    }

    

    var reachable: NetworkReachable {

        get {

            return isNetworkReachable()

        }

    }

    

    var networkType: NetworkType {

        get {

            return currentNetworkType()

        }

    }

    

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11290次
    • 积分:436
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论