Reachability&SSID在swift中的使用

Reachability.swift


在需要获取手机网络连接方式的时候,Reachability库是一个很好的工具。它可以判断当前网络状态是

  • Wi-Fi(wifi)
  • 蜂窝移动(cellular)
  • 没有连接(none和unavailable,据说在之后的版本中会取消none)

并且在github的不断更新中,现在的Reachability.swift已经支持了swift5.0,并且可以通过swift package manager导入项目中。

官方给的文档中使用方式已经介绍的很清晰了,同时也可以自己稍加改变结合swiftUI或Combine使用。官方给的代码是:

  1. 在闭包中使用:
let reachability = try! Reachability()

reachability.whenReachable = { reachability in
    if reachability.connection == .wifi {
        print("Reachable via WiFi")
    } else {
        print("Reachable via Cellular")
    }
}
reachability.whenUnreachable = { _ in
    print("Not reachable")
}

do {
    try reachability.startNotifier()
} catch {
    print("Unable to start notifier")
}
  1. 在自定义类或结构体中使用(主队列):
let reachability = try! Reachability()

//添加观察者的语句,可以封装在方法中

     NotificationCenter.default.addObserver(self, selector: #selector(reachabilityChanged(note:)), name: .reachabilityChanged, object: reachability)
    do{
      try reachability.startNotifier()
    }catch{
      print("could not start reachability notifier")
    }
//发布通知的代码,广播
@objc func reachabilityChanged(note: Notification) {

  let reachability = note.object as! Reachability

  switch reachability.connection {
  case .wifi:
      print("Reachable via WiFi")
  case .cellular:
      print("Reachable via Cellular")
  case .unavailable:
    print("Network not reachable")
  }
}
//移除观察者的语句,同时停止发布通知
reachability.stopNotifier()
NotificationCenter.default.removeObserver(self, name: .reachabilityChanged, object: reachability)

wifi SSID


在使用时,与获取网络状态相关的功能就是读取Wi-Fi状态下的Wi-Fi信息。SSID(service set identifier)服务集标识符,一般可以当作局域网的名称。同样在github上有一个项目是可以实现获取Wi-Fi info的,对于iOS13及以下都支持。下面截取一个常用的方法:

import Foundation
import SystemConfiguration.CaptiveNetwork

func getSSID() -> String? {
    var ssid: String?
    if let interfaces = CNCopySupportedInterfaces() as NSArray? {
        for interface in interfaces {
//这里的 as! 强制类型转换是可以成功的
            if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
                ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
                break
            }
        }
    }
    return ssid
}

注意


在使用时也需要根据项目的要求对上面的信息做一些改变,比如let reachability = try! Reachability()这个初始化语句,使用了强制try,应谨慎表达式抛出错误,引发运行时错误。我的方法是:

  • 改为 try?忽略错误,同时在后面reachability的调用中使用可选链
  • 改为try,使用do-catch语句包围。

特别是如果使用了Future这样的publisher,就要格外注意初始化的成败。如果初始化失败future不会发出任何消息,但是在项目的程序调用中一般是认为future是会发出消息的,这样可能会在之后的调用中产生问题。所以要在初始化时就增加判断机制,失败时抛错并return。

此外在写工程代码时要注意避免“不优雅”的多层嵌套。衡量代码好坏的一个重要标准是代码的“深度”,即嵌套层数。多层嵌套降低代码的可读性,同时也会消耗内存资源。因为执行程序其实就是内存的入栈出栈,过分嵌套可能导致爆栈(可以理解为俄罗斯套娃,套得越深取出来的步骤就越复杂,也更耗时)。

以上,在写完代码后要二次检查:

  • 功能能否正常实现
  • 常变量、方法的命名是否规范
  • 代码的判断机制和错误处理机制是否合乎逻辑,不累赘丑陋
  • 注释是否规范,特别是对复杂语句要有必要的注释(比如try! as!的使用要写明白为什么会确保不出问题)

完成以上内容之后,根据工作的性质按照commit规范提交。
乌拉!


2020.2.26更新记录一下
在使用combine的时候没有注意引用持有,reachability在调用完成之后就被销毁了,使用Future发布不了任何值。最可怕的是我找bug找了一下午也没看出来是引用持有发生了问题(真菜啊),所以还要复习一下属性的生命周期。之前学的时候没有实际体会,现在有了实际体会又不会用了(逃
重要的是功能代码一定要自己测试测试测试!重要的事情说三遍!debug preview的模式就可以


2.27记录
whenReachable 和 whenUnreachable这两个闭包使用的时候要注意,他们是在网络状态发生改变的时候才会发出值的,在使用combine结合项目的时候最好看一起reachability的源码,获取网络的状态可以直接通过实例化Reachability之后访问connnection属性拿到。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 或许我没有别的女孩子那么温柔那么漂亮那么会做事情那么聪明,可是我比她们任何一个人都爱你。
    李曦和阅读 161评论 0 0
  • 说说藏族康巴人的冬虫夏草
    我是土司姐阅读 182评论 0 0
  • 转眼就35岁了,本该早就过了而立的年纪。在32岁选择了创业后,到今天快进入第三年了。公司发展不如人意,今年...
    克里斯的蛋阅读 303评论 2 5
  • 说明 此代码在matlab上搭建了简单的生成对抗性网络,用来生成手写数字图像。网络中生成器和鉴别器的隐藏层均为2层...
    JzCh阅读 26,126评论 67 18
  • 今夜,特别想你 想你留在马克杯上的唇印 想你在我耳边呼吸的温暖 想你阳光里安睡的睫毛 想你闭着眼,忍着笑, 衔着负...
    弥九的诗阅读 770评论 1 5