一切还要从上一篇文章说起
在去年的初夏,我写了一篇博文,分享了一下我家的网络搭建方案。说来惭愧,本来这篇文章应该是在上篇博文之后不久就写出来的,结果因为各种事儿(懒)一直拖到了现在。
那为什么要写 Mesh 呢?上次文章在朋友圈中嘚瑟后,没多久被某大神点评了下,并建议了解下 Mesh。
Hyperloop 是服务于美团点评客户端的组件发版、持续集成、App 打包构建、资源调度等各个环节的发布调度系统。名称起源于美国 Elon Musk 构想的 Hyperloop 超级高铁,象征着现代、简洁、高效。
Hyperloop 提供了一站式的平台,管理着美团点评 iOS 业务的超过 300 个组件和包括美团 iOS 客户端在内的4个App。接入 Hyperloop 系统后,开发同学可以通过 Hyperloop 来管理自己的项目,配置发版和打包所需要的步骤和检查项。开发完成时,用户只需要登录 Hyperloop 进行相关操作,Hyperloop 就会根据项目的配置去调用不同的步骤,上报每个步骤的状态,给出错误日志、状态通知等。
2016 年 WWDC 的时候,苹果甩出了一个名为 APFS 的文件系统,就是 Apple File System 的缩写。刚听到苹果又推出了一个文件系统的时候,我其实并没有特别惊讶,甚至感觉有些习惯了,因为自打苹果用上了 HFS 后,每隔一段时间就会来一个变种,甚至说每一个设备可能都会有一种特殊的 HFS(据说 iOS 里面使用的 HFS 也是个独特的变种,连 macOS 的同学都不知道他们自己搞了一套),后来又有了 HFS+。
不过按照苹果的习惯,一旦一个技术为了适应苹果的产品而被改来改去,杂乱无章的时候,就意味着在不久的将来肯定会有个全新的技术来替代它,例如早些年用 clang 替换掉了 GCC,现在正在用 Swift 替换 Objective-C。
在 iOS 10.3 发布之前,我完全没有仔细地去了解过这个玩意儿,直到 iOS 10.3 beta 版出来后,大家惊呼 APFS 现身带来了更多的可用空间,我才意识到这个技术可能又是一个苹果新造的轮子。
果不其然,在和 HFS 抗争多年后,苹果终于发现这垃圾玩意已经没有改的价值了,所以另起炉灶,重新搞一套。传闻 APFS 项目中负责人为了保证不受其它已有文件系统的影响,不去看任何一个文件系统的实现原理和机制,从零开始,针对苹果现有的设备形态,打造的一个全新的文件系统。
在苹果官网 APFS 的介绍页,介绍了它的一些主要特性:
Apple File System is a 64-bit file system supporting over 9 quintillion files on a single volume. This state-of-the-art file system features cloning for files and directories, snapshots, space sharing, fast directory sizing, atomic safe-save primitives, and improved filesystem fundamentals, as well as a unique copy-on-write design that uses I/O coalescing to deliver maximum performance while ensuring data reliability.
简单来说,主要还是从效率和安全性方面做了很多改进。
平时一直和 @臧成威
等小伙伴做我们美团 iOS 客户端的发布工程相关事情,感觉和 iOS 越来越没啥关系了,有一天晚上吃饭,我们几个同学讨论要不然让成威在平时抽空给我们讲述一些 iOS 中好玩的东西,我们总结下来也算是一种技术积累和提升。
于是在我们的威逼利诱下,成威答应了这个事情。
此篇文章是在听了成威某一天的分享后,我抽空稍加调研总结出来的。
super
我们平时利用 OC 开发 iOS 的时候,会经常用到 super
这一关键字,比如我们在创建一个新的 ViewController
后会首先看到的:
1 | - (void)viewDidLoad { |
或者是我们在一个类的初始化器 (initializer
) 里面,我们需要这样写:
1 | - (instancetype)init { |
有时候我们调用一些其他的 CocoaTouch
方法,也需要我们手动调用 super
的方法,例如:
1 | - (void)updateConstraints { |
以上,都是我们平时比较常见的一些带有 super
的用法,看起来还是比较正常的,也比较能够清楚地知道这些用法的含义。
接下来我们看一个不太常见的代码。
不少 app 可能都有自动化测试的需求,尤其是规模起来后,大批量自动化测试可以减少很多机械化的人工测试成本,也能及时的查出一些比较关键的问题,可是基于 Xcode 的模拟器独占的特性,利用 Mac 集群测试不是一个比较合适的方案,另外通过 Debug 打出的包也不一定是和线上相一致的,所以利用 Release 包 + 多台 iOS 设备进行的自动化测试相对比较靠谱。
一般来说,大厂的 App 有两个证书进行签名打包,除了 App Store 上架用的,还有个用于内部测试,用的是企业证书。为了和正式包加以区分,与之相对应就会有两种不同的 App IDs 。通常来说,可能直接点的手法就是在打包之前手动更新 Info.plist
文件里的 Bundle Identifier
。
这样的做法可行,但是由于需要在打包的 Job 中进行更改,会有很多修改语句,如果 app 是一个有很多 target 的庞大工程,那么在打包脚本中就会出现这样的现象:
Ansible 是个什么东西呢?官方的 title 是 “Ansible is Simple IT Automation” ——简单的自动化IT工具。这个工具的目标有这么几项:让我们自动化部署 APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。
所有的这几个目标本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。
Ansible 基于 paramiko 开发的。这个 paramiko 是什么呢?它是一个纯 Python 实现的 ssh 协议库。因此 ansible 还有一个特点就是不需要在远程主机上安装 client/agents,因为它们是基于 ssh来和远程主机通讯的。