文章目录
- 引言
- I、 上架指南
- 1.1 iOS上架干货汇总
- 1.2 上架相关操作技巧
- 1.3 iOS被拒绝的解决方案汇总
- 1.4 系统框架(API)适配
- II、 开发基础知识
- III、渲染
- 3.1 动画
- 3.2 文字/图像处理
- 3.2.1 Quartz2D使用指南
- IV、 网络与数据存储
- 4.1 数据存储
- 4.2 数据搜索
- 4.3 http/https/dns(数据提交)
- 4.4 get 和PostBOOL参数进行处理
- V、需求案例: 注册/登陆基础模块
- 5.1 支付产品的基础知识
- 5.2 登陆模块
- 5.3 注册模块
- 5.3.1 《用户协议及隐私政策》弹框
- 5.4 处理用户输入内容
- 5.5 地理信息处理
- VI、 内存
- 6.1 进程
- 6.1.1 Extension的应用例子:语言播报
- 6.1 进程
- VII、质量(code review 、性能)
- 7.1 测试
- 7.1.1 技巧
- 7.1.2 AB 测试流量切换方案
- 7.1.3 iOS测试指南
- 7.2 安全
- 7.3 性能优化
- 7.4 监控系统
- 7.1 测试
- VIII、 效率
- see also
- 技术分布
引言
欢迎大家来到#公众号:iOS逆向的《iOS基础》专栏
本文列出学习大纲,同时也可作为大家学习《iOS基础》专栏的索引。
文中的蓝字都是传送门,点击进入即可
本专栏侧重于程序开发和 iOS 开发的基础知识和技能以及产品需求案例,当然也会包括提高项目质量和提升开发效率模块。
- 基础涉及内容:app上架指南、语言、框架、内存、网络、存储、渲染、线程
- 产品需求案例:
1、普通的数据显示案例,即网络拉数据->存储->读取->展示;
2、代理商CRM app、商户收银app
3、计划涉及的案例:浏览器内核,文字排版引擎,音视频和图像处理引擎,图标绘制引擎
- 质量
I、 上架指南1、测试/调试技巧(测试保证质量是一个很重要的环节):黑盒测试、单元测试、自动化测试
2、性能优化:网络/存储/内存/渲染/算法优化
3、监控体系:卡顿监控、数据库监控、流量消耗监控、内存消耗监控、耗时监控(问题响应)
4、代码管理:代码规范/代码规范检测工具、code review 机制(互相监督,减少脏乱差代码)
5、应用安全:敏感信息的脱敏规范、网络传输的安全、敏感信息安全(用户名/密码)、代码混淆【iOS应用逆向与安全模块请移步到《iOS逆向》专栏学习】
1.1 iOS上架干货汇总
-
iOS上架前的准备、上架技巧(不更新版本的情况下删除App Store非主语言的方法)、常见上架问题及解决方案(上传ipa包被吃掉、已上架app在AppStore搜不到)、app上架后的事项(ASO)
-
iOS代码管理之【Xcode Build版本号自增的解决方案】(通过配置脚本让xcode 在每次Build打包时自动对CFBundleVersion加一)
-
【codesign】1、重签名2、搜索本机的证书、查看签名证书、3、打包脚本
1.2 上架相关操作技巧
【AppStore 上架相关技巧】1、由于AppStore缓存原因,导致已上架iOS app(可供销售)在AppStore上搜不到的解决方案2、不更新版本的情况下删除App Store非主语言的方法(应用场景:马甲包)
1.3 iOS被拒绝的解决方案汇总
iOS被拒绝的解决方案汇总:1、因蓝牙功能隐蔽而导致上架2、iOS审核1.1.6被拒(安全-令人反感的内容)
1.4 系统框架(API)适配
- iOS基础-专栏目录指南之【系统适配】(持续更新)
III、渲染涉及框架:StoreKit / MessageUI / AVFoundation/Foundation/UIKit
3.1 动画
- iOS常用动画 【 定点缩放弹窗】利用锚点anchorPoint进行实现
- iOS Horizontal Popup View 【 横向(水平方向)弹出菜单视图】例子:商品列表支持弹出菜单进行下/上架商品、打印商品价签、编辑商品信息、同步网店等操作popover
3.2 文字/图像处理
- 渲染机制
图层混合,渲染时机,离屏渲染
- iOS 图片的平铺和拉伸、图片的加载方式、内容模式(等比例显示)
3.2.1 Quartz2D使用指南
-
Quartz2D使用指南:自定义控件(电子签名)、图片水印、裁剪以及屏幕截图
-
iOS Quartz2D使用教程之【自定义控件】(案例:横屏电子签名)
-
电子签名
app从拉取数据到显示的大致流程:
从网络拉取数据
存储到本地文件系统
再从本地取出来放进内存,最后渲染出来。
从流程就可以看出本模块讲解的内容大纲如下:
- 数据存储
- https 的原理
- dns 劫持(重试机制)
- 优化弱网络下的连接(离线机制)
- 客户端跟后台的通信协议
数据结构json /protobuf、数据的增量更新
- 线程
这里所有的处理都在操作系统的进程和线程中执行,因此了解线程相关知识是必不可少的
4.1 数据存储
- 主键索引事务等数据库基本概念
- 存储机制/索引的实现/sqlite的七层结构
- 单文件存储
XML存文件;对象序列化成二进制存储
-
iOS app 使用BGFMDB存储信息到本地数据库教程【应用场景:商户首次登陆app同意协议流程,记录当前商户已经同意过协议信息】
-
【iOS 使用数据库表存储信息】例子: 存储显示过广告弹窗的用户ID, 应用场景:首次打开app进行广告弹窗
-
PL/SQL基础
4.2 数据搜索
- iOS数据搜索技巧:1、 应用NSPredicate进行数据筛选:从数组搜索特定条件的元素(从数组中筛选type=8的电子签名数据,避免遍历数组 certificateInfoList)2、正则表达式
4.3 http/https/dns(数据提交)
- iOS 实现json数据提交(发送JSON数据给服务器)
1.一定要使用POST请求
2.设置请求头 [request setValue:@“application/json” forHTTPHeaderField:@“Content-Type”];
3.设置JSON数据为请求体
- iOS接收json格式【 unacceptable content-type: text/plain的解决方案】
- iOS实现key=value&key=value形式的数据提交【Post 提交请求数据格式为application/x-www-form-urlencoded的方案】(基于AFNetworkSDK)
4.4 get 和PostBOOL参数进行处理
【AFN使用NSNumber 传BOOL值参数时,需要区分get 和Post进行处理】get请求对应的0和1,post对应true/false:若服务端Bool 参数没有同时支持这两种格式,就需要处理
V、需求案例: 注册/登陆基础模块————————————————
5.1 支付产品的基础知识
- i1、支付知识及调试测试技巧:【支付流程 & 预授权& 银行卡验证&反洗钱】2、安全设计Checklist(短信验证码、图形验证码、密码管理、身份验证、会话安全、敏感信息、接口安全)
5.2 登陆模块
- iOS 优化登录流程:【打开app,如果 token不过期,就使用最近一次登录的tokenn进行接口请求。】优化token的存储方式:(之前只是存储在内存,每次打开app都会重新登录,)
5.3 注册模块
5.3.1 《用户协议及隐私政策》弹框
- iOS TextViewHyperLink 文字超链接: 《用户协议及隐私政策》弹框
5.4 处理用户输入内容
-
iOS文本长度计算【中文占1,英文等能转ascii的占0.5】常常应用于对文本输入框的个数限制
-
iOS处理语言的强大工具CFStringTransform : 智能地处理用户的输入内容,经典应用场景【索引】
-
iOS用户输入处理之【从字符串中提取数字(手机号)】应用场景:登录界面“请输入手机号“文本框,对粘贴内容进行手机号码提取
-
iOS金额的格式转化处理
5.5 地理信息处理
- iOS定位、地理/逆地理编码geocodes的使用、判断目标经纬度是否在大陆
- ARC 机制
OC 的引用计数 、自动释放池、Java语言的垃圾回收机制
- 内存管理
避免内存泄露
- 缓存管理
避免缓存太多导致OOM、缓存命中率太低性能低下
Out Of Memory:“内存用完了”。 它来源于java.lang.OutOfMemoryError。
- 线程和进程
iOS 开发只在做 Extension 时才需要考虑到进程,
主线程子线程,多线程并发锁竞争,死锁,GCD,Runloop
6.1 进程
6.1.1 Extension的应用例子:语言播报
- NotificationServiceExtension
VII、质量(code review 、性能)使用 NotificationServiceExtension实现VoiceBroadcast
【app处于后台/被杀死的状态仍可进行语言播报】
iOS12.1以上在后台或者被杀死无法语音播报的解决方案
7.1 测试
7.1.1 技巧
- iOS测试位置信息变更:通过GPX文件修改经纬度信息(模拟iOS设备的位置)
7.1.2 AB 测试流量切换方案
- AB 测试流量切换方案
7.1.3 iOS测试指南
iOS测试指南之 【保存接口返回的数据为json,以便作为测试数据】
7.3 性能优化
1、 检测各方面的数据,量化运行性能,
2、从检测数据寻找性能瓶颈
3、找解决方案并用监测的数据验证优化效果
7.4 监控系统
【电池的状态处理:电池状态获取及监测、电池电量获取及监测、低电量模式切换监测】
VIII、 效率效率教程模块放在了 《iOS进阶》专栏
see also- 客户端开发
主要是指iOS/Android,也包括macOS/Windows/Linux这些平台的软件开发
前端开发
使用vue/react这些来源于浏览器技术
- Native开发
是指“非浏览器技术”开发,例如不使用JavaScript开发。
通常Native开发,使用的语言主要是编译型,而不是解释型。
例如iOS/macOS使用Objective C和Swift来开发,Android使用Java或Kotlin来开发。Windows使用C#来开发,Linux使用C++来开发。(C++所有平台都能开发)。
Flutter使用Dart
技术分布
- 完全小程序实现
这些应用一般是业务为主,连接线下的应用
- ReactNative或者Flutter实现为主,少量Native代码为辅助。
中小公司开发的业务类型为主的应用,更多是ToB产品。为了节省开发人力,大部分功能使用跨端技术开发。
- 自定义DSL框架。
用xml或者json描述界面,Native代码来根据xml或json生成对应的界面。
这些应用多数是大型的应用,多数以Feed流为主,DSL框架用来实现某一个“内容为主”的功能。
例如美团首页、微博首页(刷微博时经常看到的广告)、支付宝首页。
这些Feed流中的内容十分丰富,公司内部也会开发专有的运营平台,能很方便的配置下发不同的内容。
美团的MTFlexbox发布过文章,但不开源。阿里的Tangram(开源)。
- 更高级的DSL框架。
例如滴滴的变色龙 https://github.com/didi/chameleon ,
或者最近阿里开源的北海 https://github.com/openkraken/kraken 。这些框架可以使用前端技术,开发出适应多平台的代码。
- Native为主,其他技术为辅助。
核心功能对性能有更高的要求,必须使用Native技术来开发。
例如微信、淘宝、抖音
这些应用的核心功能使用Native开发,跨端技术、小程序、自定义DSL框架都在其中某个场景中发挥各自的优势。
此外,一些小而美的应用多数具有某些平台的创新特性,很多需要使用到平台独有的能力。