![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
iOS Dev
95后 iOS 资深工程师,关注大前端领域的技术栈。组件化、模块化、多端融合能力、动态化、架构设计、workflow、ci、cd 脚本等。 如果想和我交流,请联系我微博: http://weibo.com/u/3194053975
FantasticLBP
95后 iOS 资深工程师,关注大前端领域的技术栈。组件化、模块化、多端融合能力、动态化、架构设计、workflow、ci、cd 脚本等。
如果想和我交流,请联系我微博: http://weibo.com/u/3194053975
展开
-
写好测试,提升应用质量
相信在国内一些中小型公司,开发者很少会去写软件测试相关的代码。当然这背后有一些原因在。本文就讲讲 iOS 开发中的软件测试相关的内容。一、 测试的重要性测试很重要!测试很重要!测试很重要!重要的事情说三遍。场景1:每次我们写完代码后都需要编译运行,以查看应用程序的表现是否符合预期。假如改动点、代码量小,那验证成本低一些,假如不符合预期,则说明我们的代码有问,人工去排查问题花费的时间也少一些。假如改动点很多、受影响的地方较多,我们首先要大概猜测受影响的功能,然后去定位问题、排查问题的成本就很高。场.原创 2020-07-16 16:12:39 · 355 阅读 · 0 评论 -
Electron:PC 端多端融合方案
每天都要写第二天的 todoList。有一天在写的时候突然想到,为了让自己清楚知道自己需要做啥、做了多少、还剩多少没做,想写一个电脑端程序,在技术选型的时候就选了 electron。一、 方案选型3天时间写了个 PC 端应用程序。先看看结果吧为什么要选 electron 作为 pc 端开发方案?史前时代,以 MFC 为代表的技术栈,开发效率较低,维护成本高。后来使用 QT 技术...原创 2020-05-04 18:53:45 · 1886 阅读 · 0 评论 -
规范化团队 git 提交信息
同一个工程项目,为了方便管理,git 的 commit 信息最好按照一定的格式规范,以便在需要的时候方便使用。什么是方便的时候,比如出现了一个线上 bug,所以需要回滚操作,知道了提交信息可以方便的定位问题。代码 review 的时候也知道了该次 commit 干了什么,所以 commit 标准化好处很多,不再举例。实现可以马上想到的是利用 shell 结合 git hook 实现在 g...原创 2020-04-02 02:44:00 · 212 阅读 · 0 评论 -
浅谈iOS和Android后台实时消息推送的原理和区别
前言 iOS和Android上的实时消息推送差异很大,往小了说是技术实现的差异,往大了说是系统实现理念的不同。实时消息推送在移动端互联网时代很平常,也很重要,它的存在让智能终端真正成为全时信息传播的工具。本文将从原理上谈谈两个平台上实时消息推送的区别。简要对比iOS 系统的推送(APNS,即 Apple Push Notification Service)依托一个或几个系统常驻进程...原创 2020-04-02 02:25:07 · 1319 阅读 · 0 评论 -
字节序
最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。背景自定义报文,调用接口,服务端报文解析失败iOS 小端序查看 iOS 设备使用的端序 if (NSHostByteOrder() == NS_LittleEndian) { NSLog(@"NS_LittleEndian");} if (NSHostByt...原创 2020-04-02 02:19:45 · 147 阅读 · 0 评论 -
大前端动画
大前端开发中经常会遇到动画的开发,那么什么是动画?在物理学中运动就是研究物体在时间维度和空间维度上改变的现象,所以动画也一样,动画主要研究2个因素,发生运动物体的时间和空间。Web前端开发中的动画在 Web 前端开发中实现动画有2种方式。要么依靠 CSS 实现动画,要么依靠 JS 控制实现动画。CSS 实现动画首先要说 CSS 中的4个概念:animation、transition、t...原创 2020-04-02 02:04:32 · 167 阅读 · 0 评论 -
深入理解各种锁
乐观锁、悲观锁乐观锁对应于现实生活中乐观的人,思考事情总往好的方向发展;悲观锁对应于现实生活悲观的人,思考事情总往坏的方向发展。不同性格的人都有优缺点,不能抛开场景说一种人好而另一种人不好。乐观锁和悲观锁是一种广义上的概念,体现了看待线程同步问题的不同角度,在 iOS、Java、数据库中都有此概念。悲观锁对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定会有别的线程来修改数据,因...原创 2020-03-31 21:44:35 · 169 阅读 · 0 评论 -
App 上架包预检
一、 iOS 端常见被拒原因汇总App 内包含分发下载分发功能(引导用户下载 App 等功能)提供的测试账号无法查看实际功能通过接口返回布尔值判断 App 是否升级,但审核期间该接口不请求审核账号,任何时候在任何 ip 登录看到的都是审核版提供的登陆账号和密码不对,登陆不上运营填写的营销关键字有问题元数据问题,iPhoneX 截图中 iPhone 壳子是 iPhone7 的,应该是...原创 2020-03-31 21:43:47 · 258 阅读 · 0 评论 -
iOS 打包系统构建加速
目标iOS 单包构建加速、支持多包并行打包基础知识CI、CD 在稍微有点规模的公司内部都会内建一套自己的系统。目前主流的是在 Jenkins 的基础上进行的打包系统。公司只有1个 App 的情况下一台打包机就够了,但是有多个 SDK、App 那肯定不够的,各个业务线都需要测试、上架等等,任务太多了,一台机器别人要等到花儿谢了…分布式构建系统可解决上述问题,即一个 master 为中心,...原创 2020-03-31 21:42:45 · 594 阅读 · 0 评论 -
架构心得
2019-07月底跳槽,从事的工作内容是基础平台内容,主要是基础工具和 SDK 的封装;工程化 cli 落地、研发管理、静态代码扫描等。虽然以前写代码也是站在封装、复用、聚合等出发点写代码,但是还是和真正写 SDK 注意点有很多不同,这也是为什么写这篇文章总结的原因。一些注意点当你开发某个功能的时候,轻易不要使用第三方的库。为什么?因为你难以确保业务方是否也在使用这个库,可能库在使用了...原创 2020-03-31 21:41:35 · 145 阅读 · 0 评论 -
不一样的动态化能力
对于热修复,对于大多数公司来说都是可望而不可及的技术手段。热修复对于线上问题是杀手锏级别项目。Android 热修复方案很多,典型的属微信的 Tinker 莫属,而苹果公司对于安全的要求非常高,所以一些动态调用的能力都会被封杀,这篇文章主要研究下 iOS 端的热修复技术方案。热修复方案将下发的原生代码,通过自己实现的代码解析引擎,将代码转换为AST树,然后存储在相关的模型里面,在通过一...原创 2020-03-31 21:40:39 · 141 阅读 · 0 评论 -
移动端网络层优化
当关心 App 的用户体验的时候,不得不考虑网络层相关的问题。因为一个 App 通常来说网络层的操作占据了大多数的场景。几乎每个成熟的 iOS 项目都有一个网络模块,大部分的网络请求都是基于 HTTP 完成,iOS 端采用成熟的 AFNetworking 很容易完成一个功能简单的网络模块,但是使用起来往往会有大量的问题。所以网络层优化是需要大量的经验和知识水平的。对数据的分析和调研、用户反馈,现总...原创 2020-03-31 21:39:37 · 740 阅读 · 0 评论 -
组件化、模块化、插件、子应用、框架、库理解
作为大前端时代下开发的我们,经常会被组件化、模块化、框架、库、插件、子应用等术语所迷惑。甚至有些人将组件化和模块化的概念混混为一谈。大量的博客和文章将这些概念混淆,误导了诸多读者。所以本文的目的主要是结合作者本人前后端、移动端等经验,谈谈这几个概念。组件组件,最初的目的是为了代码重用。功能相对单一、独立。在整个系统结构中位于最底层,被其他代码所依赖。组件是 “纵向分层”模块模块,最初的...原创 2020-03-31 21:38:55 · 339 阅读 · 0 评论 -
OCLint 实现 Code Review - 给你的代码提提质量
工程代码质量,一个永恒的话题。好的质量的好处不言而喻,团队成员间除了保持统一的风格和较高的自我约束力之外,还需要一些工具来统计分析代码质量问题。本文就是针对 OC 项目,提出的一个思路和实践步骤的记录,最后形成了一个可以直接用的脚本。如果觉得文章篇幅过长,则直接可以下载脚本OCLint is a static code analysis tool for improving quality ...原创 2020-03-31 21:37:47 · 279 阅读 · 0 评论 -
App 瘦身之道
App 的包大小做优化的目的就是为了节省用户流量,提高用户的下载速度,也是为了用户手机节省更多的空间。另外 App Store 官方规定 App 安装包如果超过 150MB,那么不可以使 OTA(over-the-air)环境下载,也就是只可以在 WiFi 环境下载,企业或者独立开发者万万不想看到这一点。免得失去大量的用户。同时如果你的 App 需要适配 iOS7、iOS8 那么官方规定主二进制...原创 2020-03-31 21:36:36 · 1189 阅读 · 0 评论 -
大前端时代安全性如何做
之前在做过一些爬虫的工作,也帮助爬虫工程师解决过一些问题。然后我写过一些文章发布到网上,之后有一些人就找我做一些爬虫的外包,内容大概是爬取小红书的用户数据和商品数据,但是我没做。我觉得对于国内的大数据公司没几家是有真正的大数据量,而是通过爬虫工程师团队不断的去各地爬取数据,因此不要以为我们的数据没价值,对于内容型的公司来说,数据是可信竞争力。那么我接下来想说的就是网络和数据的安全性问题。对于内...原创 2020-03-31 21:34:47 · 237 阅读 · 0 评论 -
无痕埋点的设计与实现
在移动互联网时代,对于每个公司、企业来说,用户的行为数据非常重要。重要到什么程度,用户在这个页面停留多久、点击了什么按钮、浏览了什么内容、什么手机、什么网络环境、App什么版本等都需要清清楚楚。一些大厂的蛮多业务成果都是基于用户操作行为进行推荐后二次转换。另一方面是以日志的作用帮助开发者分析线上问题的一种辅助手段。那么有了上述的诉求,那么技术人员如何满足这些需求?引出来了一个技术点-“埋点”0...原创 2020-03-31 21:33:35 · 776 阅读 · 0 评论 -
如何打造团队的代码风格统一以及开发效率的提升
最近重构项目组件,看到项目中存在一些命名和方法分块方面存在一些问题,结合平时经验和 Apple官方代码规范 在此整理出 iOS 工程规范。提出第一个版本,如果后期觉得有不完善的地方,继续提出来不断完善,文档在此记录的目的就是为了大家的代码可读性较好,后来的人或者团队里面的其他人看到代码可以不会因为代码风格和可读性上面造成较大时间的开销。软件的生命周期贯穿产品的开发,测试,生产,用户使用,版本...原创 2020-03-31 21:31:53 · 821 阅读 · 0 评论 -
cocoapods 相关小技巧
1. 组件的地址我们在做组件化的时候经常将一些业务模块封装打包,做成 pod 管理的形式,然后当在开发的时候需要修改一些模块化的代码。当维护好组件的时候我们可能在一个新的工程设置好 podfile 引入组件,但是有可能需要继续修改组件的源代码,代码需要可编辑。所以我们可能需要将 Podfile 中的 pod 源修改为本地。然后安装 pod install 后就可以看到在项目文件里面有可编辑...原创 2020-03-31 21:30:29 · 473 阅读 · 0 评论 -
别搞混类别(Category)、拓展(Extension)
很多人都知道类别、分类的用法,但是对于一些细节就不是很清楚了,本文主要梳理下这3个概念的细节类别(Category)文件特征类别文件有2个,分别为 .h 和 .m命名为: “类名+类别名.h”和“类名+类别名.m”文件内容格式.h 文件格式#import "类名.h"@interface 类名 (类别名)// 在此处声明方法@end.m 文件格式#import ...原创 2020-03-31 21:27:50 · 321 阅读 · 0 评论 -
深入 KVC && KVO
基本用法字典快速赋值KVC 可以将字典里面和 model 同名的 property 进行快速赋值 setValuesForKeysWithDictionary//前提:model 中的各个 property 必须和 NSDictionary 中的属性一致- (instancetype)initWithDic:(NSDictionary *)dic{ BannerModel *mod...原创 2020-03-31 21:26:37 · 153 阅读 · 0 评论 -
Hybrid 设计与实现
之前的研究了 web 站点的数据安全,同时也用文章记录下来分享给大家。接着又研究了下 App 的安全,同样写文章记录下来现状目前 App 的安全比较低,体现在哪?很多人在想用了 HTTPS 不是就很安全吗?其实并不是,专业的抓包工具还是可以抓 HTTPS 包。根据接口规律,做自动化请求接口,将数据保存窃取是我们不想看到的结果。所以如果只用了 HTTPS 还是不安全。所以需要实现的安全表现...原创 2020-03-31 21:19:17 · 608 阅读 · 0 评论 -
老生常谈 RunLoop 下
//给 RunLoop 添加监听者- (void)testRunLoopObserver{ //创建监听者// CFRunLoopObserverCreate(CFAllocatorGetDefault(), kCFRunLoopAllActivities, <#Boolean repeats#>, <#CFIndex order#>, <#CFRun...原创 2020-03-31 21:15:11 · 173 阅读 · 0 评论 -
老生常谈 RunLoop 对象
iOS 中有2套 API 可以访问和使用 RunLoop。分别是Foundation:NSRunLoopCoreFoundation:CFRunLoopRef//Foundation[NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象[NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象 //Co...原创 2020-03-31 21:13:45 · 294 阅读 · 0 评论 -
iOS 数值计算精度丢失问题
在 iOS 中经常会计算金额和价格,我们有时会定义数据类型为 double 或者 float,这样在做过一些运算后会发现精度丢失了,这显然不是我们想要的结果。今日偶然间看到一篇技术博文,为了记忆,顺道解决我的这个问题,所以记录了下来。存在的问题(精度丢失)float a = 0.01;int b = 99999999;double c = 0.0;c = a*b;NSLog(@"c...原创 2020-03-31 21:02:14 · 1333 阅读 · 0 评论 -
CAShapeLayer 实现 QQ 拖拽小红点动画
一言以蔽之:CAShapeLayer 可以根据贝塞尔曲线描绘出的路径而生成对应的图形综合例子效果图关键技术点剖析分析 QQ 粘性动画的关键点就是当手势拖动时候2个圆之间那个形状怎么绘制答案:将2个圆的某一时刻之间形成的形状用数学抽象来计算。拖动到超过某个范围的时候怎么执行爆炸动画UIImageView 可以执行帧动画,类似于 Flash 效果关键代码- (...原创 2020-03-31 20:26:02 · 176 阅读 · 0 评论 -
复制层(CAReplicatorLayer) 动画
对于下面的效果大家是否有实现思路?有些人可能要说:老夫撸起袖子,敲键盘就是干,不需要手势交互,那么直接用5个CALayer,处理不同的位置以及定时器、透明度等等,貌似很简单。不不不,今天要带出来的主题是 CAReplicatorLayer1、CAReplicatorLayer/* The replicator layer creates a specified number of ...原创 2020-03-31 20:24:48 · 132 阅读 · 0 评论 -
NSRange 设计之美
typedef struct _NSRange {NSUInteger location;NSUInteger length;} NSRange;1、看到官方文档的源代码就知道 NSRange 是个结构体,但是如果是你设计一个这样的数据类型你会怎么办??设计成结构体,然后有些属性怎么办?比如为了开发者方便,让你设计出一个办法,让开发者可以很快知道这个结构体的上限是什么?苹果就很机智...原创 2020-03-31 20:19:28 · 72 阅读 · 0 评论 -
URL Schemes 的发展
URL Schemes 的发展过程可以说就是 iOS 效率工具类 App 的发展过程。起初的苹果建立的 Apple URL Schemes 只是用于自用,里面只有邮件、电话、iTunes 搜索、Youtube 视频等一些内置服务的 URL。个人认为 URL Schemes 第一次大火是在 2011 年末(如有异议欢迎指正),那个时期也是越狱的鼎盛时期,那个时期越狱后大家都会装的一个插件是 SB...原创 2020-03-31 19:57:33 · 252 阅读 · 0 评论 -
Native 端 WebView交互
可以通过本地文件、url等方式。NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:htmlPath]];[self.web...原创 2020-03-31 19:55:42 · 382 阅读 · 0 评论 -
事件响应者判定原理之 hittest 方法
一、 hittest 介绍就是用来寻找最合适的view当一个事件传递给一个控件,就会调用这个控件的hitTest方法点击了白色的view: 触摸事件 -> UIApplication -> UIWindow 调用 [UIWindow hitTest] -> 白色view [WhteView hitTest]二、 实验2.1 实验一定义 BaseView,在里面实现...原创 2020-03-31 19:53:53 · 2801 阅读 · 0 评论 -
教你实现微信公众号效果:长按图片保存到相册
不知道各位对于这个需求要如何解决?可能有些人会想到js与原生交互,js监听图片点击事件,然后将图片的url传递给原生App端,然后原生App将图片保存到相册,这样子麻烦吗?超麻烦。(1)、js监听图片长按事件;(2)、js将图片url传递给原生;(3)、原生通过图片的url生成UIImage;(4)、保存UIImage到系统相册,巨麻烦啊,大哥,我很懒的好不好那么问题跑出来了,怎么办最简单...原创 2020-03-31 16:08:08 · 3940 阅读 · 0 评论 -
对象在内存中的存储
一、 栈、堆、BSS、数据段、代码段是什么?栈(stack):又称作堆栈,用来存储程序的局部变量(但不包括static声明的变量,static修饰的数据存放于数据段中)。除此之外,在函数被调用时,栈用来传递参数和返回值。堆(heap):用于存储程序运行中被动态分配的内存段,它的大小并不固定,可动态的扩张和缩减。操作函数(malloc/free)BSS段(bss segment):通常用来存储...原创 2020-03-31 16:06:21 · 296 阅读 · 0 评论 -
实现外卖 App 双列表联动
用过了那么多的外卖App,总结出一个规律,那就是“所有的外卖App都有双列表联动功能”。哈哈哈哈,这是一个玩笑。这次我也需要开发具有联动效果的双列表。也是首次开发这种类型的UI,记录下步骤与心得一、关键思路懒加载左右2个UITableView根据需要自定义Cell2个UITableView加载到界面上的时候注意下部剧就好因为需要联动效果,所有左侧的UITableView一般是大的...原创 2020-03-31 15:58:43 · 331 阅读 · 0 评论 -
探索 iOS 事件响应者链
实验1:定义 BaseView,在里面实现方法touchBegan,监听当前哪个类调用了该方法。在控制器的界面上加5个颜色不同的view,每个view自定义view去实现,因此在不同的view上的手势就可以由不同的view拦截到。//BaseView#import "BaseView.h"@implementation BaseView-(void)touchesBegan:(NS...原创 2020-03-31 15:57:25 · 69 阅读 · 0 评论 -
如何优雅地调试手机网页
在web开发的过程中,抓包、调试页面样式、查看请求头是很常用的技巧。其实在iOS开发中,这些技巧也能用(无论是模拟器还是真机),不过我们需要用到mac自带的浏览器Safari。所以,本文将讲解如何使用Safari对iOS程序中的webview进行调试。1、打开真机(模拟器)的开发者模式【设置】-> 【Safari】 -> 【高级】 -> 【Web检查器】打开2...原创 2020-03-31 15:54:59 · 241 阅读 · 0 评论 -
iOS 界面显示原理
loadView作用:加载控制器的view何时调用:当控制器的view第一次使用的时候就会调用使用场景:只要想自定义控制器的view就调用此方法访问控制器的View就相当于调用控制器中的view get方法-(UIView *)view{ if(_view == nil){ [self loadView]; [self viewD...原创 2020-03-31 15:53:56 · 193 阅读 · 0 评论 -
看透构造方法
构造方法new 方法的内部就是先调用 alloc 方法,再调用 init 方法alloc 方法:那个类接受 alloc 消息,那么该方法返回该接受类的对象,并把对象返回init 方法:是1个对象方法,作用:初始化对象创建对象的步骤:先使用 alloc 创建1个对象,再使用 init 初始化这个对象,才可以使用这个对象使用1个未被初始化的对象是很危险的init 方法:作用:...原创 2020-03-31 15:52:31 · 102 阅读 · 0 评论 -
工程大小优化之图片资源
工程大小优化之图片资源一点点iOS项目本身功能较多,导致应用体积也比较大。一个Xcode工程下图片资源占用了很大的空间,且如果有些App需要一键换肤功能,呵呵,不知道得做多少图片。每套图片还需要设置1x@,2x@,3x@等简介IconFont技术起源于Web领域的Web Font技术。随着时间的推移,网页设计越来越漂亮。但是电脑预装的字体远远无法满足设计者的要求,于是Web Font技术...原创 2020-03-31 15:30:08 · 100 阅读 · 0 评论