App结构

生命周期管理
1
感觉ICSMainFramework其实是为了解耦。如果是很多人开发的确有助于隔离业务,如果有很多不同的业务组的话可以借鉴这种拆代码的方式。小项目就免了。

app整个生命周期交给AppConfigurationconfig.plist来托管,config.plist制定了生命中的哪个部分应该交给哪几个类来处理。管理生命周期的几个核心类有 UrlHandler, DataInitializer, NotificationHandler, AppInitializer, UIManager.这几个类都实现了UIApplicationDelegate协议

  • ICSMainFramework.AppConfiguration: 解析config.plist文件为json,
  • ICSMainFramework.AppDelegate:真正的AppDelegate,调用解析,并且将解析的条目真正的调用到
  • ICSMainFramework.AppEnvironment:一些通用方法,返回版本,国家代码, 语言代码,名字,是否是AppStore等信息
  • ICSMainFramework.AppLifeCycle: 主要是AppLifeCyleItem类,里面的属性是object, 整个object符合UIApplicationDelegate
核心类(config.plist)中实现AppDelegate的几个类
  • UrlHandler:app支持x-callback-url,所以里面使用了callbackURLKit这个库来标准开发。有关callback-url可以看这篇文章
  • DataInitializer: 进入前台之后会判断Receipt是否有问题,具体在Receipt这个类实现。开机之后会ManagerCloudSetManager做初始化
  • NotificationHandler: 貌似主要是对HelpShift这个第三方服务做了一些提醒处理。
  • AppInitializer:配置日志(DDLogddlog可以做日志上上传),评价(Appirater),helpshift
  • UIManager:设置了整个app的颜色Appearance, 设置了app的四个tab分别为哪几个ViewController

页面

所有表单页面都用Eureka来处理。通过添加section和form来实现界面

HomeVC

遵循HomePresenter协议,并且里面有Presenter的object(不清楚是不是VIPER中的Presenter).HomeVC处理界面, presenter是真正的逻辑

  • group: proxy group
  • proxy: 默认是proxy group里面的第一个proxy
  • switchVPN: 调用VPN类的switchVPN
  • chooseProxy: 到ProxyListVC去
  • blablabla: other blablabla logics
SettingsVC
  • 基本配置,评价页面,URL扫描
CollectionViewController
  • 继承自SegmentPagerVC, RuleSetListViewController, ProxyListViewController, CloudViewController 这三个pager分别处理不同逻辑
  • RuleSetListViewController:DBUtil调取的RuleSet的信息,并显示
  • ProxyListViewController:DBUtil调取的Proxy的信息,并显示
  • CloudViewController:API这类获取的远程配置信息
DashBoard
  • RecentRequest是通过Warmhole来监听NetworkExtension得到的请求,并且将历史记录存到UserDefaults里面
  • reloadTable的时候取UserDefault并打印出来

连接

VPN开启关闭都在Manager.swift类中进行

  • 开启VPN
    • regenerateConfigFiles
    • loadAndCreateProviderManager
1
2
3
NETunnelProviderManager.loadAllFromPreferences,这个时候会返回managers, 然后如果没有manager就创建manager然后saveToPreference

manager是一个NETunnelProviderManager

配置完成之后调用connection.startVPNTunnel
这个server其实就是Potatso,因为这个VPNConfiguration没有使用外界服务器,所有的流量都会走回Potatso

  • 关闭VPN:
    • loadProviderManager
    • stopVPNTunnel