一面:
1.内存管理,内存泄漏,监测方法,解决办法
2.App启动流程,优化方法,查看每个阶段耗时的方法
Category和Extension区别,使用场景
Category可以添加属性吗?
3.webView和原生交互,怎么提升webView加载速度?H5怎么加载本地的JS和图片资源?
4.HTTP和HTTPS的区别,HTTPS怎么保证安全?GET和POST区别?请求头里一般有什么?
5.MVC、MVP、MVVM区别,使用场景
6.用OC实现一个栈,push pop isEmpty方法,栈和队列的区别,使用场景
7.了解鸿蒙吗
二面:
1.了解提升研发效率的方法,跨平台框架?
2.Flutter和原生交互方法
3.小程序的实现原理,SN的实现原理
3.设计图片下载框架,包括内存,缓存,解码等;缓存的技术指标是什么?(命中率) 在缓存即将达到最大容量时,同时有大量写入缓存的操作,怎么优化?
4.下载限制并发数量,下载断点续传 http请求码是多少
5.同层渲染怎么实现
6.webView加载速度优化
7.线上卡顿监控,卡顿优化
8.线上内存监控
9.口述快速排序,快速排序用迭代实现
10.HTTPS的流程,客户端校验证书的过程,链式验证
三面:
1.监控
2.原生与H5交互,注入和post message怎么选型的?
3.有没有关注过业务指标,技术手段提升业务指标的情况?收银台支付成功率?
4.其他:年龄、看机会原因,有没有别的offer
参考答案
1.内存管理,内存泄漏,卡顿监测方法,解决办法
2.App启动流程,优化方法,查看每个阶段耗时的方法
3.webView和原生交互,怎么提升webView加载速度?H5怎么加载本地的JS和图片资源?
4.HTTP和HTTPS的区别,HTTPS怎么保证安全?GET和POST区别?请求头里一般有什么?
HTTP(HyperText Transfer Protocol)和HTTPS(HyperText Transfer Protocol Secure)是用于在网络上传输数据的两种协议。它们有以下主要区别:
- 安全性:
- HTTP:数据以纯文本形式传输,不加密。因此,数据在传输过程中容易被截获和篡改。
- HTTPS:在HTTP的基础上增加了SSL/TLS加密层。数据在传输过程中会被加密,提供了数据的保密性和完整性,防止被窃听和篡改。
- 端口:
- HTTP:默认使用80端口。
- HTTPS:默认使用443端口。
- 证书:
- HTTP:不需要证书。
- HTTPS:需要SSL/TLS证书,用于加密通信和验证服务器身份。证书由受信任的证书颁发机构(CA)签发。
- 性能:
- HTTP:因为没有加密和解密的过程,速度相对较快。
- HTTPS:由于需要进行加密和解密操作,性能会有所下降,但现代硬件和优化技术已经极大地减少了这种影响。
GET和POST区别
- GET:主要用于获取数据,参数在URL中,适合传输较少、非敏感数据,幂等且可缓存。
- POST:主要用于提交数据,参数在请求体中,适合传输大量、敏感数据,非幂等且通常不缓存。
以下是一些常见的HTTP请求头字段及其作用:
1. 通用请求头字段
- Host:指定请求的目标主机和端口,例如:
Host: www.example.com
。这是HTTP/1.1中必须包含的头字段。 - User-Agent:标识发出请求的客户端软件信息,例如浏览器类型和版本、操作系统等,例如:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
。 - Accept:指定客户端能够处理的内容类型,例如:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
。 - Accept-Language:指定客户端首选的语言和地区,例如:
Accept-Language: en-US,en;q=0.5
。 - Accept-Encoding:指定客户端支持的内容编码类型,例如:
Accept-Encoding: gzip, deflate, br
。 - Connection:控制连接的管理,例如:
Connection: keep-alive
或Connection: close
。
2. 请求头字段(请求特有)
- Referer:指示请求的来源页面的URL,例如:
Referer: https://www.example.com/previous-page
。 - Cookie:发送存储在客户端的Cookie数据,例如:
Cookie: sessionId=abc123; theme=light
。 - Authorization:用于传递身份验证凭据,例如:
Authorization: Bearer token123
或Authorization: Basic base64credentials
。 - Content-Type:指定请求体的媒体类型,常用于POST和PUT请求,例如:
Content-Type: application/json
或Content-Type: application/x-www-form-urlencoded
。 - Content-Length:表示请求体的字节长度,例如:
Content-Length: 348
。 - Origin:表明请求的来源,用于跨域请求,例如:
Origin: https://www.example.com
。 - If-Modified-Since:用于条件请求,只在指定日期之后资源被修改时才返回,例如:
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
。 - If-None-Match:用于条件请求,当ETag不匹配时才返回,例如:
If-None-Match: "abc123"
。 - Range:请求部分资源内容,例如:
Range: bytes=500-999
。
3. 自定义请求头字段
- X-Requested-With:通常用于标识Ajax请求,例如:
X-Requested-With: XMLHttpRequest
。 - X-CSRF-Token:用于传递CSRF(跨站请求伪造)令牌,以防止CSRF攻击。
- X-Forwarded-For:记录原始客户端IP地址,常用于代理服务器,例如:
X-Forwarded-For: 203.0.113.195
。
4. HTTP/2 特有头字段
- :method:表示HTTP方法,例如:
:method: GET
。 - :scheme:表示请求的协议(http或https),例如:
:scheme: https
。 - :path:表示请求的路径和查询字符串,例如:
:path: /index.html
。 - :authority:表示服务器的主机名和端口,类似于HTTP/1.1的Host头字段,例如:
:authority: www.example.com
。
示例请求头
1 | GET /index.html HTTP/1.1 |
这些请求头字段在客户端和服务器之间传递时,提供了关于请求和客户端环境的丰富信息,使得服务器能够理解和处理请求,并返回适当的响应。
5.MVC、MVP、MVVM区别,使用场景
6.用OC实现一个栈,push pop isEmpty方法,栈和队列的区别,使用场景
7.了解鸿蒙吗
二面:
1.了解提升研发效率的方法,跨平台框架?
2.Flutter和原生交互方法
3.小程序的实现原理,SN的实现原理
3.设计图片下载框架,包括内存,缓存,解码等;缓存的技术指标是什么?(命中率) 在缓存即将达到最大容量时,同时有大量写入缓存的操作,怎么优化?
4.下载限制并发数量,下载断点续传 http请求码是多少
5.同层渲染怎么实现
6.webView加载速度优化
7.线上卡顿监控,卡顿优化
8.线上内存监控
9.口述快速排序,快速排序用迭代实现
10.HTTPS的流程,客户端校验证书的过程,链式验证
第一步是检查证书的链式验证。客户端会使用已信任的根证书(Root Certificate Authority)去验证服务器证书的有效性。根证书是权威机构颁发的,被广泛信任的证书,用于证明其它证书的合法性。客户端会检查服务器证书中的颁发者,然后递归地检查颁发者的证书,直到检查到根证书或者找不到信任的根证书为止。
第二步是检查证书的有效期。客户端会检查证书的有效起始日期和有效截止日期,确保证书在有效期内。如果证书过期,客户端将拒绝连接。
第三步是检查证书的公钥。客户端会验证服务器证书中的公钥和域名是否匹配。客户端会从证书中提取服务器的公钥,并与服务器进行握手协议,验证证书中的公钥是否与服务器的公钥匹配。如果不匹配,客户端将拒绝连接。
除了上述基本的校验步骤,客户端还可以进行更加严格的校验,以提高安全性。例如,客户端可以检查证书中是否包含指纹信息(Fingerprint),从而确保证书的完整性和一致性。客户端也可以检查证书中的扩展字段,查看是否存在其他安全相关的信息。
总结来说,客户端校验证书的过程包括链式验证、有效期验证和公钥匹配验证。通过这些验证步骤,客户端能够确保所连接的服务器是合法且可信赖的,从而保障通信的安全性。
三面:
1.监控
2.原生与H5交互,注入和post message怎么选型的?
在移动开发中,原生与H5(HTML5)交互是一个常见的需求。为了实现这种交互,通常有两种主要的方法:注入(Injection)和 postMessage
。各有优缺点,选择哪种方法取决于具体的应用场景和需求。下面对这两种方法进行详细比较和建议:
注入(Injection)
优点:
- 灵活性高:可以直接在H5页面中注入原生代码,灵活性较高。
- 强大的控制力:原生代码可以直接操作H5页面的DOM和JavaScript,控制力强。
- 无需特定API支持:不需要依赖特定的API或者更新H5页面的代码。
缺点:
- 安全性问题:注入代码可能会带来安全风险,容易被恶意代码利用。
- 维护复杂:代码维护复杂,尤其是原生代码和H5页面频繁变动时。
- 浏览器兼容性:不同浏览器对注入代码的支持可能有所不同。
postMessage
优点:
- 安全性高:通过消息传递的方式进行交互,安全性较高,不容易被恶意代码利用。
- 标准化:
postMessage
是HTML5标准的一部分,具有较好的跨浏览器兼容性。 - 易于调试和维护:消息传递方式使得代码逻辑更加清晰,易于调试和维护。
缺点:
- 性能影响:在高频率消息传递的情况下,可能会有性能影响。
- 依赖API:需要H5页面和原生代码都支持
postMessage
API。 - 有限的控制力:相比直接注入代码,控制力稍弱,只能通过消息进行交互。
如何选择?
选择哪种方法取决于具体的应用场景和需求:
- 安全性优先:如果安全性是首要考虑因素,建议使用
postMessage
,因为这种方法更安全,不容易被恶意代码利用。 - 高频交互:如果需要高频率的交互,且对性能要求较高,可以考虑注入方式,但要特别注意代码的安全性和浏览器兼容性。
- 跨浏览器兼容:如果需要在多个浏览器中运行,并且希望代码易于维护和调试,
postMessage
是更好的选择。 - 快速开发:如果需要快速实现功能,且不考虑长远的维护和安全性问题,注入方式可能会更快捷。
结论
综合来看,postMessage
在大多数情况下是更优的选择,特别是在考虑安全性、标准化和易于维护的情况下。但在某些特定场景下,比如需要高频率的交互或者对H5页面进行强控制时,注入方式也不失为一个可选方案。最终的选择应根据具体的项目需求和开发环境来决定。
3.有没有关注过业务指标,技术手段提升业务指标的情况?收银台支付成功率?