iOS面试基础知识 (四)
网络相关
做移动开发,除了写UI,大部分的工作就是跟后台做接口联调了,所以网络相关的知识在面试当中是相当重要且必不可少的。
Get与Post区别
笔者在面试中会经常问这个问题,发现有挺多面试者回答得不好。很多人不知道Get与Post网络请求参数放在哪里。
Get请求参数是以kv方式拼在url后面的,虽然http协议对url的长度没有限制,但是浏览器和服务器一般都限制长度;Post请求参数是放在body里面的,对长度没什么限制。
https原理
https与http区别
https是在http的基础上加上ssl形成的协议,http传输数据是明文的,https则是以对称加密的方式传输数据。
https证书校验过程
https采用对称加密传输数据,对称加密需要的密钥由客户端生成,通过非对称加密算法加密传输给后台。具体步骤如下:
1、客户端向服务器发起HTTPS请求,连接到服务器的443端口。
2、服务器有一个用来做非对称加密的密钥对,即公钥和私钥,服务器端保存着私钥,服务器将自己的公钥发送给客户。
3、客户端收到服务器的公钥之后,会对公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性,如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了。
4、客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
5、服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
6、后续客户端和服务器基于client key进行对称加密传输数据。
网络参数签名、加密实现方式
除了用https协议传输数据,有些对数据安全要求比较高的App比如金融类App还会对参数进行签名和加密,这样可以防止网络请求参数被篡改以及敏感业务数据泄露
网络参数签名
为了防止网络请求被篡改,一般会对请求参数进行hash,一般会有一个sign字段表示签名。
假定客户端请求参数dic如下:
{
"name":"akon",
"city":"shenzhen",
}
那么如何生成sign字段呢?
一般通用的做法是把字典按照key的字母升序排序然后拼接起来,然后再进行sha256,再md5。
- 把字典按照key的字母排序拼接生成字符串str = "city=shenzhen&name=akon"。
- 对str先进行sha256然后再进行md5生成sign。
值得注意的是,为了增加破解的难度,我们可以在生成的str前面、后面加入一段我们App特有的字符串,然后对str hash可以采用base64、sha256,md5混合来做。
网络参数加密方式
为了效率,我们一般会采用对称加密加密数据,DES,3DES,AES这些方式都可以。既然要用对称加密,那就涉及到对称加密的密钥怎么生成,有如下方式:
- 最简单的方式,代码写死密钥。密钥可以用base64或者抑或算法进行简单的加密,用的时候再解密,这种方式比裸写密钥更安全。
- 后台下发密钥。后台可以在登录的时候下发这个密钥,客户端保存这个密钥后续用来做加密。由于客户端要保存这个密钥,所以还是存在泄露的风险。
- 仿照https证书校验过程,客户端生成对称加密的密钥clientKey,对参数进行加密,然后用非对称加密对clientKey进行加密生成cryptKey传给后台;后台获取到cryptKey解析出clientKey,然后再用clientKey解密出请求参数。这种方式最安全,推荐使用。
AFNetworking实现原理
作为iOS使用最广泛的第三方网络库,AFNetworking基本上是面试必问的。笔者面试都会问,通过AF的一些问题,可以了解面试者是否熟练使用AF,以及是否阅读过AF的源代码。
AF的设计架构图
如果面试者能把AF的分层架构图清晰地画出来,那至少证明面试者有阅读过AF的源码。
AF关于证书校验是哪个类实现的?有哪几种证书校验方式?
AFSecurityPolicy用来做证书校验的。有三种校验方式:
- AFSSLPinningModeNone 客户端不进行证书校验,完全信任服务端。
- AFSSLPinningModePublicKey 客户端对证书进行公钥校验。
- AFSSLPinningModeCertificate 客户端对整个证书进行校验。
AF请求参数编码、响应参数解码分别是哪两个类实现的?支持什么方式编码,解码?
- AFHTTPRequestSerializer、AFHTTPResponseSerializer分别用来做编码和解码。
- 编码方式有url query类型、 json、plist方式。
- 解码支持NSData、json、xml、image类型。
关于AF如果再深入点可以问问具体实现细节,可以通过细节进一步考察面试者的内功。
SDWebImage实现原理
iOS下载图片基本都用SDWebImage,这个库笔者面试基本都会问。
下载流程
一、先去内存缓存找,找到了直接返回UIImage,否则走第二步;
二、去磁盘缓存里面找,找到了直接返回UIImage,否则走第三步;
三、网络下载,下载完成后存入本地磁盘和内存缓存,然后返回UIImage给调用方。
url生成key的算法是什么?
- 内存缓存key是url
- 磁盘缓存key是对url进行md5生成的。
清缓存时机
- 对于内存缓存,在下载图片加载图片到内存时、内存收到警告时候进行清理。
- 对于磁盘缓存,在App退出、进后台清理。
网络防劫持策略
H5防劫持
黑客可以通过劫持URL,注入JS代码来劫持H5,可以通过黑名单机制来解决这类问题。
DNS防劫持
DNS的过程其实是域名替换成IP的过程,这个过程如果被黑客劫持,黑客可以返回自己的IP给客户端,从而劫持App。可以通过HTTP DNS方案来解决这个问题。
网络优化
网络优化的核心点是减少网络请求次数和数据传输量。策略有很多,列举一些常用的手段:
合并接口
有些接口可以合并就合并,把几个接口合并成一个接口,可以省去每个接口建立连接的时间以及每个请求传输的http请求头和响应头。
采用pb等省流量传输协议
我们可以采用xml、json、pb等格式传输数据。
这三种方式数据量大小和性能pb>json>xml。
webp
采用webp图片可以节省客户端和服务端的带宽。
采用tcp而不是http
http是基于tcp的应用层协议,相比tcp,http多出来一个几百字节的请求头和响应头,并且每次通信都要建立连接,效率比不上tcp。
同运营商、就近接入
可以根据用户手机的运营商返回相应机房的服务器给客户端,比如联通返回联通的服务器;
可以根据用户所处区域返回相应的服务器给客户端,比如深圳返回深圳机房的服务器。