iOS 面试基础知识 (四)
我们接着上篇文章iOS面试基础知识 (三)继续给大家分享一下 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 字段表示签名。
那么如何生成 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。
同运营商、就近接入
可以根据用户手机的运营商返回相应机房的服务器给客户端,比如联通返回联通的服务器;
可以根据用户所处区域返回相应的服务器给客户端,比如深圳返回深圳机房的服务器。
资料推荐
如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。
评论