前言:
本篇文章从iOS开发者的角度,介绍证券交易App的一些技术选型、功能设计等方面的内容。涉及到与server的交互数据格式及定义、接口设计、功能设计等。
一、App编程语言及三方库
iOS端采用原生开发,编程语言是Swift。如果某些功能需要在双端同时实现可使用Flutter。最近也参与了Flutter的跨平台开发,这篇文章简单介绍。
部分第三方库:
- 网络:
Alamofire、Starscream、SocketIO - 数据解析:
HandyJSON、SwiftProtobuf、SwiftyJSON - 布局:
SnapKit - 网络图片:
Kingfisher - 键盘输入:
IQKeyboardManagerSwift - 缓存:
Track - 弹框:
Toast-Swift - 数据库:
WCDB.swift 
二、网络部分
1、网络通信协议
常见的应用层通信协议有HTTP、SMTP、Web Socket等,这里介绍当前项目使用到的两种:
HTTP(HyperText Transfer Protocol,超文本传输协议):
- 是一种网页(HTML)传输协议,适用于从万维网服务器传输超文本到本地浏览器的传送协议。
 - 是一种
请求-响应协议,客户端发送一个请求给服务器,然后服务器回送一个响应回来。这种通讯方式限制了只能有客户端发起通信,服务器不能主动给客户端发送数据。 
Web Socket:
- 是一种在单个 TCP 连接上进行全双工通信的协议。目标就是在网页和服务器之间建立持久连接,然后进行双向数据传输。
 - 比起 HTTP(HTTP 协议中,服务器不能主动向客户端推送信息),WebSocket 更适合于实时性要求较高的场景,例如网页聊天,股票行情,游戏等。
 
2、数据编码格式
网络通信中传递的是数据,那么如何组织这些数据编称作“编码”,常见的有XML和JSON这两种格式,在app开发中也几乎不会用XML这种格式了。另外一种是Google推出的Protocol Buffers(简称ProtoBuf或PB)。
        JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON 使用完全独立于语言的文本格式,采用 Key-Value 键值对的方式来存储和表示数据,常用于服务器和 Web 应用间的数据交换。
        ProtoBuf,全称 Protocol Buffers,是 Google 公开的一种数据序列化协议,用于数据结构的序列化,可以用于数据存储、通信协议等方面。相较于 JSON、XML 这些数据格式,ProtoBuf 更小、更快、也更简单。它使用二进制格式,可以定义复杂的数据结构,还提供了众多语言的 API 接口,可用于网络通讯和数据存储。约定的数据结构能够被跨语言使用,比如 Server 使用 C++,Client 使用 Java,两者之间的通信,可以使用 ProtoBuf 来约定通信协议。
        总体上,JSON 更简单易用,并且在WebView、Web Browser 这样的环境中使用更加便利。而 ProtoBuf 则适合于大规模的系统中,需要更高效或者更清晰的协议定义的地方。
我们当前讨论的证券交易App在查看行情的过程中需要接受大量的行情数据,同时对时效性有较高的要求。PB体积小(二进制格式)、效率高(编解码),也支持跨语言,同时Google也提供了完整的工具链(如将.proto格式的文件编译成目标语言如Swift文件),特别适合证券类高频率、大数据量的场景。
3、安全性
// TODO: –
三、主要的业务逻辑
1、与行情服务器建立WebSocket连接
        WebSocket 是一个网络通信协议,提供了全双工(Full-duplex)通讯机制。在 WebSocket API 中,客户端(可以是web浏览器或app)和服务器只需要建立一次连接,就可以进行实时双向数据传输。这种协议的主要目标是在客户端和服务器之间实现实时通讯,同时也兼容了现有的 HTTP 协议。
        建立WebSocket连接需要知道服务器的ip地址和端口号port,其URI以ws://或wss://开头,如:"ws://172.16.10.207:11516",其中wss://多了一层security layer实现加密。
        通常我们会将行情服务器信息ServerInfo保存到本地,并提供更新接口。这样可以加速与行情服务器建立WebSocket连接的过程。如果本地未读取到则需要调用接口获取行情服务器信息,再建立连接、同时保存到本地。
2、数据的发送与接收
消息的格式: 容器 消息类型 + 消息体,
数据的发送
数据接收后的解析,传递给业务层
3、登录
检查登录状态
检查refreshtoken是否过期
刷新refreshtoken
单点登录
多点登录
4、在线状态
心跳
踢下线
四、启动后要做的一些事情
1、网络方面
网络状态检测 如果有网络的话,要建立websocket的连接 还要检查登录状态,refreshtoken等,同步用户数据