iOS网络(Swift)

原创 2015年11月17日 20:59:54

//

//  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()

        }

    }

    

}

iOS开发 - Swift实现检测网络连接状态及网络类型

一、前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要。本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络、Wifi)。 二、如何实现Reachabil...

swift 获取MAC/PI 地址

//获取IP地址func getIFAddresses() -> [String] { var addresses = [String]() // Get list of all...

iOS开发学习笔记之swift3.0几种加载网络图片的方法

swift3.0加载网络图片

Swift语言IOS8开发战记25 网络通信Get和Post方式

Get是从服务器上获取数据,Post是向服务器传送数据。对于Get方式,服务器端用Requset.QueryString获取变量的值,对于Post方式,服务器端用Request.Form获取提交的数据...

iOS基础网络教程-Swift版本: 3.使用UIWebView加载本地的数据

iOS基础网络教程-Swift版本: 3.使用UIWebView加载本地的数据

swift的代码教程-ios7 网络类(VKHttpManager)

看了很多帖子讲述 NSURLSession,没有一个jiang

Swift学习笔记(3)iOS 9 中的网络请求

Swift学习笔记(3)iOS 9 中的网络请求目录Swift学习笔记3iOS 9 中的网络请求 目录 编码方法 请求方法 其他修改 完整代码 运行结果编码方法在iOS9中,以前常用的stringBy...

iOS 网络图片下载_队列与线程_swift3

iOS开发-swift3-如何在网络上下载图片,同时介绍队列与线程的相关知识

iOS 解析json或xml swift3网络访问(一)

iOS开发-json解析xml解析-swift3 网络访问

iOS开发中大部分App的网络数据交换是基于HTTP协议的。本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法。

iOS开发中大部分App的网络数据交换是基于HTTP协议的。本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法。 注意:网络请求完成后会获得一个NSData类型的返回数据,如果数据格...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS网络(Swift)
举报原因:
原因补充:

(最多只允许输入30个字)