如何实现App动态网络配置功能

283 阅读2分钟

前言

年关将至,公司的项目都结束了回款。项目不忙,开始针对产品的功能进行详细设计。代码不咋敲了,开始苦兮兮的写起了文档,耗时两周终于写完了全部功能模块的详细设计😂。
本文是详述如何实现App内 动态修改网络配置 的功能。

程序概述

App请求在服务端配置的网络信息。 具体获取:请求的方式:http|https、网络类型(内网|外网)、IP地址、端口号,VPN信息。 图片2.png

程序流程图

图片3.png

核心类

LKConfigNetManager

管理App网络配置的一个工具类,主要实现:
1、请求网络配置。
2、缓存网络配置。
3、发送通知,告知业务网络发生变化,做出对应的操作。

LKNetModel

网络模型类,主要属性如下:
网络类型、业务IP、业务Port、VPN的账号、VPN的密码、VPN的IP、VPN的Port、是否选中。

具体实现

单例初始化

会优先从本地取缓存。这边使用NSUserDefault来实现的缓存功能,其中工具类内部会对缓存的数据进行加密处理。

+ (instancetype) sharedInstance{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSString *json_string = [HTHelper objectForKey:@"LKConfigNetManager"];
        manager = [LKConfigNetManager mj_objectWithKeyValues:[json_string mj_JSONObject]];
        if (!manager) {
            manager = [LKConfigNetManager new];
        }
    });
    return manager;
}

请求网络配置

在App加载完根视图控制器后,LKConfigNetManager 类发起网络请求。

[UIApplication sharedApplication].keyWindow.rootViewController = _rootViewController;
[[LKConfigNetManager sharedInstance] requestConfig];

缓存网络配置,供下一次App启动时加载。

服务端会返回一个时间戳与本地缓存的时间戳进行比较,如果不一致。LKConfigNetManager 会进行数据的更新以及缓存。

NSString *json_string = [[[LKConfigNetManager sharedInstance] mj_JSONObject] mj_JSONString];
[HTHelper setObject:json_string Key:@"LKConfigNetManager"];

发送通知告知变化

如果不一致,发送通知给登陆页、配置页进行页面刷新。
如果当前App状态为登陆后,则进行弹框提示,告知退出登陆后重新登陆。

[[NSNotificationCenter defaultCenter] postNotificationName:LKCONFIGNOTIFY object:nil];

切换当前网络 、 修改网络

在登陆页面可以进行网络模式的切换,或者在配置页面可以进行网络配置的手动改造。改造完成之后,调用 LKConfigNetManager 的缓存方法,保证下次App启动后,网络配置都是最新的。