技术部-APP面试题

软性热身题

1.自我介绍
2.介绍下你负责的公司项目
3.你有什么优点和缺点?
4.在同一个项目组内,你认为你怎么做会比另外一名更加优秀?
5.你为什么离开上家公司?离职原因(这个会在最后问)

软技能

1、做过哪些工作职责之外的事情?
2、经历过最难的一次业务开发是什么样的,最终怎么解决的?
3、最近有学习什么新技术吗?有何收获?
4、你最擅长iOS哪方面的知识?怎么体现出来的?
5、常用哪些开源库,有没有研究过他们的原理?
6、如何保持个人成长?

你最擅长iOS/android哪方面的知识?怎么体现出来的?

分享推广的时候,免邀请码安装注册,如何实现

对大量数据列表有什么优化方案?

优化1. 利用UITableView重用cell的机制
优化2. 分批次异步加载数据
优化3. 缓存高度
优化4. 将耗时操作放在异步线程来做

对大量数据列表有什么优化方案?

当前维护的App的崩溃率是多少?怎么追踪并解决的?线上崩溃如何解决的?
  崩溃率这个就不谈了,开发过程中遇到的崩溃问题主要查看崩溃的栈信息,利用异常断点来解决。线上崩溃的话,就是利用dSYMS文件来符号化苹果的崩溃日志来解决了

讲一下你做过的性能优化的事情。

这个根据自己情况来说吧。

计算机基础

http与https?socket编程?tcp、udp?get与post?
tcp三次握手与四次握手
进程与线程的区别
保持登录状态

如何有效降低 APP 包的大小?

图片压缩,无用图片删除
一些大图可以动态下发
删除无用类,无用方法
减少三方库的依赖

如何开展并架构一个APP

架构app 方式方法有很多: MVC MVP MVVM 组件化 路由

如何优化APP启动耗时

在一个HTTPS连接的网站里,输入账号密码点击登录后,到服务器返回这个请求前,中间经历了什么

类似微博的短视频列表,滑动停留播放,如何实现?

这个主要就是检测contentOffset和屏幕中间位置,设置一些边界条件,处理滑动过程中的切换行为

如何设计一套切换主题的方案?

计算机相关

1、项目编译的流程是什么?手机上的应用程序自点击图标开始到首屏内容展示都经历了哪些步骤?
2、对于基本数据类型,一般是存储到栈中的,它有没有可能存在堆上,什么情况下会存储到堆上?
3、数据库中的事务是什么意思?
4、使用过什么数据库(我回答的Sqlite,Realm),Realm在使用时有哪些注意事项,如何实现批量操作?
5、LRU算法是否了解,如何实现一套LRU算法?
6、知道哪些设计模式,怎么理解设计模式的作用?
7、如果有1000万个Int类型的数字,如何对他们排序?
8、设计一套数据库方案,实现类似微信的搜索关键词能快速检索出包含该字符串的聊天信息,并展示对应数量(聊天记录的数据量较大)。

客户端与服务器交互的方式中的对称加密和非对称加密是什么?

对称加密,就是加密和解密数据都是使用同一个key,这方面的算法有DES。 非对称加密,加密和解密是使用不同的key。发送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据可以用私钥解密,反之。这方面的算法有RSA。ssh 和 ssl都是典型的非对称加密。

安卓端保障新消息及时通知的常见实践

当app在后台运行时,环信IM SDK默认通过一个后台服务保持一条连接环信服务器的长连接。但Android为了解决系统待机性能差的问题,随着Android版本的升级逐渐禁止了app级别的后台服务的运行。所以在一些版本比较高的Android系统上会有APP进入后台后接收不到消息的情况。

1.集成厂家推送
集成尽可能多的厂家推送。环信支持了所有主流的第三方厂家推送服务,包括小米推送,华为推送,OPPO推送,魅族推送,VIVO推送,Google FCM推送

2.手机上开启APP的“自启动模式”、“非省电模式
针对没有厂家推送的手机型号,可以采取的优化措施包括:
告知APP使用者去开启该APP的“自启动模式”、“非省电模式”,从而可以让App活得更久。常见的实践是在APP的设置页面,通过提供文档说明的方式告知APP使用者如何开启APP的“自启动模式”、“非省电模式“。也可以在APP的设置页面,设置链接,让用户点击链接后就跳转到该型号手机的相应的系统设置位置。
3.通过短信通知用户重要新消息
通过短信告知。方法如下:开通消息回执;如果在规定时间内(例如1分钟)没有返回值“已读”,环信将信息转给业务系统;业务系统发现时间到期后(例如超过3分钟),业务系统服务器去环信服务器查询,如果没有下发,然后出发短信系统发送信息
4.自定义推送铃声
在音视频通话的场景下,还可以使用自定义推送铃声,让推送的铃声提醒更明显持续时间更长。请注意,自定义铃声,目前只支持华为
5.自定义推送扩展

iOS端保障新消息及时通知的常见实践

iOS系统因为不允许APP在后台允许,所以在音视频场景下,会出现推送提醒不明显,从而错过对方发起的通话请求的情况。

集成PushKit

自定义铃声
自定义推送扩展

IOS 讲一下对Runloop的理解?

Runloop就是一个运行循环,它保证了在没有任务的时候线程不退出,有任务的时候即使响应。Runloop跟线程,事件响应,手势识别,页面更新,定时器都有着紧密联系。

IOS 可以用Runloop实现什么功能?

检测卡顿
线程保活
性能优化,将一些耗时操作放到runloop wait的情况处理。

IOS 谈谈你在iOS中对多线程的理解?

多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始的多线程方法存在很多的毛病,包括线程锁死等。在Cocoa中,Apple提供了NSOperation这个类,提供了一个优秀的多线程编程方法。

iOS APNS?

第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。 第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

iOS单元测试框架有哪些?

OCUnit 是 OC 官方测试框架, 现在被 XCTest 所取代。 XCTest 是与 Foundation 框架平行的测试框架。

iOS中持久化方式有哪些?

属性列表文件 -- NSUserDefaults 的存储,实际是本地生成一个 plist 文件,将所需属性存储在 plist 文件中
对象归档 -- 本地创建文件并写入数据,文件类型不限
SQLite 数据库 -- 本地创建数据库文件,进行数据处理
CoreData -- 同数据库处理思想相同,但实现方式不同

ANDROID 进程保活

当前业界的Android进程保活手段主要分为** 黑、白、灰 **三种,其大致的实现思路如下:

1.黑色保活:不同的app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)
场景1:开机,网络切换、拍照、拍视频时候,利用系统产生的广播唤醒app
场景2:接入第三方SDK也会唤醒相应的app进程,如微信sdk会唤醒微信,支付宝sdk会唤醒支付宝。由此发散开去,就会直接触发了下面的 场景3
场景3:假如你手机里装了支付宝、淘宝、天猫、UC等阿里系的app,那么你打开任意一个阿里系的app后,有可能就顺便把其他阿里系的app给唤醒了。(只是拿阿里打个比方,其实BAT系都差不多)
2.白色保活:启动前台Service
白色保活手段非常简单,就是调用系统api启动一个前台的Service进程,这样会在系统的通知栏生成一个Notification,用来让用户知道有这样一个app在运行着,哪怕当前的app退到了后台。
3.灰色保活:利用系统的漏洞启动前台Service
灰色保活,这种保活手段是应用范围最广泛。它是利用系统的漏洞来启动一个前台的Service进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个Notification,看起来就如同运行着一个后台Service进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到Notification),但你的进程优先级又是高于普通后台进程的。

ANDROID 推送到达率如何提高

判手机系统,小米使用小米推送,华为使用华为推送,其他手机使用友盟推送

ANDROID 跨进程通信的几种方式

Intent,比如拨打电话
ContentProvider数据库存储数据
Broadcast广播通信
AIDL通信,通过接口共享数据

ANDROID Activity生命周期

onCreate() 创建活动,做一些数据初始化操作 onStart() 由不可见变为可见 onResume() 可以与用户进行交互,位于栈顶 onPause() 暂停,启动或恢复另一个活动时调用 onStop() 停止,变为不可见 onDestroy() 销毁 onRestart() 由停止状态变为运行状态

ANDROID 如何优化ListView

①Item布局,层级越少越好,使用hierarchyview工具查看优化。 ②复用convertView ③使用ViewHolder ④item中有图片时,异步加载 ⑤快速滑动时,不加载图片 ⑥item中有图片时,应对图片进行适当压缩 ⑦实现数据的分页加载

Android异步消息处理机制

主要有四个部分: ①. Message (消息) 在线程之间传递,可在内部携带少量信息,用于不同线程之间交换数据 可以使用what、arg1、arg2字段携带整型数据 obj字段携带Object对象 ②. Handler (处理者) 主要用于发送和处理消息,sendMessage()用来发送消息,最终会回到handleMessage()进行处理 ③. MessageQueue (消息队列) 主要存放所有通过Handler发送的消息,它们会一直存在于队列中等待被处理 每个线程只有一个MessageQueue ④. Looper (循环器) 调用loop()方法后,会不断从MessageQueue 取出待处理的消息,然后传递到handleMessage进行处理

你可能感兴趣的:(技术部-APP面试题)