iOS 网络授权检测组件

2,277 阅读3分钟

目录

1.需求背景
2.需要解决的问题
3.核心代码部分
4.使用示例
5.组件地址

1. 需求背景

  • 随着iOS16.0更新,现在app首次安装启动,第一件事就是提示网络授权,但是很多用户会不小心点击到仅限无限局域网/不允许(有很多用户并不像互联网工作者对APP很熟悉,可能都不知道发生了什么),近期也是有很多用户反馈手机有网络但是无法登录问题,针对这方面问题本文将详细讲解如何解决
  • 组件Swift和OC版本都有,本文使用swift作为示例:

Snipaste_2022-12-05_20-36-32.png

2. 需要解决的问题

  1. 点击不允许,会返回未授权状态,引导用户去设置
  2. 点击仅无线局域网,设备如果是wifi状态能正常使用,切换到蜂窝状态则提示未授权
  3. 能判断网络不可用是设备无网/飞行模式还是因为未授权网路
  4. 能实时监控授权状态变化
  5. 进入前后台检测授权状态
  6. 提示框设置引导

3. 核心代码部分

  • 主要设计思路使用一个单例类去实现,并对外有如下方法:

Snipaste_2022-12-09_15-41-30.png Snipaste_2022-12-09_15-40-10.png

  • 下面看看start方法里面做了什么 Snipaste_2022-12-09_15-58-00.png 从上图可以看出,除了一些基本配置,主要调用了两个方法startReachabilityNotifier,startCellularDataNotifier,主要是对网络切换、授权切换的监听

  • 我们看看startReachabilityNotifier方法做了什么:

Snipaste_2022-12-09_15-54-26.png 主要也是用户网络出现动态切换的时候,会有一个回调,然后接着调用startCheck方法

  • 再看看startCellularDataNotifier方法:

Snipaste_2022-12-09_15-43-05.png CTCellularData对象监听用户授权的状态,也会调用startCheck方法

  • 看看startCheck方法主要做了啥

Snipaste_2022-12-09_15-53-03.png

如上图主要有3个方法:

  • 先判断用户当前网络是否可用:
  • currentReachable() 方法实现: Snipaste_2022-12-15_17-44-03.png
  • 当授权状态为restricted时,表示当前网络已经不可用了,但是不能判断时飞行模式真的没网还是因为用户没授权导致的,所以需要使用下面两个方法结合判断:
  • isUseWifiConnect()方法实现:能获取到wifi地址 表示当前在wifi状态 Snipaste_2022-12-15_17-43-23.png
  • isUseWWANConnect()方法实现: Snipaste_2022-12-15_17-44-49.png
  • 进入前台和和退到后台也会再次检测当前的授权情况和网络情况: Snipaste_2022-12-15_17-42-20.png

  • 当检测到未授权时,弹出提示框让用户去设置:

我这里自定义了一个弹框,需要注意的是我没有使用rootViewController去present出来,因为APP启动就会present一个协议弹框或者其他弹框,这时候后面需要展示的授权弹框present不出来了,直接将view加在window上应该更好 Snipaste_2022-12-09_16-39-33.png


4. 使用示例

  • 外部调用:

截屏2022-12-09 17.31.15.png

  • Demo测试效果:

86d5e41e6ae9783b4f695aea9054bbc7.gif

5. 组件地址

我在github上传了两种语言的组件,已集成cocopods ,可以直接通过pod导入项目中:

Swift版本: LLNetworkAccessibility-Swift

OC版本: LLNetworkAccessibility-OC