写点什么

iOS 面试基础知识 (四)

用户头像
iOSer
关注
发布于: 2020 年 12 月 23 日

我们接着上篇文章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 字段表示签名。


假定客户端请求参数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。


同运营商、就近接入

可以根据用户手机的运营商返回相应机房的服务器给客户端,比如联通返回联通的服务器;

可以根据用户所处区域返回相应的服务器给客户端,比如深圳返回深圳机房的服务器。


资料推荐

如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。


用户头像

iOSer

关注

微信搜索添加微信 mayday1739 进微信群哦 2020.09.12 加入

更多大厂面试资料进企鹅群931542608

评论

发布
暂无评论
iOS面试基础知识 (四)