Releases: SwiftOldDriver/iOS-Weekly
老司机 iOS 周报 #67 | 2019-05-13
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
19 年老司机周报定制 T 恤上架啦
🚧 Google I/O for Flutter
@CrazyCoderShi:伴随着 Goole I/O 大会召开,Flutter 这几天又刷屏一波,一个好消息和一个坏消息:
- 好消息 | 全平台支持: Flutter 1.5 稳定版发布,并为我们带来了 Flutter for web - Hummingbird 以及可供嵌入式设备使用的 Flutter for Embedded。自此,也正如官方宣称的 Flutter 已经支持全平台。
- 坏消息 | 暂时无热更新: Flutter 官方开发团队宣布暂时不会开发热更新(Code Push)功能,原因如下:
- Code Push 在 Android 和 iOS 平台上各有不同的限制
- 出于安全方面的考虑,可能会被滥用
🐕 MongoDB 宣布收购 Realm
@xiaofei86: MangoDB徐娜不3900万美元的价格收购 Realm ,通过收购弥补了 MongoDB Mobile 在移动端的不足。 Realm 作为一款成熟的移动端数据库框架有着数十万的用户,并且在github上有着1w + 的star。
🐕 搞事情之 Vapor 初探
@老峰:从 Swift 开源并支持 Linux 运行之后,Swift Server Side 趋热,先后出现了 Perfect、Vapor、Kitura 和 Zewo 几个框架,其中 Vapor 目前在 Github star 数最多。
本文是作者对 Vapor 的探索实践,分享了在 Vapor 中 MySQL 的基础使用;在 Vapor 中的用户鉴权;以及自己实践中的心得体会。
相关阅读:
Swift HTTP Server 开发体验
Docker ❤️ Swift & Vapor
文章
🐕 泛型语法改进第一弹 —— Opaque Result Types
@享耳先森:Swift 5.1 将包含针对范型的一个重要改进 —— Opaque Result Types
:简单来讲,用 some
修饰的方法返回值或属性,其具体类型在编译时就能确定,并且是由被调用方去决定。
🐕 What should I learn if I want to contribute to the Swift compiler?
@莲叔: Compiler 相关的工作一直处于鄙视链的顶端,这篇帖子的楼主在 2018 年 11 月的时候给自己定了一个看起来有点梦幻的目标:2019 年末能够参与到 Swift compiler 的开源工作中去(即便是楼主自己也认为很梦幻)。但有爱的 Swift 社区告诉楼主这并不梦幻,可以实现。首先 codafi 提出事实上在 Swift 编译器源码中的 C++ 并不是 Raw C++,而更多是 LLVM C++(LLVM C++并不是一门语言,而是 LLVM 工程规定的一系列 API和规范),是复杂,但没有那么复杂, 所以从 LLVM 代码规范是最佳的入门材料,不用被 C++ 吓到。然后 Aljandro 甚至给出了编译器各个环节如 Lexer、Parser、Sema 到 SIL,LLVM IR 分别对应在哪些编译器的源文件中实现,简直不要太良心。除此之外,还分享了自己很多在 compiler 相关的大型项目中如何挖到合适的点切入的经验。
整个帖子有不少优质的回复,都是既具备专业性,又照顾了对 compiler 技术陌生的新人,不容错过。
🐕 大侦探福老师——幽灵Crash谜踪案
@邦Ben:该文闲鱼技术小编描述了出现 BUG 到分析 BUG,到如何最终艰难地找到 BUG 的过程,非常值得一看。最后也得出了结论:Flutter 在用户启动辅助功能(如阅读屏幕)的情况下会出现 Crash(新版本已经 fix,同学们都升级一下。)例外这里面还提及到两个有意思的点,线上 Zombie 野指针监控和 UI 自动化重现。另外有一个很重要的点:保持和用户的良好沟通,最后直接上门现场 DEBUG,没准还可以帮妹子顺手修修电脑 >_<。
参考链接:
🐕 LLVM 编译器中的内置 (built-in) 函数
@looping:以 __builtin_
开头的函数声明或者调用其实是一些编译器内置的函数或者编译优化处理的开关,其作用类似于宏,只不过这些内置函数并不是真实的源代码,而是一段指令块,起到编译时的内联功能。本文就介绍了八个特殊的内置函数及其用法,熟练使用这些内置函数可以提升我们程序的运行性能,也可以扩展一些编程的模式技巧。
🐕 What's new in RxSwift 5
@olddonkey:RxSwift 5 终于和大家见面了。RxSwift 5 带来了一些不算小的变化,比如有拆分 Relay 出 RxCocoa,成为独立框架,转用 DispatchTimeInterval 以对更小时间间隔的更好支持,舍弃 Variable,新增 do(afterNext:) 以及允许绑定多个观察者等变化。对于现有的 RxSwift 开发者来说,不算是根本上的变化,但是需要在一些使用习惯和语法上进行相对应的改变。
如果对英文版不是很有信心的话,也可以看看小集团队发布的中文翻译版。
🐢 深入iOS系统底层之映像文件操作 API 介绍
含笑饮砒霜: 所谓的映像可以理解为将一个程序文件的内容加载到进程虚拟内存中的内容,也就是说进程的映像就是程序磁盘文件在内存中的一个副本。程序文件和映像之间的关系就如程序和进程之间的关系是一样的。那关于进程映像操作的 API 有哪些呢:
- 获取当前进程中加载的映像的数量
- 获取某个映像的 Mach-O 头部信息结构体指针
- 获取进程中某个映像的名称
- 获取某个库链接时和运行时的版本号
- 注册当前线程结束时的回调函数
- ...
相关操作的 API 有很多,在 <mach-o/dyld.h>
都有声明。通过相关 API 的使用,可以检测程序中某个类的某个方法是否被非法 HOOK 了。可执行程序中定义的类的实例方法的实现地址总是在可执行程序映像的地址区间范围内,即使是这个方法被可执行程序中的其他方法 HOOK 了,这个 HOOK 的方法地址仍然是在可执行程序的映像地址区间范围内,我们仍然认为这是一个合法的 HOOK 。如果这个实例方法被恶意攻击者通过动态库注入并以方法交换的形式来 HOOK 原有方法的实现时,因为HOOK的方法地址是在恶意注入的动态库映像的地址区间范围内,所以我们就可以通过检测这个类的实例方法的实现地址是否在可执行程序的映像的地址区间范围内来判断这个方法是否被恶意 HOOK 了。
🐕 百度App iOS工程化实践: EasyBox破冰之旅
@xiaofei86:EasyBox 是手百开发的一套包管理工具集。致力于为超级 App 量身打造一套现代、高效、优雅的研发工具链。EasyBox 主体由工程组装器(Installer)、多仓库管理工具(MGit)、二进制管理工具(LFS)三部分构成,分别负责工作区的构建(组件依赖分析、工程的生成与组合)、源码仓库的管理以及二进制的管理。本文对 EasyBox 的设计进行了讲解,从中可以学到一些软件架构的思想和工程管理的经验。但并没有开放源代码。
🐢 Sharing code between iOS and Android using J2ObjC
tom: 这是关于跨平台开发的系列文章,之前作者还有讨论采用 C++ 来进行 iOS 和 Android 的跨平台开发。关于跨平台的好处就不多说了,这篇文章主要介绍了使用 J2ObjC 来进行跨平台开发。J2ObjC 是一个代码转换器,能够直接将 Java 代码翻译成 Objective-C 代码,从而达到跨平台开发的目的。注意的是,正如大部分的跨平台开发框架一样,一般跨平台代码只适合工作在 Model 层,在 UI 层的代码几乎无法做到一份代码共享多个平台(自带虚拟机或者语言翻译机的除外,如 RN、Flutter 等)。最后总结一下 J2ObjC 的优缺点
优点
- 代码共享
- 可以只用 Java 进行开发(Java 开发人员容易招,iOS 同学嘛)
- 可以在 iOS 工程中调试 Java 代码
缺点
- 代码翻译总是会出错的
- 如果需要 Swift 混编的话是个灾难
- 翻译出来代码不是最优形式,会增加包体积大小
- 翻译的范围有限制,仅限用可支持的 JRE 类
- 如果依赖了一些第三方库,而又与 J2ObjC 不兼容的话也是一个大问题
🐢 100-Days-Of-iOS-DataStructure-Algorithm
kyo: 算法应该是面试中大多数公司都会考察的点,虽然在日常的业务开发中可能并不常使用,但如果做一些深入的比较复杂的项目,算法就是必不可少了。可以说,如果在技术上想更深入的了解,算法和数据结构就是必须要熟悉的。在众多相关的文章中,以 C++,JAVA 等语言进行讲解的很多,很少以 OC 来讲的文章,而这个系列文章就采用 OC 为主语言,这对其他语言不太了解的同学来讲是个福音。
工具
SwiftKit
@张嘉夫:用命令行快速生成跨平台 Swift Framework,支持 iOS、tvOS、watchOS 和 macOS,兼容 CocoaPods、Carthage 和 Swift Package Manage,整合了 Fastlane 以便测试和发布,采用 Jazzy 来生成文档。此外还包括 README.md 模板、格式工具 SwiftLint、持续集成服务配置模板(Travis、GitLab)以及自动判断库名在 CocoaPods 上是否已被占用等等。
Messier - 简单易用的Objective-C方法跟踪工具
@红纸:Messier 可以用来跟踪 iOS 应用的 Objective-C 方法调用。在越狱设备上可以跟踪任意应用,在非越狱设备上也可用于跟踪调试中的应用或使用 Monkey Dev 植入框架的项目,仅支持 arm64 的真机。据文中作者介绍,其原理基于 Hook objc_msgSend 来实现函数记录,存储本地,使用自研工具导出文件后,使用 catapult 进行展示。另外调试过程中或多或少影响到了调试性能,适合查问题的时候进行植入。
代码
MaLiang - iOS 涂鸦库
anotheren: MaLiang 是 iOS 平台基于 Metal 的涂鸦绘图框架,完全使用 Swift 实现。
目前支持的功能:
- 笔迹通过贝塞尔曲线进行平滑处理
- 支持添加自定义贴图
- 纹理和贴图支持旋转
- 内置一个荧光笔特效的实现
- 可以根据压力自动调整笔迹,支持 3D Touch
- 支持撤销和重做
- 支持滚动和缩放画布
- 导出绘制内容为图片
- 将绘制内容保存为矢量文档和从文档恢复数据
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #66 | 2019-05-06
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新手推荐
Flutter 豆瓣客户端
@邦Ben:该开源库,对豆瓣客户端有一定的还原度,不过未实现部分也挺多,毕竟仅仅只是学习用途,暂时里面并没有用到更为复杂的 Rx 或者 Redux ,因此十分适合新手先上路。在学习 Flutter 的同学可以一看。
PS:项目需要还原一下 Podfile 为初始状态方可运行( BUG )
文章
🌟 🐕 移动开发这十年
@莲叔: 移动开发从诞生之日起,到现在已经过了十年时间,这篇文章是 InfoQ 邀请美团的藏成威老师回顾了移动开发技术的十年演变。笔者作为移动开发年限算比较久的老兵,有幸经历了其中大部分的浪潮。其中绝大多数技术升级都是围绕跨平台、动态性,归根到底技术体系的升级是围绕业务形态来决定的。文章比较全面的剖析了从 H5 hybrid,到 RN/Weex, 到 Flutter/小程序等不同阶段的跨平台技术。文章本身没有太多技术点,但非常适合拿来作为思考技术和业务是如何相互影响的素材,在阅读文章的时候要多问 Why,相信会有不少的收获。
🌟 🐕 🚧 Reducing FOOMs in the Facebook iOS app
@zvving:Facebook 2015 年的一篇经典文章,提出优化 OOM 问题的一些思路:
- 通过列举所有 App 被终止的已知路径区分是 FOOM 还是 BOOM
- 分析内存使用状况,从 UIWebView 迁移至 WKWebView,降低内存占用
- 避免内存重复申请与释放,减少多大 30% OOM Crashes
- 完善基础设施:跟踪 App 中每个类的实例计数和内存占用
相关阅读:iOS微信内存监控
🌟 🐕 iOS App 安全加固方案调研
@红纸:iOS 系统向来以安全著称,但是在越狱面前,我们的 App 接近于裸奔的状态。在本文中,作者整理了如下内容:
- 现有市面上已有的加固方案,以图片的方式,展示了各家公司的核心功能点。
- 对现有的加固方案,进行了一次规整,总体方案梳理
- 数据保护:细分中有网络数据、IPA 资源数据、沙盒数据、Keychain 数据
- 混淆保护:细分中有符号混淆、字符串混淆、指令混淆
- 反调试保护:细分方案有 ptrace 和 sysctl 两种防护策略,(有兴趣可以参考 关于反调试&反反调试那些事)
- 异常检测:动态监控 App 的异常信息,例如被注入、篡改代码、重签名等攻击行为
世界上没有绝对的安全可言,想要了解更多关于安全方面的知识,推荐沙老师的书《iOS应用逆向工程》,以及 念茜的安全攻防系列。
🌟 🐕 🚧 为什么需要 Reactive Programming?
@Jason:相信有不少同学都或多或少尝试过 ReactiveCocoa 或者 RxSwift,享受到了链式调用的快乐,但是对于 Reactive 思想的本质,可能不一定每个人都有深入的思考过。本文抛开 Rx 库本身,也没有再重复介绍如何使用 Rx,而是从一些日常开发过程中的问题出发,探讨 Reactive 思想的由来,它所解决的关于数据流、事件传播和观察者模式的一系列问题,以及作者在几年的使用中所领悟的一些更深层次的思考。
🐕 Architecturing an app with functional reactive programming
@anotheren:本文从常见的“回调地狱出发”,讲述了为什么应该使用响应式框架来进行编程。并以 ReactiveX 框架为例,同步展示了在 Swift/Kotlin 中这类框架的思想和应用,推荐阅读。
🚧 🐕 Optional, throws, Result, and async/await
@xiaofei86:在 Swift 5 之前,我们通过 optional 和 throws 来处理错误。在 Swift 5 中,虽然没有我们期盼的 async/await 特性,但在标准库中增加了 Result 类型。本文对这些 Swift 错误处理的方式进行对比,让你更好的了解 Swift 错误处理的进化过程。
工具
Xcode10 New Build System And CocoaPods
@享耳先森:Xcode 10 发布之后,你可能发现修改了 CocoaPods 依赖库的源码之后立即编译并不生效,必须 clean 整个项目重新编译,这其实是 Xcode 10 默认采用 New Build System
导致的,本文介绍了两种解决方案。
Marzipanify
@老峰:在 WWDC 2018 苹果分享了名为 Sneak Peak 的工具可以将 iOS APP 移植到 Mac 中,并宣布 2019 对第三方开发者开放,Marzipanify 是 Steven Troughton-Smith 自己开发的一个小工具让开发者提前体验 iOS APP to Mac APP,感兴趣的读者快来尝试吧。
代码
手把手教你在Flutter项目优雅的使用ORM数据库
@CrazyCoderShi:Flutter 现在开发上最大的槽点可能就是数据库使用了,Flutter 现在只提供了 sqllite 插件,手写 sql 代码,建表、建索引、transation、db 线程控制等等繁琐的事情必然接踵而至,这种数据库使用方式是最低效的了,又倒退回去裸写 sql,这对大部分团队都是重大的成本。
本文将详细介绍一种在 Flutter 项目中优雅的使用 ORM 数据库的方法,文中使用的 ORM 框架是包含在一个 Flutter 插件 flutter_luakit_plugin (如何使用可参考介绍文章)中的其中一个功能,本文只详细介绍这套 ORM 框架的使用和实现原理。并且给出了一个详细的 demo 。
开源库
NSFWDetector
@张嘉夫:CoreML NSFW(色情)内容检测器。NSFWDetector 是一个小型(17 kB)CoreML 模型,由 CreateML 训练,用于检测图片中的裸体。
InAppViewDebugger
@红纸:UIView Debugger,类似于 Reveal 和 Xcode 中集成的组件,其比较方便的是能够在 APP 内就可以直观的去查看,但目前它只是处于 1.0 版本,功能仅限于查看视图层级,期待其能拥有更加完善的功能。
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #65 | 2019-04-29
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
『基于多重替换方式的 iOS 代码混淆方案』- 勘误
在 65 期,我们收录了『基于多重替换方式的 iOS 代码混淆方案』一文,后经读者反馈,我们发现这篇文章的内容存在严重的抄袭迹象。文中涉及到的混淆方案抄袭自 @kaich 的 codeobscure。目前该文章的在知乎和掘金上已经被删除,周报也在第一时间删掉了有争议的推荐内容。对此次事件,我们对 @kaich 和广大读者表示抱歉,同时也感谢各位读者的监督和反馈。
另外,在收到反馈之后,我们小挖了一下那篇抄袭文的作者,发现此人是惯犯,洗稿专业户。他的 GitHub(RobinChao)和博客(Technical.io),真的是仿品聚集地。
WWDC 2019 for developers: Siri, Marzipan and AR improvements, more
距离今年的 WWDC 已经只有将近一个月的时间了,众所周知,WWDC 向来能带给行业和开发者带来全新的围绕用户体验新技术,本篇文章给我们介绍了本次 WWDC 会发布的新的 API 以及特性,主要有:
- 新的 Siri intents
- Marzipan 的优化(Marzipan 就是让 macOS App 也能用上 UIKit 的技术)
- Swift-only 的 AR 框架
- 震动引擎,NFC 在以前的基础上提供了更多的功能
- CoreML 支持动态训练以及音频的分析
新手推荐
How to make Auto Layout more convenient in iOS
@邦Ben:该文从 Frame 布局,到 Autoresizing 讲到了 AutoLayout,并且介绍了如何简单的进行封装 AutoLayout,以提高易用性。毕竟众所周知,原生的 AutoLayout 异常难用,在 OC 下,Masonry 的出现简直是拯救了世界。在 Swift 下,各种布局系统百花齐放。同时眼光不妨放到 React Native 和 Flutter 上,声明式布局非常值得学习。
文章
🐕 RxSwift & MVVM - How to use RxTests to test your ViewModel
@Damonwong:之前我问过好多人这样一个问题,你觉得 Rx 框架到底解决了一个什么样的问题?虽然答案都不太一样,但是引入 Rx 框架,便于封装 ViewModel,然后编写单元测试提高应用稳定性是大部分人比较认可的一点。
所以推荐大家阅读一下作者写了三篇关于 RxSwift & MVVM 的文章:
- 第一篇是 How to integrate RxSwift in your MVVM architecture:主要介绍了如何使用 RxSwift 编写 MVVM 结构的代码
- 第二篇是 RxSwift & MVVM - An alternative structure for your ViewModel:主要描述了一个 ViewModel 最基本的结构要怎么设计,我个人特别喜欢他在文中描述的 Intput 和 Output 的设计。这个设计也是为做单元测试做了一个很好的铺垫。
- 最后一是 RxSwift & MVVM - How to use RxTests to test your ViewModel:讲的是如何利用前面的 VM 设计 结合 RxTest 编写单元测试。
🐎 Conditional Compilation Part 1 Part 2 Part 3
本文讲述了 Swift 中方的条件编译。当然首先是传统的方法 arch(),作者对各个参数都做了详细的介绍。不过随着 Swift 4.1 的到来,你更应该了解一下方便好用的 targetEnvironment()(SE-0190)。其次是使用配置文件(.xcconfig),这个方式其实被 CocoaPods 大量使用。作者也用示例做出了详细的介绍,同学们不妨也在自己的工程中试一试。
后面陆续写了 Part 2 和 Part 3,主要是介绍了跨平台代码库编译选项的一些控制方式,对这方面有疑虑的同学可以看一看
🐕 Flutter 实时视频渲染
@CrazyCoderShi:Flutter 如火如荼的火了一段时间了,但鲜少有关于音视频方面的文章,本文是声网 Agora 的高级架构师张乾泽在 RTC Dev Meetup 上的分享,主要介绍 Agora 在 Flutter 实时音视频开发方面的实践经验,整个分享分三部分:
- 基于 Texture Widget 实现思路分析
- 基于 PlatformView 实现思路分析
- 两种方案的性能对比
🐎 对职业发展的一些想法
职业发展是每一个职场同学都会去思考的很重要的问题,我们也常常说有时候选择比努力更重要,除了个别的运气成分外,我们能过左右的就是如何去做选择。本文是 limboy 对职业发展的一些看法,从稀缺度和剩余市场空间这样两个角度去谈,结合生动的坐标图,让人一看就很明了。
🐕 How to run a single test in Xcode
@老峰:本文作者归纳总结了在 Xcode 中运行单元测试的一些小 tips:
- 通过 gutter (左边列)
- 通过 shortcut (快捷键 ^ ⌥ ⌘ U)
- 通过 scheme
- 通过 terminal
- 通过开源测试库如:Quick
🐕 iOS 中的 Promise
@四娘:当你需要连续地执行多个异步过程时,总会无可避免的出现地狱回调,Promise 是一个不错的解决方案,这篇文章前半部分主要讲了 Promise 具体的实现,后面介绍了一些实用的 API,感兴趣的朋友可以看一下。
🐎 Preventing Infinite Loops in Swift Property Observers
@张嘉夫:Swift 的属性观察器 (即 willSet
和 didSet
hook 函数)非常实用,可以用于验证、通知和调用 log 方法等等,适用于结构体、类和枚举。但在使用强大的属性观察器时,要避免搬起石头砸了自己的脚,这篇文章会为你介绍如何避免在 Swift 属性观察器中创建无限循环。
🐎 如何画出一张合格的技术架构图?
画架构图是架构师的第一门课,本文介绍了架构图的各种画法和具体案例,希望让大家在架构图方面的理念和经验得到提升
架构图分类
- 场景视图:一般就是我们理解的用例图
- 逻辑视图:一般是组件图和类图
- 物理视图:一般是部署图
- 处理流程视图:一般是时序图和流程图
- 开发视图:一般是包图
好的架构图:好的架构图是不需要解释的,它应该是自描述的,并且要具备一致性和足够的准确性,能够与代码相呼应
最后推荐 C4官网,有各种画图的模板可以参考
工具
MTHawkeye
@looping:MTHawkeye 是美图 iOS 团队开源的调试和性能优化辅助工具集,旨在帮助 iOS 开发者提升开发效率、优化性能体验。目前已经包含对内存、CPU、电量、网络等的使用监控。由于该工具模块采用了可扩展的插件式设计,所以我们也可以根据自己的需求定制合适的开发调试插件。详细介绍可以参考这篇文章 MTHawkeye:美图开源的iOS调试辅助、性能优化工具集。
代码
Swiftshield
@oldonkey:这是一套代码混淆工具,作用是加密工程的函数和类名,来免疫一些逆向工程。加密的原理很简单,就是把所有函数和类名都替换成一段新的字符串。此工具可以加密,也可以解密,以方便对 Log 进行 Debug。
开源库
IkigaJSON
IkigaJSON 是一个非常快的 JSON 解析器,它的解析速度大概是是 Foundation 中对应组件的 4 倍。它也提供了 SwiftNIO 的支持(同时也依赖 SwiftNIO),你可以直接从 ByteBuffer
对象初始化需要的 JSON 。
音视频
ggtalk | 聊聊我们的编程启蒙经历
@J_Knight_:本期 ggtalk 邀请的嘉宾是李亮老师和莲叔。围绕本期的主题,二位嘉宾和主持人梁杰都分享了各自的编程启蒙经历。
此外,还分享了对“中年危机”的看法以及关于小孩应该如何入门编程的讨论。
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #64 | 2019-04-22
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新手推荐
🐎 Designing Swift APIs
@zvving:如何写出可读性更高的代码?本文提供一些示例:参数标签可以帮助我们定义清晰易读的 API,嵌套类型能提供辅助的上下文关系,强类型为代码增添必要的仪式感,可扩展的 API 设计能同时满足便捷调用和丰富定制。
作者认为:『人人都是 API 设计师,当我们在设计非私有属性或方法时,我们都在设计 API』,你认为呢?
文章
🌟 🐕 Humble Asset Catalog & Assets Catalogs 与 I/O 优化
@looping:这两篇文章分别从各自的角度解释了在使用 Asset Catalogs 后,读取图片资源的速度变快的原因。
通过仔细阅读这两篇文章,我们能够更清晰地了解到:
- Asset Catalogs 和 car (Compiled Asset Catalogs) 文件的相关内容以及它们的作用
- CoreUI 框架对图片资源加载过程的一些逻辑细节
从而明白使用 Asset Catalogs 后,在加载资源上速度更快的原因:
- Asset Catalogs 会对图片进行分类压缩存储,减少在目标机型上的资源文件大小,提高读取速度
- 通过内存映射 (mmap),减少 I/O 操作,加速读取 car 文件内容
- car 文件实际上是一种特殊的 BOM 文件,能够在加载图片时直接获取 rendition、renditionKey 以及 attribute 这些信息,不同于从文件夹 (bundle) 中读取,需要执行耗时的
-[CUIMutableStrucetedThemeStore canGetRenditionWithKey:]
操作来读取 rendition 和 renditionKey
除了文章带给我们的结论,以及我们今后可以做的事情 (将常规资源文件都迁移到 xcassets 中) 之外,两位作者对问题的探寻和思考的方式也是非常值得学习借鉴的。
🌟 🐢 Let’s write Swift code to intercept SSL Pinning HTTPS Requests
@含笑饮砒霜:现在几乎绝大部分的 iOS App 都使用了 HTTPS 请求,这极大提升了我们使用的安全性,但也不意味着这就是绝对安全的。
如果想检查 iOS 应用中的 HTTPS 请求,最常用的方法就是中间人(MITM)攻击,这种技术需要使用某台主机作为代理服务器,为客户端提供服务。为了保证攻击成功,客户端需要将代理服务器的证书安装到设备的全局信任存储区中。这样处理后,客户端就会将证书添加到白名单中,允许与代理服务器之间的 HTTPS 通信。
如果想保护应用免受 MITM 攻击影响,可以使用 SSL 校验证书绑定,此时受信任服务器的证书副本会打包到 iOS 应用中,还有一些附加代码可以确保应用只与使用特定证书的服务器通信。当 SSL 证书绑定处于激活状态时,应用不会将任何请求发送到不受信任的服务器上。
即便如此,也依然可以绕过 SSL 证书绑定。也就是在具体请求通过受保护的 HTTPS 通道发送之前,尝试拦截这个请求,这需要将代码植入到应用中,这里会用到代码注入的相关知识。
如果想更细致的了解如何拦截 HTTPS 请求,本文不可错过,绝对深度好文。
🌟 🐢 干货 | 近万字长文详述携程大规模应用RN的工程化实践
@Damonwong: 如果谈起 React Native 在国内的业务落地,我可能第一个会想起的就是携程和赵辛贵老师。在上次听完赵兴贵老师分享的专题《携程无线持续交付平台工程实践》之后,意犹未尽,一直想更加深入了解一下携程在 RN 方面的技术探索。今天终于等到了携程的 RN 建设及他们设计的 CRN 的分享。这篇文章主要讲了下面几个事情:
- RN 在携程中的使用情况
- 携程基于 RN 优化的 CRN 框架的设计及使用
- CRN 做了哪些性能优化及实际效果比较
- 如何发布及运维
比较可惜的是没有看到这套系统相比较于原生开发,对业务增长,开发效率有哪些优化,所以比较期待后续能有这方面的分享。
最后,在文中提到将要开源的 CRN,也已经开源了,感兴趣的同学移步 携程开源RN开发框架CRN 查看。
🐎 JSON as configuration files: please don’t
@olddonkey:这是一篇 2016 年的老文章,但是其中的观点直到今天依然具有参考价值。
很多公司,很多团队使用 JSON 文件作为 App 的配置文件,不论是从远程下发,还是本地加载。
但是,在实际的项目中,用 JSON 来作为配置文件解决方案并不是个完美的方案,它存在的很多问题,这些问题会在实际中逐渐暴露。
文章作者围绕这他心中的几个缺点展开论述:
- 注释容易缺失。
- 可读性差。
- 过分严格的格式。
- 缺乏可编程性。
本文虽本意是针对 Web 开发提出观点,但是对 Mobile 开发也一样适用。
🐕 基于多重替换方式的 iOS 代码混淆方案
@含笑饮砒霜:代码混淆,是将计算机程序代码转换成难于阅读和理解但是功能上等价的行为。可用于源代码,也可用于编译而成的中间代码。混淆代码可以有效保护我们的源代码,阻止逆向工程,因为逆向可能会带来一些诸如程序漏洞等不可预知的问题。
目前常用的几种方法,像打乱代码格式,将代码中的元素,如变量、函数等改写成无意义的名字,甚至是重写代码的部分逻辑等,都或多或少的存在问题。比如对于支持反射的语言,代码混淆可能与反射发生冲突,被混淆的代码难于理解,而且也不能真正阻止逆向,只能增大逆向的难度。
对安全性要求很高的场景,这些常规的混淆方式,并不能保证源代码的安全。鉴于此,TalkingData 团队最终决定,自研一套能够完美集成到打包流程中实现自动化的无侵入的混淆工具。由于不同业务线的要求并不一致,所以 TalkingData 自研的这套混淆工具未必适用所有业务线。但文中提到的一些自研过程中可能会遇到的一些问题,值得我们去借鉴和思考。
🐎 Swift 5 Frozen enums
@没故事的卓同学:在 Swift 5.0 中编译器针对使用 C style 枚举增加了一类提醒(即使 switch
已经覆盖了所有的 case
依然会有这样的警告):
Switch covers known cases, but 'XXXXX' may have additional unknown values,Handle unknown values using "@unknown default"
提醒用户虽然现在你已经覆盖了所有的 case
,但是未来这个枚举值有可能会增加新的值,我建议你还是处理一下这样的情况。
不过有的枚举值作者可以保证未来不会新增值,针对这个场景苹果增加了 NS_CLOSED_ENUM
。如果枚举用 NS_CLOSED_ENUM
声明而不是 NS_ENUM
,Swift 使用这个枚举编译器就不会产生建议使用 @unknown default
的警告。
🐎 Asynchronous completion handlers with Result type
@邦Ben:Swift 5 中的标准库中加入了 Result Enum (success / failure),该文作者通过一个 URLSession 的请求例子,演示了使用 Result Enum 改造过程。使用 Enum 会让你的程序看上去更为简洁以及意思明确,详细请看文章内容。
🐕 Improve your iOS team’s productivity by building features as frameworks
@老峰:如果你使用 Swift 开发过大一点的项目,那么你可能会有这样的感受,明明只是修改了一行代码,但却把整个 App 重新编译了一次,花费了很多时间。
本文作者针对这一痛点提出一种优化方案,通过把功能独立的业务代码改为 Framework 动态库,这样就不会每次重新编译整个 Project,从而减少编译时间,文中结合示例代码给出了详细的优化过程。
尽管作者这一方案可以缩短编译时间,但如果 Framework 粒度太小,太多动态库反而会引起其他问题如增加 APP 启动时间、App 安装包变大;粒度太大,每次修改代码又会涉及多个 Framework ,编译时间优化又不会很明显,感兴趣的读者可以借鉴这一思路,做些有益的尝试。
🐕 How to deploy a Swift backend on Amazon AWS
@小非86:目前 Swift 的后端框架主要有 Perfect、Vapor、Kitura 和 Zewo 等。往期周报 推荐过使用 Perfect 开发后端的经验。本期推荐大家这篇使用 Kitura 开发后端的另一种尝试。
🐕 Disjoint-set union in C++ and Swift
本文使用 C++ 与 Swift 实现了简单的并查集。大家可以借此对比同一个数据架构在不同语言的实现。
工具
Accio
Accio 是一个基于 SwiftPM 和 Carthage 的包管理工具,其有以下特点:
- 依赖预编译,也就是二进制化。
- 自动集成到项目文件里,不像 Carthage 那样需要手动集成,这也解决了 Carthage 项目中最麻烦的部分。
- 基于 SwiftPM 的依赖管理系统,只要第三方库使用 Package.swift 声明即可,不需要去跟 xcodeproj 和 Cartfile 打交道。
- 基于 SwiftPM 的缓存管理,可以减少不必要的重复的下载和编译。
代码
Markdown Playgrounds for Swift
@莲叔:Markdown Playgrounds for Swift 是 objc.io 基于 Swift5 开发的一款 markdown 编辑器,最大的特性就是在你 markdown 中的 Swift 代码可以被执行。对比传统 markdown 编辑器,核心就是实现了 Swift 语法的高亮以及将 Swift 代码提取出来后用 Swift REPL 程序去执行并拿到返回的结果(Swift REPL 程序就是终端中的 Swift 命令)。整个工具是开源的,并且 objc.io 有一整套配套的教学视频(第一章是免费的)一步步的教你如何写一个类似的工具出来,从工具的属性可以看出从中可以学到各种高级的字符串处理(如符号高亮、代码提取等),算是非常不错的 Swift 学习材料。
音视频
🌟 深入了解 Flutter 的高性能图形渲染
@CrazyCoderShi:本视频为 Google Flutter 团队的软件工程师 Yuqian Li 在 2018 谷歌开发者大会做的演讲,内容包含 Flutter 介绍,Flutter 的工作原理(对比原生开发和其他跨平台框架),Skia 介绍,分析常见的性能瓶颈等,通过解决 Flutter 样例 App - Flutter Gallery 的性能问题(Issue #13736),与大家分享如何通过 Flutter 工具定位、调试和解决性能问题。
视频主要讨论点:
- Flutter 为何能够拥有媲美原生的高性能图形渲染
- 如何通过 Skia 调试来分析 Flitter 应用
- 关于 saveLayer 和 clipPath 的注意点
- 使用 flutter screenshot 截取 skp 来单步调试绘图指令
ggtalk | 向架构进发
@J_Knight_:本期 ggtalk 邀请的嘉宾是 Casa Taloyum,他所写的 iOS 架构系列文章在社区非常受欢迎。本期主要围绕“架构”这一主题,主要讨论了以下几点:
- 做架构到底是在做什么
- 架构师和工程价值观
- 架构师和高级工程师的区别在哪里
- 如何定义真正的问题
- 如何看待新技术和旧技术
除此之外,Casa 还分享了对跨平台技术以及区块链的一些看法。
推荐阅读:
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #63 | 2019-04-15
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
🌟 T 沙龙 - 互联网寒冬来袭,移动开发者如何破局
2019 年上海第一次 T 沙龙将于 4 月 20 日下午 1 点 30 分在上海虹口区天水路 172 号金融街海伦中心 B 座准时举办,此次活动邀请到了来自饿了么、iTutorGroup、极光、以及看雪论坛的业界资深从业者为大家分享他们在移动端技术深度和广度上的实践和思考。希望这次活动能对互联网寒冬下迷茫的移动开发者有一些启发,并成功破局!猛戳上方链接免费报名。
SwiftNIO 2.0 released
@四娘:伴随着 Swift 5 的发布,SwiftNIO 也正式发布了 2.0 版本,这个版本主要有两个大更新:
- 内置了 BoringSSL 作为 Vendor,不再依赖系统的 OpenSSL
- 使用纯 Swift 实现了 HTTP2 协议,不再依赖于 nghttp2
Smoke Framework 1.0 released
@享耳先森:Amazon 之前开源的 Swift Web Framework 发布 1.0 了,围绕着 AWS 的服务做了很多深度集成。1.0 使用 Swift 4.2, SwiftNIO 1.x 开发,即将发布 Swift 5 及 SwiftNIO 2 的版本,包含 SmokeHTTP
,SmokeAWS
, SmokeDynamoDB
, SmokeAWSCredentials
几个子模块。
新手推荐
🌟 🐕 纯 Swift 项目 - Xib | Storyboard 多人协作技巧
@looping:本文就针对大家在使用 Storyboard 后出现的一些问题或质疑,提出了自己的看法,并列举了相关实践和建议,从而说明 Storyboard 和 Xib 虽然存在一些缺点,但也是值得学习研究的:
- 通过定制规范,合理的任务分工,以及有节制的使用工具来避免多人协作的坑 —— 对 Storyboard 的滥用(作者在文章中也给出了他们团队使用 Storyboard 的规范);
- 通过良好的模块设计,熟练使用 Storyboard 分离代码的几个方案来避免由于 Storyboard 造成 ViewController 代码臃肿的问题;
- 需要修改类名或者变量名,应该善用 Xcode 的重构功能,来避免由于手动修改代码出现遗漏,导致应用崩溃等现象排查定位困难的问题;
- 经过测试,Storyboard 和 Xib 的执行效率并没有想象中的那么低,在重复创建实例时效率反而会比纯代码要高;
- 使用 Storyboard 和 Xib 进行布局,缺少约束或者约束冲突就会直接提示错误,适配不同设备也可以直接在 Interface Builder 上切换测试,效率和准确性比手写适配代码要高很多。
文章
🌟 iOS app 秒开 H5 优化总结
@折腾范儿_味精:为了让 app 里面的 H5 页面实现秒开的效果,很多项目都采用了加载本地 H5 离线包的方式。如何实现这样的秒考就得分别从两个方面着手实现。
- 离线包的分发与下载
- WebView 的本地加载
需要补充一点的是,本文在 WebView 本地加载上都是以拦截的思路进行本地加载,UIWebView 自然可以顺畅使用 NSURLProtocol 但是在 WKWebView 里就面临很大的阻碍,而作者给出的代替方案还是 WKURLSchemeHandler 拦截,但面临的代价也是本来前端无感的拦截方案现在被迫前端也得受影响,打包的时候对资源协议头进行适配,这一点和很多公司的离线包方案略有差异。
在 WKWebView 里,即便是使用 WKURLSchemeHandler,资源拦截的方式也面临着与安卓差异化严重,对前端侵入性严重等问题,很多公司的离线包方案选择了另外的一条路,App 起本地服务器 run 前端离线包页面,做到让 WebView 无感知当前是一个“离线”页面,这样做能够最大程度的让前端对于离线包“无感”,也能忽略掉拦截 API 的平台差异导致的框架实现差异。
关于起本地服务器的这套方案,可以参考 基于 LocalWebServer 实现 WKWebView 离线资源加载 一文。它介绍了基于资源拦截技术而实现的 H5 秒开方案,并且在文章点评中提到了还有另外一种 Local Web Server 的方案来实现离线本地 H5 页面秒开。对这个方案有兴趣的朋友可以详细的看一下本片文章给大家介绍的几套 Local Web Server 的开源方案并且文章还配有 Demo 代码可以参考。本文还向大家详细介绍了一下证书签名等部署本地服务会面临的问题。
🌟 🐢 Building a dynamic modular iOS architecture
@莲叔:在以往讲述 iOS 架构/设计模式的文章中,往往 focus 在某个功能模块如何设计,如:MVC,MVP,VIPER,MVVM 等,讲述整个工程的设计模式和组织方法的讨论并不多见。本文从整个工程的架构着手,提出了一种工程的分层的架构方式,并且通过针对不同的层选择动、静态度来承载,实现了易于拓展、可组合、低耦合的工程架构,同时能兼顾编译时间和启动时间。针对各种不同粒度的需求变更,feature 级或者流程级都能够很好地兼容,文章还给出了对初学者很友好的 example app 来描述其思想,避免了读者在工程配置上可能花费的探索时间(毕竟要配置一堆动静态库的依赖关系还是有点蛋疼的)。值得阅读。
🌟 🐢 百度 App 网络深度优化系列(一):DNS 优化
@kyo:在移动互联网时代,对于各家公司而言,什么东西最重要呢?我想大多数的答案应该是流量。本文当然不是讨论如何获取更多的流量等问题,毕竟那更多是产品运营的事情,而为流量做保驾护航的,就是网络。所以,如何优化网络,也是各厂纷纷探索的方向。对于流量越大的 App 而言,网络优化所带来的收益也越大。本文由百度 App 研发团队所写的[百度 App 网络深度优化系列]的第一篇,DNS 的优化,从百度这个亿级日活的 App 自身的实践中总结出来的,非常值得好好看下。
🌟 🐎 Pure protocol factory for Interface Builder-based views
@looping:多人协作引起的代码合并冲突是我们使用 Storyboard 进行开发时常会遇到的比较头疼的问题了。避免这类协作问题的常用解决方案就是制定规范,规定一个界面用一个 Storyboard,并由单人维护。这样虽然解决了协作问题,但假如在写实例化代码时不进行优化,还是会存在一些不太友好的冗余代码,甚至硬编码。例如,let controller = UIStoryboard(name: "MyViewController", bundle: Bundle(for: MyViewController.self)).instantiateInitialViewController() as? MyViewController
。
本文作者就分享了一种优化思路,他通过设计一个 UIViewController 的协议(protocol)IBConstructible —— 带有 nibName 和 bundle 这两个属性,利用 Swift 允许通过扩展(Extension)为协议提供默认实现的特性,使得最终实例化代码变得非常简洁,let controller = MyViewController.fromNib
。
如果有在使用 Storyboard 进行开发的团队,但还没有对相关代码进行优化的话,可以参考本文提供的方案来处理,让代码变得更加简洁。如果已经优化过的,不妨也分享下自己的思路。同时本文的优化技巧也是可以用在很多代码重构的场景上的。
🐎 RunLoop 实战:实时卡顿监控
@kyo:虽然移动设备的性能越来越好,但为了追求更好的体验,卡顿依然是我们日常开发中不可忽视的问题。目前,各个公司都会采用各种三方库或者自己写的库来监控卡顿,但无论什么库,监控卡顿必然绕不开 Runloop。本文作者简单介绍了监控卡顿的原理,然后利用 Runloop 的特性制作了一个可以监控卡顿的 Demo。
🐎 Indeterminate Types chuwith Codable in Swift
@极速男孩 : Codable 是在 Swift 4 以后引入的一种序列化和反序列化的协议。本文主要介绍了两种对于在 Codable 协议中,处理不确定类型的两种方式:
- 通过枚举去关联想要存储的不同类型的属性值。
- 使用
Any
关键字去存储想要的类型。
本文在这里主要推荐使用 Any
关键字, Any
和用美剧的方法相比在保持类似的开发体验的同时,可以灵活的去修改。
由 yuhanle 推荐
🐎 一篇文章读懂 HTTPS 及其背后的加密原理
@J_Knight_:作者以使用 HTTPS 的缘由为切入点,从对称加密和非对称加密的对比,数字证书,数字签名,以及 HTTPS 通信的建立流程这几个方面介绍了 HTTPS。
🐕 Stubbing in pair with Swift compiler: a spy registration
@zvving:45 期我们曾介绍过 Unit tests 中轻量级 stubbing 实现,其中测试用例执行前注册 stub body 的过程略显繁琐。
如今作者更近一步,设计一套名为 arguments spy 的可插拔机制,尝试解决 Unit Tests 中动态修改 stub body 实现的困扰。对函数式编程感兴趣的同学不要错过。
工具
optionals
@张嘉夫:一个展示 Swift 可选型(optional)各种用法的网站。
onesignal
@邦Ben:国外的一个集合型的服务(移动推送,Web 推送,内购,邮件),老套路,基础服务免费,高级服务氪金。因此,如果有海外业务的同学和开发个人 APP 的同学不妨看看。
代码
Solutions to LeetCode by Swift
@zvving:算法已经成为各大公司面试必考项目。刷 LeetCode,无论是准备面试还是锻炼自己的算法和编程能力都很有帮助。网上 Swift 解法实现不多,这个版本相对完善,在代码规范、分类、时间(空间)复杂度梳理等方面可圈可点,值得参考。
LeetCode 已入驻国内,中文名『力扣』,可以一试。
相关阅读:
Codextended
@张嘉夫:让 Swift 的 Codable
API 更容易使用的一套 extensions,赋予其类型推断(type inference) 能力。Codextended 既不是 wrapper 也不是全新的框架,而是用一种极其轻量的方式来增强 Codable
。Codable
很强大也很方便,但如果你需要一定程度的自定义的话(例如转换部分 decoded data,或为某些键提供默认值),Codable
的标准 API 就会变得相当啰嗦。它没有充分利用 Swift 强大的类型推断能力,导致产生了很多不必要的重复代码。Codextended 就旨在解决这个问题。
Brooklyn
@享耳先森:受苹果 2018.10.30 发布会启发,设计并开源的一个屏保程序,非常漂亮,可在终端执行 brew cask install brooklyn
安装。
SecureDefaults
@小非86:SecureDefaults 是对 UserDefaults 的轻量封装,使用 Swift 编写,并额外支持 AES-256 加密(密钥 256 位)。如果你想改善 App 持久化数据的安全性,又执意要使用 UserDefaults 的接口,SecureDefaults 提供了 Keychain 之外的另一种灵活选择 。
书
🌟 🐎 Swift 5.0 中文版官方文档
@老峰:上个月 Swift 5.0 正式发布了,这是 Swift 发展史一次重要的迭代。SwiftGG 翻译组最近也更新了 Swift 5.0 中文版官方文档,内容覆盖了 Swift 的基础语法结构以及各种高级特性,感兴趣的读者快来学习吧。
音视频
🌟 ggtalk | 三组织揭秘:知识小集 x iOS 周报 x SwiftGG
@Parsifal:知识小集 x iOS 周报 x SwiftGG 已经成为 iOS 圈子内为大家所熟知的三大社区组织。这一期 GGTalk 邀请到了我们三大组织的创始人 - 小集 南峰子,SwiftGG 的 梁杰,以及我们周报团队的一代目 卓同学,一起谈谈我们这三大组织的故事。
周报团队从 18 年 1 月份第 1 期到现在第 63 期,已经一年多了,期间除了春节等特殊节假日,没有断过更新。但周报其实在这一年多的时间里,也有遇到过不少小问题。我从去年 10 月份左右从老卓手上接过周报的运营工作,至今正好是半年。基于老卓打下的基础,还有周报 30 位编辑的一起努力,我们依旧在每期稳定地输出高质量内容,并尝试了掘金沸点、话题讨论和GitHub Release 等全新的方式,公众号在 @Damonwong、@邦Ben 和 @红纸 地运营下,也逐渐走上正轨。至此我也能说上一句不负所托。
虽然正如梁杰所说的 “组织总有尽头”,但我还是希望周报在未来的日子里还会有三代目、四代目……感谢我们三大组织的所有参与者,以及我们所有的读者和听众。
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #62 | 2019-04-08
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
欢迎我们的新编辑 @CrazyCoderShi 加入周报团队,@CrazyCoderShi 在跨端方案尤其是 Flutter 方向均有较深的研究,希望接下来能为大家带来更优质的相关内容~
新闻
Can we do something for 996 programmers in China?
996.ICU 在近来在国内互联网圈子里引发了不小的轰动,GitHub 上的仓库已经累计了 18w+ 的 star。而 Python 之父 Guido van Rossum 也同样关注着这个事件,早先就在推特上发声,而现在又在社区发起了一个讨论,希望能征集到一些切实可行的措施来改善这一现象。
新手推荐
🌟 flutter_go / flutter_ui
@CrazyCoderShi:Flutter 自打发布以来一直是热门话题,对于新手入门来说,一个完整且规范的项目是不可多得的学习资料,flutter_go 出自阿里拍卖前端团队,flutter_ui 出自 YY 团队,两者均提供了丰富的组件示例,代码规范完全遵循 Effective-Dart 规范,新手入门 flutter 必备,通过这两个项目您将学习到以下知识点:
- flutter 基础组件的使用方法
- flutter 动画应用( flutter_ui )
- 基于 scoped_model 的 flutter 状态管理 ( flutter_ui )
- 如何组织一个多 tab 应用
🐕 简单易懂 KVC 基础篇
@JimQ:一篇循序渐进地介绍 KVC 这门技术的文章。
- 首先,分普通和特殊用法两部分讲述了与 KVC 相关的一系列 API 接口,并给出了这些 API 的思维导图;
- 原理解析与实践,指出 KVC 协议中最关键的部分就是访问者搜索模式,并介绍了其中一种模式即可变数组的搜索模式;
- 最后,讨论了 KVC 与 KVO 的实现机制之间是否有相关性,认为 KVC 是 KVO 实现的基础。
文章
🌟 🐢 小程序渲染架构设计
@折腾范儿_味精:BATT,微信,支付宝,头条,百度,都纷纷推出了自己的小程序,小程序这个概念已经广泛的渗透到了各大公司各大平台。
- 小程序的架构有什么好处?为什么各大公司都倾向于用这样的小程序式的架构?
- 小程序的架构是什么样子?这一套架构实现上与 H5/RN/Flutter 他们之间有什么差异?
带着这些问题,来深入这篇文章,让我们从,用户的角度/平台的角度/架构与代码实现的角度,深入剖析一下“小程序”
🌟 🐕 燃烧我的卡路里——Flutter 瘦内存、瘦包之图片渲染组件
@tom510230:本文介绍了闲鱼在做 Flutter 工程中具体遇到的性能优化场景,并且提高了解决思路
-
内存问题 --- 连续 push flutter 界面内存累积
-
安装包问题 --- 过渡时期两份重复资源文件
-
寻址缓存问题 --- 原有的寻址缓存策略无法复用
-
图片复用问题 --- Native 和 Flutter 重复下载相同图片
总体而言,Flutter 要想获得跟 native 差不多的性能,在不依赖原生 hybrid 组件的前提下,要对 Flutter Engine 做深度的定制,本文聚焦在了 OpenGL 渲染方面的性能改进。
🐢 运行时 Hook 所有 Block 方法调用的技术实现
@含笑饮砒霜:项目中为了监控拦截或统计一些行为时,可能会用到 Hook 机制。可以使用 Method Swizzling 技术去 Hook 一个 OC 方法,可以通过修改导入函数地址表中的信息来 Hook 一个 C 函数,那如何 Hook 一个 Block 对象的函数调用呢?这需要解决如下问题:
-
如何在运行时将所有的 Block 的 invoke 函数替换为一个统一的 Hook 函数
-
这个统一的 Hook 函数如何调用原始 Block 的 invoke 函数
-
如何构建这个统一的 Hook 函数
Block 对象也是一种 OC对象,通过探究,最终要执行替换的是 retain 方法, 至于为何以及如何替换 retain 方法,有兴趣的同学可以参考学习一下。
🐎 跨平台技术演进
@aaaron7:随着 Flutter 越来越流行,标志着无线端跨平台技术进入了第三个阶段,从最开始的 H5 + Native 的 hybrid 应用,到基于 DSL + 原生组件的 RN/Weex, 再到 DSL + 跨平台渲染组件的 Flutter。这些年跨平台技术的快速迭代,也促进了无线端技术栈和前端技术栈进行了各种各样的融合与尝试,也演化出类似 PWA,小程序这样独特应用场景的创新技术。本文作者总结了这一系列的技术,并针对性的分析了优缺点,算是不错的科普文章。深度一般,适合对相关技术不太了解的技术同学学习。
🐎 Swift Tip: Collection Protocols
@享耳先森:在 Swift 中,有许多 Collection
相关的协议,每个都有自己的作用,了解这些协议各自的作用,在写算法时将非常有帮助。本文摘录自 Advanced Swift
这本书,作者们正在更新 Swift 5 相关内容,如果你之前买过电子版的话,将能免费更新。
🐢 A Glimpse into Generic Meta-Programming in Swift
@老峰:VFL(Visual Format Language),是苹果公司为了简化 Autolayout 的编码而推出的抽象语言,其表达式通常是字符串,编译器无法在编译期验证表达式是否有误。基于这样的背景,本文作者以构建一个在编译期确保安全的 VFL 助手库为例,介绍了Swift 中的泛型元编程,点击这里查看本文 源码,这里有这篇文章的 翻译 可供参考阅读。
🐢 Introduction to Swift Keypaths
@极速男孩 :在 Swift 中可以方便的通过 Keypath 对一个类进行类型安全的赋值和取值操作。本文首先介绍了 Swift 中的 Keypath 的基本用法和概念,然后给出一些实际的例子,并就如何在日常工作中使用 Keypath 给出一些建议和提示。
由 yuhanle 推荐
🐢 The Pragmatic Guide to Scalable Swift Architecture for 2019
@四娘:这算是一篇架构散文,作者在文章里通过一问一答的形式去阐述自己对于架构的理解:
- 高薪程序员是如何在团队里逐步推进架构改造的?
- 如何解决异步代码逻辑分散的问题的?
- 如何在依赖注入时保障安全性和可复用性?
- 如何通过状态和事件的解耦让 ViewController 的代码质量变得更高?
- 如何解耦 ViewController 里的跳转逻辑?
设计
🐕 Everything you need to know about Loading Animations
@张嘉夫:这篇文章对加载动画进行了深入的介绍,包括加载动画的发展历史、入门指南、何时应该简洁何时又应该充满细节、实用的工具和资源等等,可以帮助你创造更加优秀的用户体验。
工具
cocoapods-binary
@小非86:在 CocoaPods 中,即使没有对项目中的 Pod 进行任何修改,Xcode 也仍然会重新编译 Pod。这在大型项目中是一件十分痛苦的事情。因此,Carthage 甚至将二进制管理作为其核心功能。但其实 CocoaPods 在官方指南的“插件”章节介绍一款可以支持二进制管理的 CocoaPods 插件 CocoaPods Binary。
CocoaPods Binary 通过在 Pod 安装期间预编译你的 Pod,然后将二进制产物(例如:Framework 文件)添加到生成的 Pods 项目中,使 Xcode 没有重新编译代码的机会,以此实现二进制管理。
CIFilter.io (Core Image Filter Reference)
@anotheren:CIFilter
是 Core Image
的一个重要组成部分,但是 Apple 提供的 文档 已经提示不再更新,缺少新加入系统的 CIFilter
的使用说明。CIFilter.io 提供了完整的列表搜索,以及其相关用法。甚至它还提供了一个 App 来展示各个 CIFilter
的实际使用效果,你可以在 这里 找到相关源码。
代码
🌟 Matrix for iOS/macOS
@J_Knight_:Matrix for iOS/macOS 是一款微信团队研发并日常使用的性能探针工具,目前集成在 iOS 和 macOS 微信的 APM(Application Performance Manage)平台中使用。
Matrix for iOS/macOS 当前监控范围包括:崩溃、卡顿和爆内存,目前包含两款插件:
- WCCrashBlockMonitorPlugin:捕获卡顿堆栈插件,基于 KSCrash 框架开发,具有如下特点:
- 通过检查 Runloop 运行状态判断应用是否卡顿,同时支持 iOS/macOS 平台;
- 具备耗时堆栈提取能力,可获取最近时间最耗时的主线程堆栈。
- WCMemoryStatPlugin:内存监控插件,能够全面捕获应用出现爆内存时的堆栈以及内存分配的情况,具有如下特点:
- 在应用运行期间获取对象存活以及相应的堆栈信息,在检测到应用爆内存时进行上报;
- 使用平衡二叉树存储存活对象,使用 Hash Table 存储堆栈。
推荐阅读:
🌟 objc_msgSend_hook
@红纸:作者利用 fishhook 原理巧妙的实现了对于 arm64 架构下 objc_msgSend 函数精简版的 Hook,代码量很少,可以有效工作且每一行代码都有注释(贴心~)。
由 @首先很有趣 推荐
RoughSwift
@在等简历の邦Ben:Swift 写的一个卡通手绘风格图形库,提供了所有基本类型(线,矩形,圆,圆弧等等),包括 SVG path。如果有同学想做点萌萌有趣的 APP 不妨考虑使用一下。
LVThemeKit
@JimQ:作者开发中用到多个区域切换多套皮肤的功能,之前版本中新增功能或主题时要新增许多冗余代码,针对此借助 OC 的泛型和 KVC 进行了一次重构,代码是重构后的实现。
由 吕鹏伟 自荐
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #61 | 2019-04-01
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
🌟 Swift 5 正式发布
Swift5 正式更新,官方提供了更新笔记说明,我们周报编辑团队的 @Tom 组织 @老老老老老老老驴,@小非86,@邦ben 和 @极速男孩 为大家做了第一手的翻译工作,方便大家了解这次对于 Swift 发展史很重要的迭代。
🌟 支付宝移动开发平台 mPaaS 正式向个人开发者开放
mPaaS 是支付宝移动开发所依赖的平台服务,它承载了支付宝这种超级 App 的日常迭代。过去半年左右的时间,mPaaS 持续向社区输出自己的一套软件开发和管理方案。之前 mPaaS 服务只对企业级用户开放,而这周支付宝宣布这套开发平台也正式向个人开发者开放。个人觉得,就算不使用这个平台服务,通过浏览其功能的相关文档和接口规范,也能获得不错的收获。
Shortcuts 2.2 Brings New Apple Notes Actions, Travel Time Enhancements
在苹果将 Workflow 纳入自家门下之后,越来越多的 私有 API 开放给了捷径应用。就在本周,捷径发布了其 2.2 版本。原先需要打开 Notes APP,再进行捷径操作。如今已变成了后台 API 访问的形式。除此之外,还增强旅行时间功能,其基于 Apple Maps,有更多的变量可以让你去选择,例如时长、距离、最佳路线等。
新手推荐
🌟 代码自解释不是不写注释的理由
代码注释通常有两种形式:要么没有和要么毫无用处 。作者认为自解释的代码是不存在的
,应该让注释成为代码的一部分。如果你对代码注释有任何疑问,推荐阅读此文。
Swift 4.2 improves Hashable with a new Hasher struct
Swift 4.2 优化设计了 Hashable 协议,引入了新的 default implementation func hash(into: inout Hasher)
,并以 Hash-flooding 攻击为知识背景详细介绍了为什么 Apple 官网文档不建议继续使用 var hashValue
的原因。
@sunsetwan 推荐
Swift, more elegant code: Typealias
本文作者使用两个例子,一正一反,运用对比论证的手法,生动形象地说明了 Typealias 的恰当用法。
别名的使用,在于将很长的声明类型缩短,增加可读性。常用于在 Swift closure (类比 Objective-C block typedef
场景)。
typealias Success = (_ data: Data, _ message: String, _ status: Int, _ isEnabled: Bool) -> ()
@sunsetwan 推荐
文章
🌟 🐢 Flutter 实现原理及在马蜂窝的跨平台开发实践
马蜂窝团队根据他们对 Flutter 在马蜂窝商家端的一个小尝试,总结了他们对 Flutter 一些看法。文章主要分为三个部分:
- 第一部分,主要说了马蜂窝为什么想尝试 Flutter 技术,并总结了 Flutter 基本架构和实现原理
- 第二部分,主要讲了 Flutter 在马蜂窝商家端 App 中的应用实践,如何在两端集成、如何交互以及部分性能对比。
- 第三部分,主要总结了如何管理「页面混合栈」以及对 Flutter 应用总结。
如果还没有开始尝试 Flutter 朋友,这会是一篇很不错的参考文章哦。
🌟 🐕 VIPER best practices for iOS developers
本文是作者在过去一年对 VIPER 架构最佳实践系列分享的第二篇。主要包括以下内容:
- 使用 VIPERA 代码生成工具自动生成 VIPER 各个模块
- 以 App 首页业务为例结合 Promises 分别实现 View、Interactor、Presenter、Entities、Router 、Services
- VIPER 模块间通信
结合 Promises 基于 VIPER 架构可以使代码结构更加清晰,更容易做单元测试,更易复用,点击这里阅读源码。
对 VIPER 架构感兴趣的读者可以扩展阅读作者这个系列教程第一篇:各种架构及 VIPER 基本概念,第三篇:面向协议编程在 VIPER 架构上的实践。
🌟 🐕 iOS 开发中的 Web 应用概述
移动开发领域近年来已经逐渐告别了野蛮生长的时期,进入了相对成熟的时代。而一直以来 Native 和 Web 的争论从未停止,通过开发者孜孜不倦的努力,Web 的效率和 Native 的体验也一直在寻求着平衡。本文聚焦 iOS 开发和 Web 开发的交叉点,希望能通过简要的介绍,帮助开发者一窥 Hybrid 和大前端的构想。
🐎 CodeHub#1 回顾 | 敏捷开发与动态更新在支付宝 App 内的实践
本文解释了支付宝 App 的一些架构实现细节,支付宝的架构设计需要满足的目标有
- 多应用的生态:不限于形式,原生模块、离线包、小程序。
- 开放:底层同一个架构,业务很方便的迁移。
- 动态化:业务可以随时在线更新,无需发版,随时响应线上活动,比如双十一、双十二,春节扫福等活动
- 高可用、高性能、高灵敏度:完善的监控运维体系、发现问题后多层次的修复技术、客户端良好的性能启动体验,强大的网络性能,防刷抗流量等。
从整体上来说,一个超级 App 的发展过程,对于前后端的架构设计都会提出不同的演化目标。目前支付宝也开源了面向移动开发的一站式解决方案 mPass,能有效地减少研发成本,提升开发效率,可以多关注一下。
🐕 What’s new in Swift 5.1
令 Swift 程序员们热泪盈眶,翘首以盼的 Swift5.0 已经发布了,带来了 ABI 稳定等一系列激动人心的特性。按照 Swift 一贯的节奏,当一个版本发布时,人们往往就已经开始关注下一个版本,比如这篇文章为我们简单的介绍了一下 Swift5.1 中目前已经基本确定的新特性,比如 Self 的新用法,optional 枚举的匹配以及数组的 difference 直接计算等,个人觉得最好玩的应该是最后一个点。基于这个特性应该可以做很多有趣的文本应用。感兴趣的同学可以仔细看看文章。
🐎 Deep dive into Pattern matching with ~= operator
Swift 中的 switch-case
语句非常强大,灵活配合 turple
, case let
, where
能写出可读性很高的代码。
但是,你知道 switch-case
语句模式匹配的具体过程吗?是否支持自定义类型?标准类型的模式匹配如何扩展?你可能想不到,简单的重写 ~=
运算符就能实现这些强大的功能。本文带你快速了解这一模式匹配过程。
🐢 XcodeKit and Xcode Source Editor Extensions
Xcode 8 提供了 Xcode Source Editor Extension方式来开发 Xcode 插件。本文详细介绍了插件的制作过程如 Menu Items 设置、XcodeKit Inputs and Outputs 处理、以及一些开发调试中的一些 Tips 等。在往期周报中已有不少相关内容的推荐,对 Xcode Extensions 感兴趣的读者不妨一看。
推荐阅读:
🐢 How to implement service oriented architecture using swift
基于服务的架构是一种组件模型,它将应用拆分成多个功能单元(服务)暴露给上层进行调用,并通过这些服务之间定义良好的接口和契约联系起来。
这篇文章讲的就是这种架构在 iOS 里的使用,作者讲述了他对于服务的定义,接口的构建,架构具体的分层,依赖注入的实现,并且基于这一套理论实现了一个用户信息管理功能。
工具
🌟 通过异步生成 dSYM 实现极速打包
对大型应用来说,进行编译打包通常比较耗时。通过对编译时间的分析可以发现,大约有两分钟的时间用于生成 dSYM 文件,也就是 Release 模式下的符号表。为了不阻塞编译构建,dSYM 可以通过异步的方式去生成。具体的做法为:
- 将一次编译构建拆分为两次
- 第一次编译不生成 dSYM 文件
- 第二次编译再生成 dSYM 文件,由于使用了相同的代码和缓存,因此速度非常快
当前这个工具仅用于修改 UUID,不区分是否是 dSYM 文件,且仅支持 armv7 和 arm64 架构。
🌟 LLDB 知多少
LLDB 是我们 iOS 开发最为熟悉的调试工具了,本文就从 LLDB 基本概念和它的命令结构展开,总结了几个常用的调试命令,同时也介绍了两款功能强大的 LLDB 插件,让我们重新认识了 LLDB。正如作者所希望的,在大家了解了 LLDB 之后,还是要通过不断的练习来掌握更多的调试技巧,进一步提高开发效率。
DevSwitch
一款可以快速切换应用商店的地区,来查看你的应用的评论和功能的工具。
代码
flutter_flipperkit
随着 Flutter 的热度不断增加,社区相关的工具库也在不断增加。如果之前有开发过 RN 的同学可能知道 blankapp 这个团队,他们为 RN 开发了很多易用的组件之前。目前,他们团队也开始为 Flutter 开发一些工具,flipperkit 这个工具主要用来在开发过程中方便的进行 debug,支持网络信息、UserDefaults 信息的查看等等,而且集成安装很方便,推荐大家尝试。
音视频
ggtalk | 如何出版一本书
本期 ggtalk 邀请的嘉宾是曾经在人民邮电出版社担任过文字编辑和线上运营工作的刘女士以及《Xcode 江湖录》的作者星星。围绕“如何出版一本书”这一主题,本期讨论的内容(按照时间顺序)大致分成三个部分:
- 介绍图书出版的流程以及回答稿酬计算方式等关于出版图书的一些相关问题
- 星星和梁杰的出书和翻译经历
- 关于国内的出版现状,电子书和“碎片化阅读”的讨论
本期的讨论对想自己出书或是翻译国外图书的朋友有比较大的帮助。
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@Parsifal,@aaaron7,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驴,@小非86,@邦ben,@红纸,@含笑饮砒霜,@JimQ,@老峰,@zvving,@J_Knight_,@极速男孩
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #60 | 2019-03-25
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
3 月 27 日起上传 App Store 最低需须使用 iOS 12.1 SDK 编译
Apple 发布公告:3 月 27 日 起,提交到 App Store 的应用,最低需适配 iOS 12.1,且要支持 iPhone XS Max 及 12.9 寸的 iPad pro,iTC 上对应的截图也是必须的;watchOS 则最低需要适配 watchOS 5.1。
新手推荐
🐎 Flutter 您需要知道的知识点
最近整理周报的时候发现关于 Flutter 的文章一下子多了起来,看来最近研究 Flutter 的人应该有不少,不过我觉得对于大部分读者来说,目前对于 Flutter 还是处于一个萌新的状态,所以为了能看懂一些先行者到底在讲什么,这周给大家推荐两篇比较基础的文章:
这篇文章主要讲了 Flutter 是什么,能做什么,什么样的人适合使用 Flutter 以及 Flutter 需要怎么样入门以及如何使用。
在看完上面一篇文章的基本介绍之后,就要了解一下 Flutter 里面的内容了,这篇文章大概介绍了关于 Flutter 的 SDK 主要功能,支持的编辑器,开发的灵感来源以及是否包含测试框架等一系列问题。
🐎 UIApplicationDelegate 中方法的调用顺序
本文介绍了在 UIApplicationDelegate 中的各个方法在各个不同状态下启动和打开是所调用顺序。
文章
🐕 即将开源 | 让 Flutter 真正支持 View 级别的混合开发
本文介绍了今日头条主客户端上接入 Flutter 进行混合开发的经验,主要是解决如下问题
- FlutterView 在一些小场景碎片化的问题。譬如短期内无法完成页面级别的 Flutter 化,Native View 和多个 Flutter View 必须混合存在的情况。类似的还有 Feed 流中的 Flutter Cell,列表页中的某些 ItemView 是 FlutterView。
- 内存管理问题:回收不活跃页面占用的内存
- 共享线程:收敛全局线程为公共的4个线程
- SurfaceView 改 TextureView :主要是解决手势动画的问题
总结来说,字节跳动客户端基础技术 Team 目前对于 Flutter 已经有了一定的研究,并且能够支持到 View 级别开发,目前文中提到的方案正在进行公司内部开源审查程序,通过后会在字节跳动官方 Github 上开源。
🐢 如何构建具有多种 Cell 类型的表视图
iOS 开发中,可以说几乎所有的项目都离不开 UITableView 的使用,甚至它的各种变形扩展都无处不在。UITableView 运用广泛的主要原因在于其 Cell 的多变性,在 Cell 数量和顺序恒定或展示内容相似的时候,这是比较常规的用法。但是当数量顺序甚至展示内容不尽相同的时候,这是比较有趣又极具挑战的。本文作者则指出传统写法在这种复杂情境中的弊端,并使用 MVVM 模式去构建这种动态试图:
- 模仿服务器响应,创建简单 JSON 数据,将 JSON 映射到 Model
- 基于 Model 创建 ViewModel,它将负责向 UITableView 提供数据,ViewModel 具有一个 Item 数组,它对应着 UITableView 包含的 Section 数组
- 每种Cell 对应 ViewModel 中的 Item 属性,可修改或者删除数据而不需要做任何代码修改
这种模式最大的好处,就是在复杂业务情境下将业务和页面区分出来,免去各种分支判断及数据修改造成的大量代码修改,并且 ViewModel 也易被重用。
离不开 UITableView 的使用,甚至它的各种变形扩展都无处不在。UITableView 运用广泛的主要原因在于其 Cell 的多变性,在 Cell 数量和顺序恒定或展示内容相似的时候,这是比较常规的用法。但是当数量顺序甚至展示内容不尽相同的时候,这是比较有趣又极具挑战的。本文作者则指出传统写法在这种复杂情境中的弊端,并使用 MVVM 模式去构建这种动态试图:
- 模仿服务器响应,创建简单 JSON 数据,将 JSON 映射到 Model
- 基于 Model 创建 ViewModel,它将负责向 UITableView 提供数据,ViewModel 具有一个 Item 数组,它对应着 UITableView 包含的 Section 数组
- 每种Cell 对应 ViewModel 中的 Item 属性,可修改或者删除数据而不需要做任何代码修改
这种模式最大的好处,就是在复杂业务情境下将业务和页面区分出来,免去各种分支判断及数据修改造成的大量代码修改,并且 ViewModel 也易被重用。
🐕 UTF-8 String
文章内介绍了,Swift 5
将字符串的编码格式从 UTF-16
改成 UTF-8
,以此提高性能。Unicode-rich text
和 ASCII
在 5 之前,用 UTF-16
存储,在这之后都用单个的 UTF-8
存储。
选用 UTF-8
的原因:
- 在
ASCII
中UTF-8
比UTF16
占用少50%。 - 高兼容性(对操作系统,开发工具,C / Objective-C 桥接)。
- 减少代码大小和编译时间成本。
- 无需修改现有代码。
更加详细的说明,请打开链接。
🐕 Mastering the VIPER architecture
作者介绍了面向协议编程在 VIPER 架构上的实践,并结合代码示例讲解了 Module, Presenter 和 Entity 协议的定义和使用方法。
推荐阅读:
🐕 Swift AVFoundation framework — Text-To-Speech tool
本文介绍了 AVFoundation 文字转语音的相关接口,并详细介绍了 AVSpeechSynthesizer
, AVSpeechUtterance
, AVSpeechSynthesizerDelegate
在实际应用中的流程与注意事项。
🐎 Better tests for delegates
文中介绍了两种测试 delegate
调用的两种决策:面向实现、面向行为。在面向实现过程中,我们更多的关注状态变化,需要更多的测试 delegate
响应方法的实现。而在面向行为的决策中,我们不需要关注其参数细节,只需要关注其实现的内容。
工具
CocoaPods 历险 - 总览
是否应该使用 CocoaPods 在几年前还是一个争论不休的问题,然而现在,但凡稍具规模的项目,就没有不使用 CocoaPods 的。作为一个三方库版本管理的工具, CocoaPods 对于组件的拆分粒度是非常细微的,我们所调用的 pod 命令都是执行本地对应目录下的脚本,那这些脚本文件到底执行了什么呢?本文主要分析了 pod install 命令执行的详细过程,当我们知道大致过程后,就可以对其做一些修改和控制,以达到我们的预期。
代码
Snail: An observables framework for Swift
一个轻量级的 observables 库,不用 KVO & RxSwift 也可以轻松观察变量的变化 & 响应事件了。
swift-log
官方的日志接口包(Logging API package),使用方(比如 Swift 服务端、跨平台的应用或库)可以根据自己的需求配置 log 输出的具体实现。
音视频
区块链到底能干嘛?
区块链近年来一个是技术圈的热点,风头甚至盖过了 AI,不少技术圈的名人也纷纷投身了区块链相关的创业中。本期 ggtalk 邀请到了微博上链圈名人赏味不足,来一起聊聊区块链的一些入门知识,强烈推荐感兴趣但一直没入门的同学收听。
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@Parsifal,@aaaron7,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驴,@小非86,@邦ben,@红纸,@含笑饮砒霜,@JimQ,@老峰,@zvving,@J_Knight_,@极速男孩
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #59 | 2019-03-18
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
热烈欢迎周报团队的第 30 个编辑 - @极速男孩!
新手推荐
在年前我们做了一次问卷调查,我们很重视这次问卷结果,专门组织了一次集体语音会议对问卷中反馈的问题和建议进行了讨论。其中很多读者希望我们能够推荐一些对新手更加友好的内容,在接下来的时间里,我们会尝试收录一些对新手入门更友好的文章,也欢迎广大读者自荐这部分内容,由于是新手向的,我们对此类文章的深度要求并不高,能通俗易懂地介绍分析某个知识点,利于新手吸收,我们都会考虑收录。
🌟 Help! My app freezes but no error appears
这是一篇非常有趣的关于 “入门 iOS 并发编程” 的文章。作者从一个新手容易碰到的 “界面卡死不响应了” 的问题入手,层层分析了这个问题产生的本质是 - UI 线程即主线程被耗时任务阻塞导致。如果你是一位以 iOS 为入门的新人开发者,这篇文章将能帮助你第一次认识到 iOS 中为主线程减负的重要性,也会为你打开 iOS 并发编程的大门。
编辑寄语:可能这篇文章对新手最不友好的一点是它是一篇纯英文的,但作为一名开发者,我觉得一定不能排斥英文。作为 iOS 开发者最好的入门教程是苹果的开发文档和所有 API 文档,都是纯英文的。当然,如果你觉得需要从新手继续进阶,戴铭老师「iOS 开发高手课」将会十分适合你,点我试读或购买,然后添加微信 AwayZ_T 返还小红包并邀请进入周报读者群和大家一起学习,老司机喊你快上车~。
新闻
🌟 WWDC 2019
一年一度的苹果生态开发者盛会又要来了。
WWDC 今年会继续在圣何塞会议中心进行,时间是 6 月 3 日到 6 月 7 日。
今年的主题是 Write code. Blow minds.
。按照目前流出的信息,今年软件更新的重头戏会在 iOS 13 上,iOS 会有一次非常大的 UI 更新。另外硬件方面,今年也很可能会在 WWDC 上发布模块化的 Mac Pro。
一如既往,WWDC 的门票价格是 1599 美元,票价并没有包括食宿,机票等的费用。如果你有兴趣参加,或者是公司有这个福利的话,需要在 3 月 20 日前去官网注册,苹果会在 3 月 21 日公布抽签结果。
预祝各位参与抽签的读者朋友们好运。
文章
🌟 🐕 Why using isEmpty is faster than checking count == 0
Swift String
中为什么使用 isEmpty
会比判断 count == 0
快?该文作者从 count
的工作原理中进行分析和对比。
Swift
字符串是复杂的字符集合,单个字符可能是由多个字符进行组合形成,例如🇬+🇧=🇬🇧
,但是"🇬🇧".count == 1
。每次检查一个字符所需要的最长时间为O(n^2)
,因此如果计算的String
很长,则count
会需要较长的计算时间。isEmpty
的计算则是检查String
起始索引等于结束索引则为空,时间为O(1)
。
同时作者提醒,在 arrays, sets, dictionaries
没有这种情况。但是建议使用 isEmpty
去判空,语义更为清晰,并且有利于 String
习惯用上 isEmpty
而不是count
。SwiftLint
和 SwiftFormat
都有检查该情况。
🌟 🐕 Websites using Swift and AWS Lambda — Part 1
本文介绍了如何用 Swift 轻松、愉快地编写并部署一个轻量网站。
- 使用 Swift + HTML + CSS 编写网站可以充分利用 Swift 的语言优势,例如代码更安全、更容易理解,写起来也更有意思。
- 使用 Lambda、Layers、API Gateway 以及 Certificate Manager(可选)在 AWS 上免费部署(每个月 100 万次免费请求)。
- 易于部署和更新,只需要更新 AWS Lambda 函数即可!
- 网站是动态生成的,也就是说可以在查询数据库、调用另一个 Lambda 函数并请求 API 之后将网站组合起来。
- 不需要管理传统的、有时会非常麻烦的 JavaScript 依赖。
- 示例网站是第一个使用 Swift + AWS Lambda 的网站。
🚧 🐕 Swift Localhost: Making XCUITest Great Again
关于 UI 自动化测试,特别是对网络请求处理的文章以前有过不少推荐,比如 第 41 期 的 iOS UI Automation Tests at Babylon,第 56 期 的 Painless UI Testing in iOS: Mocking the Network 等。
本篇文章对改善 UI 自动化测试的思路是通过搭建本地服务(localhost),再将网络请求重定向到本地的方式来做的。同时这篇文章也是作者在 iOSConfSG 2019 上分享的内容,总结了使用 4 个简单步骤就能在工程里搭建基于本地服务的 XCUITest:
- 通过 CocoaPods 集成 SwiftLocalhost(作者自己维护的),编写代码配置本地服务
- 把代码里的网络请求重定向到本地服务上
- 在 Info.plist 里设置 ATS 配置,允许访问本地网络
- 最后就是编写测试代码,模拟请求响应的数据
这里有亮点的地方是集成 SwiftLocalhost 后就不需要太操心服务端相关的事情,用例写完直接 command+u
就可以开始测试了,可以避免像环境配置、网络异常等问题,让开发者更专注于模拟测试数据,保证测试流程在可控范围内。
🐢 如何自建 Crash 平台
本文介绍了如何对非符号化的崩溃进行符号化,并介绍一些工具和脚本对崩溃报告进行符号化的操作。并实现了自己的 macho 解析工具和 crash 分析平台:
- 通过 dSYM 文件对崩溃信息进行分析,从而得到他的具体的堆栈地址和偏移地址。
- 分别通过 ATOS , lldb , Dwarfdump 对崩溃报告进行符号化。
- 分别用 dwarfdump 和自己实现的 atosl 脚本,对崩溃进行做符号化。并尝试去搭建一个自己的 crash 分析平台。
🐕 Linking Objective-C Code
本文首先简单介绍了链接器,库,二进制文件,符号,选择器和编译器的相关知识作为铺垫,然后介绍了 Objective-C 程序的链接过程,并且解释了 -all_load
,-Objc
以及 -force_load
三种常用链接标志在链接过程中所起到的的作用。
🐕 一个在 Objective-C 和 Swift 中实现剖面导向编程的故事
苹果官方并不支持 AOP?非也。看作者带你走过一段从分析 KVO 原理到设计通用的 AOP 框架的历程。
全文重在设计过程,用植物嫁接打比方,金句不断,细读颇具趣味。
注:剖面导向编程 == 面向切面编程 == AOP(Aspect Oriented Programming)
🐎 PSPDFKit and Swift
PSPDFKit for iOS 是用 C、C++、Objective-C(++) 开发的大型项目。在这篇文章里,PSPDFKit 官方亲自讲述作为 SDK 开发商对于 Swift 的看法,大家都在拥抱 Swift,为何 PSPDFKit ofr iOS 还是坚持使用 Objective-C?在即将正式发布的 Xcode 10.2 中,Swift 5 将包含稳定的 ABI,PSPDFKit for iOS 是否会迁移到 Swift?作者详细分析了 Swift only 的优点和缺点,并得出结论:我们很热爱 Swift,在很多项目里采用了 Swift 语言,并且不断为 Swift 编译器贡献新功能,但 Swift 并不适合我们的 SDK,在可见的将来里,我们会继续坚持使用 Objective-C。
Why we stopped using fastlane - Life in the slow lane
相信现在很多团队都在用 Fastlane,推荐本文是期望大家听到更多的声音。
本文作者在 2018 年写了一篇 Fastlane 的使用文章,现在,他来回顾一些 Fastlane 不好的地方:
- 没有解决 Xcode 本身的问题
- Fastlane 本身很庞大,有太多的依赖项
- Fastlane 自身有许多 Bug
- 太多人在用以至于 issue 太多,核心问题得不到解决
🐎 HTTPS 温故知新(一)— 开篇
本文是 halfrost (霜神)HTTPS 系列 学习笔记的第一篇,主要介绍了以下几方面:
- 为什么需要 HTTPS
- HTTP 数据没有加密
- HTTP 无法验证通信对方的身份
- HTTP 无法防止数据被篡改
- HTTPS 带来的好处
- 使用 HTTP/2 获得更高的性能
- 提高 SEO 排名
- 更好的推荐数据
- 更高的安全性
- 提高网站的信任和信誉
- HTLM5 新特性
iOS ATS 要求
- HTTPS 安全的本质
- HTTPS 采用混合的加密机制,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信
- HTTPS 通过使用 证书 来对通信方进行认证
- TLS / SSL 提供报文摘要功能来验证完整性
- HTTPS 中的 TLS / SSL 协议
- TLS 记录层协议
- TLS 密码切换协议
- TLS 警告协议
- TLS 握手协议
- TLS 应用数据协议
计算机网络基础是开发者需掌握的知识,但往往会被忽略,了解这些计算机基础知识为我们构建完整的计算机知识体系颇有益处。
🐢 开发小知识
如作者言,最近一段时间面试中发现很多开发者都只停留在知道、听说过的层面,却很少能回答的好是什么、为什么。作者一口气整理了 78 个 iOS 以及计算基础相关知识点,简短明了直指关键(不错的面试指南😂),如果看完觉得 so easy,恭喜你已经脱离了知道会用的初级阶段了😇。
🐢 最详细版本|UI2Code 智能生成 Flutter 代码——版面分析篇
AI 写代码,相信很多同学听到这个命题都会很感兴趣。UI2CODE 项目是闲鱼技术团队研发的一款通过机器视觉理解+AI人工智能将UI视觉图片转化为端侧代码的工具。本文全面分析了这个项目中 UI 前景提取和背景分析是如何做的。通过图像处理与深度学习相结合,在识别准确度,定位精度上都有了明显的提升。有兴趣的同学可以研究一下。
代码
Flare-Swift
Flare 是一款强大的设计和动画工具,可以让 app 和游戏的设计师、开发者轻松添加高品质动画。Flare 的主要功能是让设计师可以实时、直接操作最终产品中的 assets,从而实现快速迭代、避免重写代码。Flare-Swift 则是 Flare 的 Swift 运行时,可以通过 Export to Engine 来导出 Flare 文件。
音视频
🌟 ggtalk | 聊聊跨平台:后起之秀 Flutter
Flutter 现在的热度自然不用多说,国内各个公司都开始了在业务肿的尝试,包括美团。本周的 ggtalk 邀请到了美团御姐(宇杰)一起深入聊了美团在 Flutter 中的相关实践,也聊了很多 Flutter 的过去、现在和将来。
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@Parsifal,@aaaron7,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驴,@小非86,@邦ben,@红纸,@含笑饮砒霜,@JimQ,@老峰,@zvving,@J_Knight_,@极速男孩
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #58 | 2019-03-11
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
福利
🌟 移动开发唱衰,iOS 开发者如何涅槃重生?
戴铭,绝对是 iOS 届的资深老司机,GMTC 全球大前端技术大会的专题出品人及讲师之一,前滴滴出行技术专家,在组件化方案落地、工程动态化、大前端建设、应用开发阶段效率的提升、上线后各种难点问题的解决等方面的经验非常丰富。极客时间的品牌我一向比较认可,专栏品质很有保障,《iOS 开发高手课》也是戴铭老师对移动开发这么些年沉淀下来的技术,详细而系统的输出。我看了目录,主要分为基础、应用开发、原理、前端与原生共舞的 4 个模块,你将获得:
1、资深 iOS 开发专家为你构建完整知识脉络
2、领略专家级大型开发项目,增强面试竞争力
3、深入 iOS 核心技术与原理,从源头上掌控新技术
4、精美手绘图解知识点帮助你轻松学习
周报编辑均已购买,来不及了快上车!!原价 ¥99,上新优惠 ¥68,赶快扫码直接订阅。通过以下二维码购买的读者微信添加 AwayZ_T 或 Damonwong2,我们会邀请你进入我们老司机周报的读者群,一起学习戴铭老师的 iOS 进阶教程~
新闻
🌟 刚刚,阿里宣布开源 Flutter 应用框架 Fish Redux!
闲鱼团队是国内最早开始大规模使用 Flutter 的大公司团队,也是国内现在 Flutter 风潮的引领者。
在上周,闲鱼团队刚刚开源了名为 Fish Redux 的基于 Redux 数据管理的组装式 Flutter 应用框架,旨在解决大型复杂应用中的页面状态管理以及 UI 组件的复用等难点。
对于想要实践 Flutter 于大型应用的团队及开发者们来说,值得学习参考。
文章
🌟 🐕 庖丁解牛!深入剖析 React Native 下一代架构重构
去年六月,Facebook 宣布要重构 React Native。时至今日,开发团队取得的一些进展已经非常值得我们期待和持续关注了。本文通过分析源码仔细介绍了 RN 的重构设计思路和后续业务开发适配注意点,解释了新技术方案在解决性能问题上的优势,同时描述了官方对以后组件开发维护的一些规划,对保持社区的活跃性、提升框架集成使用体验和加快组件迭代速度等都有很大的帮助。
🐕 没有 AST, IDE 中的错误提示、自动补全、重构、语法检查......都玩不转了
当下的软件开发,实际上并不需要我们了解许多编译原理相关的知识。但编译原理作为一门计算机经久不衰的基础课程,自然有它存在的价值。其中的 parser 部分就值得好好看一看,这会在我们遇到相关的需求时候,如排版布局,想自己搞一套 DSL 等都会很有帮助。本文讲了 AST (抽象语法树)是如何工作的,虽然是以 JavaScript 的代码举例,但原理其实是通用的。
🐕 How to integrate image recognition in iOS apps
本文介绍了如何在 iOS 应用程序中集成图像识别,文章作者介绍如何使用 Microsoft Custom Vision 构建 CoreML 模型,以便能够识别照片中的对象以及如何在 iOS 应用程序中使用它。您需要对 iOS 开发和 Swift 有基本的了解才能阅读这篇文章。
🐕 The Xcode Build System
作者从 Xcode 的编译系统组件( 插件,平台组件,工具链 ),工程文件( pbxproj 文件,文件引用 )
编译环境( 编译设定,Target,xccofig 文件 ),编译输出( 输出路径,输出文件 )等内容比较全面地介绍了 Xcode 的编译系统。读者阅读后可以对 Xcode 的编译系统有更加全面的认识。
🐕 Swift Code Formatters
最近几天,Swift 社区一直在讨论 Tony Allevato 和 Dave Abrahams 关于 Swift 编码风格指南和格式化工具 的提案。
Mattt 专门在 NSHipster 撰文对社区现有代码格式化工具进行比较,包含 SwiftFormat、SwiftLint、Prettier with Swift Plugin 及 swift-format (proposed),分别从格式化结果及效率两个角度进行对比。
🐢 从源码解析 Swift 弱引用
弱引用的深层实现机制在 Objective-C 中,就让很多同学觉得云里雾里,那在 Swift 中又如何呢?和 Objective-C 中的实现又有何异同呢?作者通过研读源码,给我们深入剖析了 Swift 弱引用机制的实现方式,并比较了和 Objective-C 中的异同,非常值得我们借鉴学习。相关阅读:Friday Q&A 2017-09-22: Swift 4 Weak References
🐢 一步一步教你实现 iOS 音频频谱动画
当我们在听音乐的时候,总能看到音频频谱随着优美的音乐而跳动,那么有没想过这样的动画如何实现?
本文主要介绍了脉冲编码调制(PCM)基本音频处理概念;AVAudioEngine 音频播放和 AVAudioPCMBuffer 频谱数据的获取、计算、处理、音频动画绘制;频谱动画优化:锯齿消除、闪动优化等。
作者通过一步步探索最终实现完美的音频频谱动画,感兴趣的同学点击这里阅读源码,相信一定会有所收获。
🐕 已开源|码上用它开始 Flutter 混合开发——FlutterBoost
咸鱼团队在国内 Flutter 的探索上一直以来都是走在业界前列。近期,咸鱼技术团队开源了 Flutter 的混合开发框架 FlutterBoost。我们知道,在现有的工程中直接换成 Flutter 开发具有很高的成本以及风险,毕竟对于一些稍大些的工程,有些代码的业务逻辑已经很复杂了。所以,咸鱼团队基于对现状的考虑,采用 Native -> Flutter 渐进式的迁移方式,并将框架开源,对于想要在旧有工程上采用 Flutter 的同学可以看一下。
🚧 🐎 How to build a simple tracker blocker for iOS
跨网站追踪是一种广告商用于搜集用户信息的方式,Apple 作为一家注重用户隐私的公司,在 iOS 里内置了 Content Blocker 等功能帮助我们不被追踪。
这篇文章就教我们如何使用 Content Blocker 和第三方黑名单来搭建一个反追踪的插件,并且还提供了相关的网站以便我们进行测试。
🐕 Task-based concurrency in Swift
对一组有相互依赖的并行任务,OperationQueue,ReSwift,Future & Promise 都是常用的备选方案,但这些方案相对较重("heavy-handed"),作者基于 DispatchGroup 封装了一套轻量、简洁的 "Task-based" 的解决方案,推荐阅读。
工具
Localization in Swift like a Pro
你是否仍在用几年前的方式进行本地化?你知道有更好的方法吗?本地化一直令人痛苦,但阅读这篇文章后,你会发现它并不是那么糟糕。本地化的同步更新 Xcode 并不支持,但你可以使用 BartyCrouch 和 SwiftGen 这些工具来解救你。
XCSnippets
合理的使用代码片段可以有效提高你的 Coding 效率。XCSnippets 工具可以让你使用命令行方便的将 .codesnippet 从 Git 仓库安装到 Xcode。你还可以使用作者开源的代码片段仓库 XCUISnippets 或编写并开源自己的代码片段。
代码
🌟 MVVM-TemplateProject
用 Swift 实现 MVVM 的 Demo 项目,可以同时配合作者关于 MVVM 的 3 篇文章学习,适合新手入门。
- How to implement MVVM pattern in Swift from scratch
- Unit Testing your MVVM architecture in Swift
- How to integrate RxSwift in your MVVM architecture
Nantes
著名的 UILabel 替代库 TTTAttributedLabel 的 Swift 复刻版,支持 UILabel 的及 TTTAttributedLabel 所增添的新特性,支持 iOS 8.0+。
音视频
ggtalk | 如何(连续两次)获得 WWDC Scholarship
新的一期 ggtalk 邀请到了 @ApolloZhu 来聊聊 WWDC Scholarship,WWDC Scholarship 是苹果的一个类似奖学金的奖项,申请的学生靠提交一个极具创意的 playground 的作品来参与评选,如果获奖则可以获得免费参加 WWDC 的机会,当然餐食和酒店也是包含了的。Apollo 目前还是高中生,但已经连续获得两次 WWDC Scholarship,这次分享里他谈了申请的一些技巧以及整个过程中有趣的体验。对 WWDC 感兴趣的童鞋不容错过。
内推
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@Parsifal,@aaaron7,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驴,@小非86,@邦ben,@红纸,@含笑饮砒霜,@JimQ,@老峰,@zvving,@J_Knight_
说明
🚧 表示需翻墙,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)