前言
年关将至,公司的项目都结束了回款。项目不忙,开始针对产品的功能进行详细设计。代码不咋敲了,开始苦兮兮的写起了文档,耗时两周终于写完了全部功能模块的详细设计😂。
本文是详述如何实现App内 动态修改网络配置 的功能。
程序概述
App请求在服务端配置的网络信息。
具体获取:请求的方式:http|https、网络类型(内网|外网)、IP地址、端口号,VPN信息。
程序流程图
核心类
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启动后,网络配置都是最新的。