Releases: SwiftOldDriver/iOS-Weekly
老司机 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)
老司机 iOS 周报 #57 | 2019-03-04
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
老司机周报 LOGO 全面更新!
首先非常感谢 @SketchK 为我们设计的十分贴合『老司机』一词的重金属风格 LOGO。几经波折,我们终于可以对外发布我们的全新 LOGO 了,而且版权已经注册并完成审批,希望这次不会再翻车!作为 LOGO 的设计者 @SketchK 他对此次设计以及周报有一份自己的理解,以下是他的想法,而我们聪明的读者会怎么解读这个 LOGO/Banner 呢,欢迎留言告诉我们~
@SketchK:在设计之初,问了一些身边的朋友,老司机在你心里是什么样子的?有的朋友说老司机是那种熟悉道路,开车老练的出租车司机,也有朋友说老司机应该是那种带大家搬砖致富的卡车司机,当然也有人说老司机就是那种饭桌上带大家开”车“的司机。但对于我而言,提到老司机或者老司机周报,我脑海里浮现的画面是:一个校车司机每天带着一波热爱 Swift 的人去探索当今最前沿,最有趣,最具挑战性的知识和技术。而我们这些每天阅读老司机周报的人就是这辆校车上的学生,充满了对未知领域的好奇与热情。大体是因为有了这个想法,才有了最后的这个 LOGO 设计稿。最后呢,希望老司机周报的读者能喜欢这个 LOGO,也希望大家能继续支持老司机周报这个组织,更希望 Swift 这门语言能够被更多的人所熟知和喜爱。
话题
#1 上周话题 | Swift ABI
新项目可能会优先选择 swift, 但得看对公司原有技术栈的依赖程度。ABI 稳定是一个里程碑,如果 OC 和 swift 相互调用能做到 Java 和 Kotlin 那样就更好。
终于稳定了!但根据 swift 社区的老传统,估计还得下一个版本才能放心, 当年(2.1)静态编译了一个第三方 http server 模块进来,某次手抖一点升级(2.2)全崩了,把自己的语法修完之后发现还得去改第三方的,提 issue 仨礼拜没动静之后都想自己帮人家改后 pr 了....
对于我们来说暂时没啥意见的,毕竟我们早就已经 all in swift 了。我们选型 Swift 还是从性能上面考虑的,相机应用对于代码速度和 crash 率有挺高的要求的。对于相机应用来说,性能提升几十毫秒也很牛逼了。这样子可以让相机帧率从 50 变成 53,用户体验棒棒哒。
如果你也有什么关于 Swift ABI 的看法,也可以在我们的 Github Issue 上评论,与周报编辑一起讨论。
#2 本周话题 | 协程
说起协程,很多人可能还比较陌生,它是一个 60 年代就已经提出概念,是一种在非抢占式多任务场景下生成可以在特定位置挂起和恢复执行入口的程序组件。
目前在服务端中应用比较广泛,在高并发场景下使用极其合适,可以极大降低单机的线程数,提升单机的连接和处理能力,而在移动研发中,前端的 JavaScript,安卓的 kotlin 也都已经支持了协程,唯独对于 iOS 来说,Swift 的语言级协程支持还在路上,苹果官方也没有意愿给 objective-c 添加协程能力的意愿。
好在,上周阿里巴巴也开源的 coobjc 为我们 iOS 开发者解决了这个困惑, coobjc 同时给 objective-C 和 swift 都提供了协程功能。
所以这周想和大家一起探讨一下协程相关的问题。欢迎大家移步到 #2 本周话题 | 协程 和我们一起探讨。
新闻
Flutter 1.2 发布,带来全新的 Web 开发工具!
Flutter 从去年开始,势不可挡,一路突飞猛进。Flutter 团队也一直不停的拓展着 Flutter 的应用范围,努力实现着 Flutter 更多的跨平台需求。
在 MWC 2019 上,Flutter 1.2 正式亮相,这次的最大的亮点是提供了新的 Web 开发工具。这个开发工具也会在之后加入到 VS Code 等其他开发工具中去。
CocoaPods-1.6.0
CocoaPods 1.6.0 有以下两大更新:
- 编译设置的生成部分被完全重写:在一个比较大的项目中,使用重写过的该版本执行 pod install 的时间比之前的版本降低了 77%。
- 1.6.0 开始会为每个测试 spec 生成一个单独的测试 target,而不是像之前把多个测试 spec 合并为一个测试 target。
另外,1.6.0 存在一个链接失效的 bug,已在后面的 1.6.1 版本解决,详情:CocoaPods/issues/8493。
文章
🌟 🐢 阿里开源 iOS 协程开发框架 coobjc 源码分析
阿里开源了 iOS 协程开发框架 coobjc
参与一些大前端开发,写了很多 js 的同学们,相信对 ES6 的新特性 async await 是非常的喜爱,能够允许你在同步的代码逻辑中,书写异步的代码。一般这种协程能力有的是语言层面直接支持,有的来自于框架。如今淘宝团队的大神们为 iOS 的 Objective-C 的语言也带来了协程框架。“当你还在写 UI Button 写界面的时候,别人已经在用汇编写 iOS 语法库了”,没错 coobjc 在 OC 的基础上通过汇编对寄存器的直接控制,来保存/中断/挂起/恢复一段逻辑的上下文,从而实现上下文的切换,再加上编译器与语法糖的扩展,实现了在 OC 中的 async await 等语法关键字的支持,更详尽的分析请看“知识小集”的这篇源码分析。
🐕 iOS 开发者如何在互联网寒冬中杀出重围(付费内容)
金三银四,又要跳槽时间点。该文章主要是整理了作者近段时间面试的一个心得体会,主要是讲述了面试前准备,简历书写,大厂面试经验,以及面试心态处理等几个方面。同学们如果有跳槽意愿,不妨回看过往 51 期的内推专栏,尝试询问对应公司是是否有内推。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
🐕 Parallel Computation using MPS
在图像处理任务上,GPU 一直以来都比 CPU 优异一个数量级。Metal 是苹果官方推出的 GPU 计算框架, 并提供了一套名为 Metal Performance Shader 的 API 接口,能够让开发者非常方便的使用 Metal 处理图像处理的任务。本文作者比较了使用 MPS 对比传统 CPU 的耗时,发现前者相比 CPU 耗时降低了 99.9%,之后介绍了 MPS 运行的基本原理并给出了一些 MPS 的编程技巧,做多媒体开发的同学不要错过。
🐕 UIView styling with functions
在实际 App 中,视图通常只有几种样式,你可能会想各种办法做成视图组件。本文介绍了一种视图样式封装的方法,利用 Swift protocol extension 等特性组织代码,使得代码逻辑清晰易懂。
🐕 Swift 5 Type Metadata 详解
Swift 5 发布以后,ABI 变得更加稳定了,尽管依然与早期的版本是二进制不兼容的。其中对 Metadata 也有不少改动,对于有些项目,可能使用了强依赖 Metadata 的库,这就需要我们加以修改。本文作者就通过查看源码,回顾了 Metadata 的前世今生,可能会对读者很有借鉴意义。
🐕 Using CLion as an IDE for Server-Side Swift Apps on Linux
CLion 是 JetBrains 全家桶中的一员,也是 Linux 上比较好用的 IDE 之一。本文以 Vapor 框架为例,完整介绍了在 Ubuntu 上搭建环境、调试和连接数据库,如果你也想试试 Ubuntu 上的开发体验,不妨一读。
🐕 API Pollution in Swift Modules
本周 NSHisper 讨论的是 Swift 导入 Module 时可能发生的 API 污染,Swift 的静态方法查找是发生在编译时的,有时候可能会因为函数的声明不当,而导致意外情况的发生,例如我们本来想调用的是 a 函数,结果却调用了 b。
Matt 在文章里列举了几种 API 被污染的情况,最后还从调用方和声明方两个角度去探讨如何避免类似情况发生,值得一看。
🐎 The perfect guide to AppStore search optimization (ASO)
本指南介绍了 App Store 产品页面每个基本信息的最佳实践,内容简明扼要,很有参考价值。相关阅读:App Store Product Page
🐎 Flutter 与 iOS 原生 WebView 对比
本文作者对比了 UIWebView、WKWebView、flutter_webview_plugin(在 iOS 中使用的是 WKWebView)的加载速度、内存占用、HTML5 兼容性。
🐕 [译] 用这些 iOS 技巧让你的 APP 性能更佳
本文介绍了 APP 性能优化的五种技巧:
- 使用可复用的 tableViewCell
- 使用看起来像应用首页的启动页
- 视图控制器的状态恢复
- 尽可能减少透明视图的使用
- 在后台线程中处理繁重的功能
除了一些老生常谈的优化点之外,视图控制器的状态恢复这个点比例新颖,作者也着重讲解了其原理和使用方法。如果你的应用中尚未用到,不妨一试,应该可以明显提升内存经常吃紧的用户(😂)的使用体验。
🐢 Frontend Workshop from HTML/CSS/JS to TypeScript/React/Redux
微软出版的从 HTML / CSS / JS 到 TypeScript / React / Redux 的前端训练营,为期两天,第一天搭建环境、介绍 web 的基础知识:HTML,CSS 和 JavaScript,通过演示代码了解一些核心概念。第二天演示和练习结合在一起,深入更高级的主题,如 TypeScript、测试和状态管理。(TypeScript 是由微软开源的编程语言。它是 JavaScript 的一个严格超集,并添加了可选的静态类型和基于类的面向对象编程,设计目标是开发大型应用,然后转译成 JavaScript)。
工具
periphery
periphery 是一个用 Swift 语言编写的,专门用于扫描 Swift 工程无用代码的工具。它的工作原理是利用了 Swift 语法树的各种回调特性,并且因为是 Swift 语言编写的关系,所以它也只能用于 Swift 工程。从本质上来说,它跟 OC 时代的各种Clang Checker
做的事情是没有多大区别的,不过从代码的维护性上来说就比 C++ 版本的 checker 要好很多。实测下来,跑一次全规则扫描的时间确实挺长的,如果只是扫描无用的函数参数的话倒是非常的快,大概 10 来秒就出结果了。这个工具也提供了 CI 的集成方案,总体而言算是一个比较成熟的工具了,值得推荐。
代码
🌟 chameleon
chameleon 是来自滴滴出行的一套前端跨端整体解决方案。其最大特点是目标让一套代码,同时解决微信小程序,支付宝小程序,百度小程序,快应用,CML-SDK 终端等以 MVVM 为标准的终端。
目前国内前端大环境下,开发者需要为同样的功能在各自为阵的小程序,快应用上多次重复实现。这样做既耗时,也耗费大量的人力,最后的效果也不一定理想,所以这样一套统一多端的方案来避免多次重复开发,也不失为一个好选择。
吐槽一下,chameleon 这个名字已经被很多库用了,算是个非常常见的项目名字,如果能有个更独特一点的名字,可能会更好一点。
freeCodeCamp
开源代码库和课程大纲,和数百万人一起免费学习编程。freeCodeCamp 由一个小型非盈利组织运营,目标是帮助数百万繁忙的成年人向科技行业转型,这个社区已经帮助超过 10000 人找到他们的第一份程序员工作。其中全栈 web 开发课程是完全免费的,可以按照自己的节奏来学习,有上千个互动性的编程挑战来帮助你学习。
内推
-
北京-百度网盘 持续招 iOS 开发:社招、应届、实习均可。项目在技术上很有挑战性,团队技术氛围极好。诚心希望各路大神前来切磋,也欢迎计算机基础好的小白来共同学习。简历发邮箱 [email protected],暂不考虑的也欢迎微博私信 @小非86 聊聊~
-
北京-蚂蚁金服 招iOS/安卓/前端开发:负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱)或者微博私信 @折腾范儿_味精 了解情况。
-
上海即刻:如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 @没故事的卓同学 了解。
-
深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目:如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~
-
北京字节跳动多闪 iOS 团队持续招人中:简历可以发送到邮箱 [email protected],或者添加我(@AidenRao)的微信 jingmu1994 了解更多公司及岗位信息。
-
北京百度教育事业部招 iOS 开发:百度教育事业部,地点:北京西二旗。部门下面有百度阅读,百度文库,百度爱听等 App 产品。团队技术氛围浓厚,有兴趣的同学欢迎将简历发送到我的邮箱:[email protected]。
-
深圳 - 格隆汇 iOS / Android / 前端:公司方向是投研资讯,目前正在稳步扩张中,各个级别的工程师都有需求。任何推荐或者简历都可以发送到我邮箱:[email protected],同时也欢迎大家私信我了解更多信息。
关注我们
我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
本期编辑
@四娘,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@Parsifal,@aaaron7,@kyo,@tom510230,@anotheren,@水水,@looping,@老老老老老老老驴,@小非86,@邦ben,[@红纸](https://github.c...
老司机 iOS 周报 #56 | 2019-02-25
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
话题
🌟 🐢 关于 Swift ABI 稳定
迟到三年的 ABI 稳定终于要来了。
苹果发布了 ABI Stability and More 和 Evolving Swift On Apple Platforms After ABI Stability 两篇文章来阐述 Swift 5 发布以后 ABI 相关的内容所带来的改变。看不懂英文的也不要怕,细心的喵神帮我们做了一个很棒的总结: Swift ABI 稳定对我们到底意味着什么。
Swift ABI 可以说是 Swift 的一个里程碑事件,让跨平台的能力更上了一层,但是 Swift ABI 对于 iOS 开发者使用来说,影响不是很大,有很多开发者误把 API 稳定当成了 Swift ABI 稳定。对于开发者来说,只有 API 稳定了,才是真正意义上的不需要迁移适配了。
如果不知道 Swift ABI 是什么的朋友,可以看看苹果去年发布的 Swift ABI Stability Manifesto。同时 泊学 也做了一个很棒的翻译版: 译:Swift ABI (一) 和 译:Swift ABI (二)。
最后,关于 Swift ABI,你有什么看法,可以在我们的 Github Issue 上,发表你的看法,与周报编辑一起讨论。
新闻
Swift 5.1 发布计划
Swift 团队近日在博客里更新了 5.1 的发布计划,这个版本的主要目标是达成 Module Stability,简单的说就是 Module 接口的向前兼容。
另外知识小集也在第一时间进行了翻译,推荐阅读这一篇。
It’s time to stop using index(of:)
SE-0204
在 Swift 4.2
实现
- 增加
lastIndex(of:)
- 增加
lastIndex(where:)
index(of:)
改名firstIndex(of:)
,并且废弃原方法index(where:)
改名firstIndex(where:)
,并且废弃原方法
文章
🌟 🐢 Swift5 新特性 @dynamicCallable 带来的动态魔法
一年前周报的第一期我们曾经提过:Swift 快要可以和 Python 无缝交互了,一年后的今天伴随着 Swift5 新特性 @dynamicCallable
的发布,『用 Swift 写 Python 变成现实』。
起源是 Chris Lattner 大神的两个提案:@dynamicMemberLookup
提供动态查找成员的能力(Swift4.2),@dynamicCallable
则提供动态方法调用的能力(Swift5)。很难想象,两个语法糖重新定义语言动态性,让人看到 Swift 成为胶水语言的可能。
下面三篇系列文章带我们感受语法糖带来的神奇魔法:
-
#1 Unix Tools as Swift Functions
一层薄薄的封装让所有 Unix Tools 变成 Swfit 方法,提供这样的调用方式:
shell.env()
,shell.ls("-a", "-l")
,shell.python("--version")
; -
基于 @dynamicCallable 轻松实现一套 Swift - Objective-C 的桥接。实现思路类似 PyObjC
-
为模板语言Mustache的生成器提供简洁优雅的调用方式。
相关阅读:细说 Swift 4.2 新特性:Dynamic Member Lookup
🌟 🐎 架构师思维
架构师一词听起来就是个很高端的 Title,在职业生涯的多数时候,在我心里都是高山仰止般的存在。尽管不同的公司对架构师的要求也许不一样,但印象中应该都是技术特别出众的人。那除了技术出众之外,又应该具备什么样的架构师思维呢?本文作者从开发者和开发两个方向阐述了什么才是架构师思维,值得去细细揣摩,带着这个思维,也许你会有新的发现和努力的方向。
🐎 Behind the Proposal — SE-0200 Enhancing String Literals Delimiters to Support Raw Text
SE-0200
提案中增强字符串分隔符支持原始文本的能力。
-
支持多行,并且同时具备Swift原有的字符串功能(如插值),示例:
""" line1 \(line2) """
-
为了覆盖边转义字符缘特殊情况,参考了
Rust
的设计,支持自定义分隔符声明原始字符串,同时支持插值。#""#
是将原本\
转义分隔符修改为\#
。#"\#(val))"#
,等同于以往的\(val)
。#"\n"#
输出\n
。###"\nline"###
,转义分隔符是"\####"
,输出\nline
。
🐢 Swift 5 Exclusivity Enforcement
在 2017 年初,Swift 社区发了一篇长文介绍 Swift 4 将在内存安全方面做一些改进,@onevcat 翻译了此文 所有权宣言 - Swift 官方文章 Ownership Manifesto 译文评注版 建议细读。
上文中提到的改变大多已在 Swift 4.x 落地,即将发布的 Swift 5 中,对「独占性访问」进行了增强:在 Release 模式运行也默认开启。
Swift 4 中,只有 Debug 模式下,Runtime 会做「独占性访问」的检查(编译时 Debug 与 Release 都会检查,但编译检查可能覆盖不全),Swift 5 中, Release 模式 Runtime 也默认开启(可手动关闭)。文章仔细介绍了这个改变可能带来什么问题,以及如何应对。
🐎 How many apps use Swift in 2019?
文章作者对 App Store 上美区 Top 110 的 App 进行了分析,来看到底有多少 App 使用了 Swift。结果上看,目前 Top 110 的 App 使用 Swift 和未使用 Swift 基本处于对半开的状态。
大公司切换 Swift 和小公司切换 Swift 比起来,难度要大很多,所以对于这样的结果,也不算惊讶。希望再过一年,Swift 的比例能够有进一步的增长,毕竟 ABI 稳定了。
🐕 Painless UI Testing in iOS: Mocking the Network
本文是 Painless UI Testing in iOS 系列的第一篇文章。该系列打算介绍三种方法来让 UI 测试变得更快更可靠。第一种在本文做了介绍,第二种是在第二篇介绍的 Stubbing the Navigation。但是该系列的第三篇还没有发布,大家可以关注他们的技术博客 eGym Software Development。本系列的作者按设计思路附上代码的方式把他的想法分享的很详细,是非常值得学习和借鉴的,热衷 UI 测试的同学不可错过。
🚧 🐕 Deep Diving React Native Debugging
在开发 React Native 应用时,我们可以通过开启 Debug JS Remotely
来实现在 Chrome 中调试 JS,包括断点调试、查看堆栈信息、变量状态等,有时候我们可能还会在调试时遇到红屏错误 Runtime is not ready. Make sure your packager server is running.
,但是不知道这背后都发生了什么。我们往往对这些每天日常开发中接触的东西既熟悉又陌生,不妨跟着这篇文章读读源码并调试一下,一切都将豁然开朗。
由 @ShannonChenCHN 推荐。
🐕 分析一次有意思的需求——HTML 代码注入
在 iOS Hybrid APP 开发中我们经常会有这样的需求: 通过 WebView 实现 JavaScript 与 Objective-c 交互。本文作者以 WKWebView 访问了一个 HTML 页面,获取用户的所有输入信息这样的问题为例,将需求拆解为如下几部分,最终解决问题。
- HTML 和原生交互
- HTML 获取指定元素
- 通过 JavaScript 动态为 HTML 元素添加事件
- 通过 WKWebView 向 HTML 注入 JavaScript 并调用 原生代码
作者通过逐步拆解需求,把抽象的问题分解成各个小问题的组合,然后逐个分析验证,最终解决相对复杂的问题。其实这正是如何分析具体的需求,并将其转换为代码的一个过程,感兴趣的读者可以跟着作者思路读一读,应该会有所启发。
由 @chouheiwa 推荐。
🐢 How I failed 39 interviews and what I’ve learned
一个大学计算机系二年级在校生从 39 次面试失败经历中的总结,对于大部分软件开发工作者而言,去一些大厂工作都是一个目标。作者打小就梦想进入 Google Facebook 等这些大厂工作,而这篇文章总结了他在校期间面试大厂屡战屡败、屡败屡战的经历。
老司机推荐给大家,希望给正在努力亦或是正在迷茫的你有所帮助。
🐕 Demystifying UIKit Spring Animations
Spring 弹簧动画从 iOS 7 开始就成为了公开 API,但当时的 damping-duration 接口非常不自然,iOS 10 发布 UISpringTimingParameters
和 UIViewPropertyAnimator
之后有所好转,但要制作出优秀的弹簧动画仍然不是一件容易的事。这篇文章会为你介绍究竟什么是弹簧动画、背后的工作原理以及如何调试出恰到好处的动画。
🐎 Swift 5 字符串插值之美
本译文介绍了 String 类型对 ExpressibleByStringInterpolation
协议的三种扩展实现,以精确控制字符串插值的打印方式。ExpressibleByStringInterpolation
协议在 Swift 3 时被废弃,如今被以一种更优雅、扩展性更强的方式重新实现。建议同时阅读一下 SE-0228 这个提案,对比了解下新旧两种实现方式,以及新的实现方式所带来的可扩展性和性能改进。也可以看下 HTML,LocalizableString,SQLiteStatement 三种非 String 类型的扩展实现。
🐎 唯品会 iOS 代码覆盖率的应用实践
在快速迭代的这个软件开发生态下,量化测试数据成为软件测试中必不可少的一步。
本篇中,作者将一步步剖析,iOS 代码覆盖率的应用。文中的主要步骤可以拆分成一下几个部分。
- 在编译过程中,利用 LLVM 可以使用 gcda/gcno 记录代码覆盖率的特性,进行中间代码插桩
- 在程序执行过程中,将记录文件刷入内存当中,利用 HTTP 接口上传服务器
- 将 LCOV 作为记录文件分析工具,生成可视化的报表数据
相较于传统的行/函数/分支覆盖率外,文中新增了行差异覆盖率。将覆盖率文件进行预处理,新增差异代码行数相关属性,达到支持差异/多版本合并。
如果对于 GCC 插桩想要有所了解可以看这个博主的一系列研究 链接
工具
🐕 Introducing the sourcekitd Stress Tester
Sourcekitd 是为 Xcode 和最近发布的 SourceKit-LSP 的编辑器核心功能提供数据支持的工具。如 Swift 文件的代码补全,语法高亮和重构等。为了帮助改善其健壮性,本文介绍了一个新引入的工具,即 “Sourcekitd 压力测试工具”。在过去几个月中,它帮助找到了 91 个可复现的 Sourcekitd 崩溃,断言失败和挂起。 这篇文章介绍了 Sourcekitd 的实现,如何在 Swift CI 和 PR 测试中部署,以及 Swift 开发人员如何在自己的项目中运行它,以帮助改善每个人的 Swift 编辑体验。
代码
🌟 MicroKernel
MicroKernel 是一个客户端微内核架构,它把业务和基础都视作插件,形成一个插件化微内核架构。对于业务,一切其他模块的业务和基础都是注入的依赖。
MicroKernel 遵守了整洁架构 (clean architecture)、六边形架构 (hexagonal architecture) 等架构的主旨,架构以代码变更的原因和频率形成边界和层次。
分为以下几个层次:
- MicroKernel:App的驱动,提供MicroApplication管理、通信机制、依赖注入、路由等。
- MicroKernelService:贯穿App的基础能力服务,提供基础能力的领域抽象,不包括具体的技术选型,不必拘泥于依赖注入形式。
- MicroApplicationService:贯穿App的业务服务,从复用角度聚合,包括其整体业务方案,比如,分享、登录、支付等。
- MicroApplicationCoordinator:解开MicroApplication之间耦合的协调器。
- MicroApplication:独立的业务,从功能角度聚合,在架构中称作应用,其形式包括Native、H5、Hybrid、小程序等。
- MainApplication:整个App的架构注册、配置,以及外部渠道的对接。
MicroKernelDemo 是作者通过模拟一个简单的业务场景,以帮助读者熟悉 MicroKernel 背后的概念和使用的实践 demo。
Aiolos
Aiolos 是一个受浮动面板启发的 Swift UI 框架,已在 iOS 11 中的地图应用中引入。它完全由手势驱动,并自动响应屏幕键盘,与许多其他开源面板解决方案相比,Aiolos 被设计为始终可见的子视图控制器,因此不使用 iOS 的自定义视图控制器转换 API。可通过 Carthage 集成到项目中,使用简单便捷,感兴趣的同学可以尝试一下。
EasyTransitions
EasyTransitions 是一个简单易用的转场动画库,可以帮助开发人员使用协议中定义的简单函数创建自定义交互式转换,避免使用 UIKit 中的多个转换 API 进行实现的麻烦。
特性
- 自定义过渡简单设置
- 支持模态演示,UIPresentationController 和 UINavigationController 过渡
- 具有多个平移手势方向的 1 行中的交互式转换支持
- 3 个自定义转换作为示例
- iOS 和 tvOS
EasyTransitions 库很实用,有需要感兴趣的读者可以看看,不过该库只提供了 swift 版本哦!
音视频
Swift Community Podcast #3 - Result Type, Character Literals and Swift Evolution
Swift Community Podcast 是 Swift 开源社区举办的讨论 Swift 语言特性与应用的电台节目,基本可以认为是 Swift 的官方 Podcast,第三期的主持人是 Swift 之父:Chris Lattner, 还有两位嘉宾:提出了 Result type,同时也是 Alamofire 维护者之一的 Jon Shier,以及Kelvin Ma,目前还是一名在校学生。三个人首先讨论了 Swift 的开源历史,有哪些重要的时间节点,然后从 Swift 的错误处理的前世今生开始聊,引出了 Result type 的必要性。最后也讨论了 Character Literals 提案的一些趣事。整体氛围比较轻松,尤其是 Jon Shier 吐字非常清楚,非常适...
老司机 iOS 周报 #55 | 2019-02-18
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
TLS 1.3 in iOS
在 iOS 12.2 中,iOS 系统默认开启了对 TLS 1.3 的支持,使用 Network Framework 以及 NSURLSession 的开发者都可以使用 TLS 1.3 来建立更安全的网络连接了。
在这方面有兴趣的童鞋不妨了解一下。
iOS 12.2. beta PWA update
在 iOS 12.2 beta 上 PWA 的能力也得到了小部分更新,由PWA打开外部网站会通过 SFSafariViewController 打开,进入后台后 PWA 当前的状态会保持,PWA 应用可以被系统搜索到等
文章
🌟 🐢 了解和分析 iOS Crash Report
作为客户端的开发者,与各式各样的 Crash 打交道是家常便饭。关于 App Crash 的相关讨论,社区也总是比较活跃。我们曾在 27 期和 34 期分别推荐了 深入理解 iOS Crash Log 和 手把手教你查看和分析 iOS 的 crash 崩溃异常 两篇好文章。而这次则是来自苹果官方文档的译文,官方则意味着权威,以及更多的细节。内容虽然还是围绕着 “符号化 - 看懂 - 解析” 三个部分进行,但非常系统和详细。作者也对这篇译文进行多次润色修改,并在文中多处添加了自己的注解,会对我们阅读这类偏底层文章有所助益。
文中会涉及许多底层概念,读起来难免不如一些应用类文章顺畅,但小编还是建议大家无论如何都坚持至少过一遍,并再安排时间分块细读,会大有裨益。
🌟 🐕 iOS 原生级别后台下载详解
本文记录了作者实现支持原生后台下载 Tiercel 库的整个历程,并详细的列出后台下载的所有特性和注意事项,并附上了具体实现。让读者能够更深刻的了解到后台下载。目前 Tiercel 2 已经发布,完美地支持后台下载,还加入了文件校验等功能,对后台下载有兴趣的朋友可以借此机会深入了解下。
🐕 ABI Stability and More
Swift.org 二月初发文介绍了 Swift ABI Stability 当前状态及后续计划。Swift 5 在 macOS, iOS, watchOS, and tvOS 几个平台将实现 ABI Stability,预计很快就能发布,Linux 及 Windows 平台还需评估。文章还介绍了 Module Stability
及 Library Evolution
的后续计划 。
ABI Stability 能带给我们什么:上述系统以后将自带 Swift runtime and standard library
,而不需嵌入到 App 中,能大大减小 Swift App 的打包大小。
🐎 浅谈团队管理最佳实践
作者从以下几点谈了一下团队管理的实践:
- 每个人都需要关怀:领导者应确认团队中每个成员的职业发展规划,并适时地给予“人文上的关怀”
- 公平公正公开的价值评判标准:一个成员的价值增值包含两个层面:随着熟练度的提升所带来的价值增值和解决特殊领域问题的经验价值
- 团队沉淀:可以通过文档和流程标准化的方式有效降低做重复性工作的成员的替备成本
- 具象化团队这台机器的样貌:领导者定义团队的责任与目标、架构设计、合理组成、团队的演进等,方便成员参考辅助自己的实践
🐕 制作一个 Mac APP:XcodeExtension
Xcode 8 提供了 Xcode Source Editor Extension方式来开发 Xcode 插件。本文以 XcodeExtension 为例,介绍了该插件的使用方法与制作思路。
XcodeExtension 主要有以下功能:
- ConvertFromCase 把选择的下划线内容变为驼峰
- DeleteEmptyLines 删除选中的空行
- SortLines 排列选中的行
- JsonToModel 把Json数据转成Swift模型,会把下划线命名变为驼峰
在往期周报中我们也有过相关推荐如: How to convert your Xcode plugins to Xcode extensions 以及 Code Friend 开源工具等,感兴趣的读者可以拓展阅读。
🐎 使用 OCLint 自定义 MVVM 规则
本文总结了通过自定义 OCLint 的扫描规则,对 MVVM 开发模式的 ViewModel 运行静态检查,并把规则集成到 Xcode 上所踩的一些坑。由于官方 OCLint 很久没有维护了,所以本文作者就基于 LLVM 7 进行了修改,对这块有需要或感兴趣的同学可以直接安装试用。
🐕 如何看待软件开发?
当年移动互联网大潮来的时候,软件开发再次成为炙手可热的岗位,高工资吸引了很多人投身其中。当大潮退去,互联网也迎来寒冬的时候,对于已经在其中的各位,又或者未来想要当开发者的同学们,软件开发到底是什么样的,究竟需要掌握多少知识,职业规划应该如何做,会成为大家再次思考的问题。本文作者以自己多年的工作经验,总结了如何看待软件开发这一问题,值得如果尚有迷茫的同学看一看。
🐕 Objective-C 单向数据流方案
在 JS 领域,得益于 JS 弱类型语言的特性,单向数据流被广泛的使用。单向数据流可以避免许多因为线程等造成的各种问题。本文介绍了 OC 下的一个单向数据流的方案 Reflow 库。Reflow 库架构设计实现了单向数据流的几个特征:
- model对象不可变
- 整个app的数据存于store层
- 更新和通知也收拢于store层
Reflow 是开源的,有兴趣的同学可以一看。
🐕 移动开发的罗曼蒂克消亡史
本文是 InfoQ 总编辑徐川的一篇文章,介绍了移动开发领域的插件化和热更新两个方向的发展史,覆盖了 iOS 和 Android 。徐老师文章结尾的一句话很有意思,『插件化热潮注定成为技术发展的一段小插曲,也许再过几年,不会有人记得了。那段激情飞扬的岁月,终将成为 The Wasted Times。』
最近跟 Bang 哥吃饭,也聊起了热修复的一些事情,实际上在大厂一直都还有发展各种移动开发领域的黑科技。包括最近大热的 Flutter 技术,在 Google 的 RoadMap 上面,也明确表示了动态更新会是一个重点考虑的方向。总的来说,2019年,移动开发的插件化和热更新方向,应该会在基于各种虚拟机技术的基础上,继续往前发展,满足业务需求。
工具
ios-developer-tools
本文中总结了 iOS 开发者应该了解的工具合集。其涉猎了多个方面的工具推荐,例如 DEBUG 调试、项目分析、持续集成、逆向工程等。在这份列表当中,能够找到耳熟能详的项目,也有大家平时没有涉及到的方面,不妨来看看那些你没有接触过的开发工具。
DoraemonKit
滴滴开源的一款功能齐全的客户端研发助手,同时支持 iOS 和 Android 两端,类似的前辈有 FLEX、Dotzu,但仅限于 iOS 平台。
- 内置了很多常用的工具,包括一些辅助开发工具、测试效率工具、视觉辅助工具等。
- 接入方便,便于扩展,让你的业务测试代码在这里快速接入,统一管理,统一收口;
代码
Path.swift
一个文件系统路径库,专注于开发人员体验和强大的最终结果。保证了安全性和正确性的前提下提供了非常简洁的 API ,为管理文件路径而头疼的开发朋友们可以尝试使用这个开源库哦!
Facebook 开源图像处理库 Spectrum,优化移动端图像生成
Facebook 开源了其图像处理库 Spectrum,内核使用 C++ 编写,并提供了 Objctive-C 及 Java 的简单封装,简化移动端开发。统一的核心使得在 iOS 和 Android 上的图像输出更加统一。
效果丰富的分类切换组件:JXSegmentedView (Swift版)
SegmentedControl + PaggingView
组合实现的分类切换视图是资讯、电商类应用常用的基本组件。具体实现起来,动效细节和特殊交互场景要考虑的问题并不少。
JXSegmentedView 胜在实现了大量主流应用分类切换组件的交互效果,如果你碰到对应需求,相信这会是个不错的参考。
如果你不幸还停留在 Objc,也可以看看同一作者实现的 Objc 版本 JXCategoryView(已有 2k+ stars)。
由 暴走的鑫鑫 自荐
书
The Architecture of Open Source Applications
这是一本开源的电子书,主要介绍了最近几十年来一些经典开源项目(包括 Git、LLVM、nginx、PyPy 等知名项目)的架构思想和设计哲学,文章作者都是业界大牛甚至是项目作者本人,比如 LLVM 之父 Chris Lattner。相比自己去阅读源代码百思不得其解,原作者自己分享的思考和感受就像指明灯一样,给我们打开了更大的世界,站在巨人的肩膀上才能看得更高更远。
内推
-
北京-百度网盘 持续招 iOS 开发:社招、应届、实习均可。项目在技术上很有挑战性,团队技术氛围极好。诚心希望各路大神前来切磋,也欢迎计算机基础好的小白来共同学习。简历发邮箱 [email protected],暂不考虑的也欢迎微博私信 @小非86 聊聊~
-
北京-蚂蚁金服 招iOS/安卓/前端开发:负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱)或者微博私信 @折腾范儿_味精 了解情况。
-
上海即刻:如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 @没故事的卓同学 了解。
-
深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目:如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~
-
北京字节跳动 iOS 团队持续招人中:简历可以发送到邮箱 [email protected],或者添加我(@AidenRao)的微信 jingmu1994 了解更多公司及岗位信息。
-
北京百度教育事业部招 iOS 开发:百度教育事业部,地点:北京西二旗。部门下面有百度阅读,百度文库,百度爱听等 App 产品。团队技术氛围浓厚,有兴趣的同学欢迎将简历发送到我的邮箱:[email protected]。
-
深圳 - 格隆汇 iOS / Android / 前端:公司方向是投研资讯,目前正在稳步扩张中,各个级别的工程师都有需求。任何推荐或者简历都可以发送到我邮箱:[email protected],同时也欢迎大家私信我了解更多信息。
关注我们
我们开通了公众号,每期发布时公众号(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 周报 #54 | 2019-01-28
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
通知
各位读者大家好!首先欢迎我们的新编辑 - 热爱分享的爱奇艺 iOS 开发 @J_Knight_ 加入周报团队~另外春节临近,本期周报也将是我们年前的最后一期,年后我们再见!祝大家春节快乐!
新闻
🌟 老司机翻车现场:一个业余程序员组织如何收到滴滴的侵权通知
2019 年 1 月 23 日,这是一个值得所有老司机编辑铭记的日子,我们收到了来自滴滴法务团队的侵权通知。虽然我们完全不是一个实体组织,也毫无商业性质可言,和滴滴更不在一个行业,Logo 的颜色也完全不同。但是滴滴认为我们从 18 年 1 月开始使用的 Logo 和他们在 18 年 3 月登记的街兔 Logo “高度相似”,可能导致 APP 应用程序员的开发人员认为是街兔商标。对于这方面纠纷,我们也是大姑娘坐轿子头一遭,真谈不上老司机。于是我们选择按照对方要求第一时间替换掉所有可疑图片。在此期间,我们收到了很多读者和朋友的建议和帮助,非常感谢大家对老司机周报的关心和支持,我们全新的 Logo 也即将完成设计,很快会与大家见面。
我们愿称此次严肃而又哭笑不得的事件为『123 老司机翻车门』,为了其他同在技术社区做分享的朋友避免受此类事件的影响,『知识小集』特地整理了一份指南给大家 - 老司机翻车现场 续:技术之外,程序员如何自我保护。
🌟 Swift 5 Release Notes for Xcode 10.2 beta
万众期待中,Swift 5.0 终于和 Xcode 10.2 Beta 以及 iOS 12.2 Beta,macOS 10.14.4 Beta 一起降临。虽然距离正式版还有大概一个月多一点的时间,但是各位 iOS Swift 开发者已经可以开始着手准备进行适配了。
Swift 5.0 应该能算是 Swift 从 1.0 以来的最大变革。不是因为语法变化多,而是因为从 5.0 开始,Swift 终于进入了 ABI 稳定时代,系统将自带 Swift 动态库,老版本 Swift 编译的库也将可以轻松的用到更新版本的 Swift 项目中。
除了上面苹果官方给出的链接,也可以参考知识小集团队的翻译版本。
Upcoming Changes for Organization Teams
从 2019-02-12 开始,苹果开发者网站(developer.apple.com)和 App Store Connect 将会共用一套成员管理系统,有些角色权限将合并。这是个期待已久的改动,简化我们的维护成本。
文章
🌟 🐎 Server-provided animations in iOS apps
这篇来自 Badoo 团队的文章用一个例子介绍了如何将 Adobe After Effects(AAE)的动画导出为 iOS app 可以读取的格式(借助 Lottie 库),然后创建一种动画云存储服务,将动画存储在服务器上,然后按需传递给客户端 app。这种方法最显著的优点就是可以对动画更新流程进行解耦,也就是说如果要发布一个漂亮的新动画,设计师只要给服务器团队提供 JSON 就可以了,效率非常高!还有一个优点是不同的客户端平台(iOS、Android、Web)可以实现完全相同的功能而不需要调整现存的服务器端功能或原生动画。
🌟 🐎 A RunLoop for your Swift script
上一期推荐里面有一篇关于 swift-sh 的介绍,如若未读,可以先跳转过去一看。
这一文章主要是给出一下 Tips,当你需要执行一个异步任务的时候会发现,脚本跑完就结束,异步任务自然也得不到调用了,这是不符合需求的。iOS App 启动后会进入 Runloop 当中不停的在休眠和执行状态循环,保证 APP 在没任务的状态也不会退出。同理,在脚本中,执行 RunLoop.main.run()
或者 dispatchMain()
会让脚本进入启动 Runloop,不会结束。当你异步任务 callback 后,调用 exit(EXIT_SUCCESS)
或 exit(EXIT_FAILURE)
退出当前 Runloop,并且结束脚本。
🌟 🐕 2018,我们的组件化实施之路
本篇文章是诸葛找房 iOS 技术团队近半年组件化实施之路的经验积累与沉淀,文章主要有 2 大部分。
第一部分主要讲了组件化可选用的方案、组件化的分层、业务组件的拆分步骤:
- 组件预处理
- 组件抽离、编译、运行
- 组件引入
第二部分分享了在实施组件化过程中遇到的一些问题:
- 主工程中业务组件的引用方式问题
- 业务组件的开发时机问题
- 业务组件如何测试
- 组件后续的开发与维护和组件回滚
- 业务组件的粒度
- 关于业务组件中文件的命名规则
- 关于不同项目下同一业务组件的个性化差异解决方案
- 其他细节问题如如何处理组件之间的相互跳转、业务组件之间如何进行复用等
- 关于业务组件的评价标准
组件化是一个漫长、繁琐、复杂但有意义的过程,是一项团队性的工作,不管是正在打算实施,还是已经进行过组件化实践,都可以阅读本文,相信读者朋友阅读本文都会有一定收获。
🐎 React Native vs Kotlin Multiplatform. How the Future of Multiplatform Development Will Look Like?
作者对比了 React Native 和 Kotlin 在跨平台上各自的优劣,同时也谈了自己对跨平台的未来的思考,虽然不是针对 iOS 的,但是也值得阅读参考。
🐎 Flutter vs React Native: A Developer’s Perspective
老生常谈的话题,作者从十个方面去比较了 Flutter 和 React Native 的优劣,可供还在选型的同学们参考。
🐕 How to use the coordinator pattern in iOS apps
本文介绍了如何使用 Coordinator Pattern 这一设计模式来分离出本不属于 View Controller 的一些职责 ,避免导致 Massive View Controller
的形成。Coordinator Pattern 可以翻译为协作者模式,该设计模式并不在 GOF
的 23 个设计模式之中。
作者结合代码,从 Coordinator 的创建到应用,讲解了一个如何将跳转功能分离出 View Controller 的例子。读者通过阅读本文,可以了解到何为协作者模式,以及如何将该模式应用到我们自己的 APP 开发中。
相关阅读:The Coordinator
🐎 Xcode tips and tricks – part two
文接上回,Xcode tips and tricks 系列的第二个合辑来了!作者更新的速度很快,本期仍然是 10 个快捷使用 Xcode 的文本 + 小视频,你肯定能发现一些“原来还能这样操作”的点。作者也在搜集大家的建议,如果你有什么清奇的手法,也不妨分享出来吧!
🐕 WKWebView 实现浏览历史恢复
在使用 WKWebView 的时候,我们会发现,WKWebView 无法实现浏览历史的持久化。WKWebView 中 backForwardList 属性用来记录浏览历史,但这个属性是只读的,且在下次冷启动 App 的时候,backForwardList 是全新的,故而会有这个问题。
如何实现 WKWebView 浏览历史的持久化?本文作者通对 Firefox 的相关源码进行分析,借鉴了 Firefox 浏览器的实现方式。总结一下:
-
当 App 启动需要恢复浏览历史的时候,启动一个本地的 Web server 并且加载一个特定的本地页面
-
提取之前保存的所有 url 信息,构造本地 url 越过同源策略限制,传递到�特定本地页面中,该页面通过调用 pushState 来达到修改 �backForwradList 的目的
-
当本地加载这些特殊 url 的时候,之前启动的本地 server 可以将其重定向到正确的url
🐢 细说 iOS 代码签名
iOS 签名机制其实挺复杂,我们可以跟随作者的脚步,一点点的去了解 iOS 签名机制中每一步的含义,此外作者还贴心的帮助我们将文章拆分,有助于我们分步阅读。
- 细说 iOS 代码签名(一):签名的作用及原理
- 细说 iOS 代码签名(二):开发者证书、Entitlements、Provisioning Profile
- 细说 iOS 代码签名(三):签名的过程及代码签名的数据结构
- 细说 iOS 代码签名(四):签名校验、越狱、重签名
因作者篇幅比较长,讲解的比较深入,有兴趣的同学可以通篇读完收益更大。若时间有限,推荐缩略版的 iOS App 签名的原理 供大家参考。
推荐人:xelzmm
🐎 Clear and searchable logging in Swift with OSLog
苹果在 WWDC 2016 (Unified Logging and Activity Tracing) 推出了新的统一日志系统(the new Unified Logging system)—— OSLog,它比以前的 print 或者 NSLog 功能要强大的多,苹果也是强力推荐使用新的统一日志系统。
本文主要介绍了新日志系统的三大特性:
-
新日志系统能够按子系统 (subsystem) 和分类 (category) 进行筛选搜索
let ui = OSLog(subsystem: "com.lordcodes.chat.ChatApp", category: "UI") os_log("Contact selected", log: ui)
-
同时也支持指定日志级别 (Default, Info, Debug, Error, Fault)
os_log("Contact selected", log: .ui, type: .info)
-
默认不收集动态字符串 (dynamic strings) 和复杂对象 (complex dynamic objects) 的打印信息,确保用户敏感信息不会持久化到日志文件,需要收集的话要在格式化输出时指定为
public
os_log("Contact %{private}ld selected", 2) os_log("HTTP response: %{public}@", responseCode)
注:CocoaLumberjack 封装的日志系统是支持 os_log(DDOSLogger) 的。
🐎 以流的形式执行 Multipart 请求
Foundation 框架中的 URL 类提供了非常全面的功能,此后还在 iOS 7 中新增了 URLSession 类。尽管如此,基础库中仍然缺少 multipart 文件上传的功能。
本文介绍了怎样发起 multipart 请求,并为解决多文件传输的性能问题,通过 AFNetworking 和 Alamofire 的方式,将硬盘中数据以流的形式读取来执行 Multipart 请求解决此问题。
🐕 Using protocols as composable extensions
面向协议是 Swift 推崇的一种编程范式,标准库里的基础类型也都是基于协议搭建起来的,利用 protocol extensions 的特性去达成复用和组合,但这些范式如何落实到业务上呢?这篇文章的作者就介绍了如何通过 protocol extension 去完成一个加载动画,并且对比了继承和协议的两种实现方式。
🐎 使用 Flutter 一年后,这是我得到的经验
过去一年开发者们对 Flutter 的热情有多高相信已经无需多言。Google 出品、跨平台、性能高等种种标签让越来越多的人加入其中。本文总结了作者一年来开发 Flutter 的一些心得,作者在 Flutter 上丰富的开发经验所进行的总结相信对于接下来想要尝试 Flutter 的同学是很实用的,这对我们做技术选型以及更多的考虑会很有帮助。
代码
🌟 UIKitSwiftDSL
迫于 StoryBoard 写布局带来各种协作上的问题,大型项目的布局一般都用纯代码来实现。纯代码布局最大的问题是可读性太低,有没有办法改善?
UIKitSwiftDSL 作者提供一个新思路:用区区 200 行代码实现一套布局 DSL(Domain Specific Language),通过提供声明式的写法提升布局代码的可读性。
建议通读源码,实现不复杂带来的使用体验却很有趣。或许我们也可以尝试设计一些 DSL 来优化特定问题。
🌟 flutter-go
阿里出品,Flutter 组件演示 demo 和中文文档,同时包括了 iOS 与 Android,快上手试一试。
habbit
个人 Flutter 作品,演示了一个完整的习惯跟踪 App 。从完成度上看还可以,复杂度不够,主要是演示了 RxDart 的用法。
swift-algorithm-club-cn
swift-algorithm-club 主要是 Swift 来实现算法和数据结构的源码和文章,对应文章都有对该算法的讲解,如果在学习或者复习算法的同学,不妨一看。
音视频
ggtalk | 广义跳槽论:简洁明了的方法论
这一期的 ggtalk 延续了上一次程序员比较关心的话题:跳槽。邀请来了老牌程序员、产品经理:Easy。相信经常刷微博的同学应该都知道他,Easy 之前在微博做过程序员和产品经理,也经历过独立开发。对于程序员的职场方法论有一套独特的心得,我听完之后感触颇深。比如作为程序员,不要只关注公司是否能出得起自己希望的薪水,更重要是要关注自己所能给公司带来的价值,不要被短期的供需不平蒙蔽了双眼。还有程序员如何提升自己的影响力? 最重要是能给别人创造价值。除此之外,还有不少有趣的视角。推荐大家收听。
内推
-
北京-百度网盘 持续招 iOS 开发:社招、应届、实习均可。项目在技术上很有挑战性,团队技术氛围极好。诚心希望各路大神前来切磋,也欢迎计算机基础好的小白来共同学习。简历发邮箱 [email protected],暂不考虑的也欢迎微博私信 @小非86 聊聊~
-
北京-蚂蚁金服 招iOS/安卓/前端开发:负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱)或者微博私信 @折腾范儿_味精 了解情况。
-
上海即刻:如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。
-
杭州奇志科技招聘 iOS、前端:奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 @没故事的卓同学 了解。
-
深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目:如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~
-
北京字节跳动 iOS 团队持续招人中:简历可以发送到...