老司机 iOS 周报 #26 | 2018-07-09

老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

MWeb 3.0 发布 | 首发半价销售,最后三天

MWeb 是一款专业的 Markdown 写作、记笔记、静态博客生成软件。对于长期和 Markdown 打交道的人来说是一款必不可少的利器。MWeb 3.0 在 MWeb 2.0 的图床上传、支持图表等优秀的功能之上带来了几个不错的新功能:

  • 全新的 UI
  • 快速笔记,随时随地快速记录笔记。
  • 快速搜索,搜索的功能有了一次全新的改动,而且还会持续不断的改进。
  • 增加了 Epub 导出功能

更多的改动说明,可以看MWeb 3 正式发布和 2.x 版处理说明及两者之间的功能对比

WiFi 联盟制定 WPA2 认证的升级版 WPA3,让 WIFI 变得更安全

2018年6月25日,Wi-FiAlliance® 推出 WPA3™ ,WPA3™ 是下一代 Wi-Fi 安全技术,向市场提供了最先进的安全协议。在 WPA2™ 的基础上,WPA3™ 专门为个人和企业网络 Wi-Fi 提供了额外功能,以简化 Wi-Fi 安全保障方法、实现更可靠的身份验证、为高度敏感的数据市场提高加密强度并保持关键任务型网络的弹性。 下一代iPhone说不定会支持WPA3™,有必要提前了解一下。中文参考:探索 Wi-Fi - 安全性。

文章

? 知识小集 2018 上半年文章汇总

知识小集的内容一直以简单实用、覆盖范围广著称。内容大多是项目中实际问题的解决方案,小编建议大家多用用它的小程序,因为有查询功能,能让你更高效的解决项目中碰到的实际问题。

? How Graphics Cards Work

近些年来,随着短视频、深度学习、挖矿等领域的兴起,GPU 的关注度日益提升。人们逐渐发现除了用来更好的跑游戏之外 GPU 还有很多的用途。这篇文章可谓是及时雨,介绍了 GPU 的前世今生以及 GPU 常见的架构以及如此设计的思想, 笔者看完后感觉以后凑热闹都凑得更有底气了。

除去介绍,本文还分析了 GPU 中常见的 bottleneck,以及内存显存数据同步性能的一些指标。在移动端做视频特效的同学应该都知道要避免频繁的在内存和显存中同步数据,相信看完本文后也能收获一些新的优化 sense。

? Test Driven Development Tutorial for iOS: Getting Started

测试驱动开发(TDD)是一种流行的编写软件的方法,却被国内很多开发者或开发团队所忽视。我们项目也忽视了编写 Test,最近我们项目面临重构,就要求编写 Test,这是为什么呢?这篇文章开头解解释了原因。

  • TDD 提供了有关开发人员期望应用程序行为的文档,此文档保持最新,因为测试用例与代码一起更新。

  • 使用 TDD 可以带来更好的代码覆盖率。

  • TDD 非常适合配对编程,其中一个开发人员编写测试,另一个编写代码以通过测试,这可以带来更快的开发周期以及更强大的代码。

  • 使用 TDD 的开发人员在将来制作主要重构时更容易。

如果你还没实际使用过 TDD,可以跟着这个文章进行尝试,本文使用图 + 代码得形式编写了一个非常好的入门级教程。

? ? ReactJS vs Angular5 vs Vue.js — What to choose in 2018?

这篇文章通过分析 Angular 5、ReactJS 和 Vue.js 的优势与劣势,帮你选择出最符合开发需求的前端框架。其中 Angular 适合构建高度可交互性的 web 应用,ReactJS 则适合构建数据定期变更的大型 web 应用,Vue.js 则适合构建高度适应性的用户界面和复杂的单页面应用。此外文章还列举出了采用各个框架的知名公司。

? ? Parallel Programming with Swift: What could possibly go wrong?

文章讲述了使用 Swift 进行多线程操作,会产生的诸多问题。如非原子操作导致的数据在多个线程进行设置时,即不为线程 1 设置的值,也不为线程 2 设置的值。或者是因为 CPU 的乱序执行影响了不同线程的逻辑判断。你可以使用锁、内存屏障(Memory Barriers)、Dispatch Queues 来避免这些状况。使用锁的话又可能会产生死锁、活锁(Livelock)、线程饿死(Thread Starvation)等诸多问题。最后,你做了你能做的一切,但 Swift 编译器并不保证您的代码顺序得到保留,可能会导致您的同步机制出现其它的问题,也就是 Swift 本身并不是 100% 线程安全的。Apple 提供了一些调试并发操作的工具,如 Activity groups 和 Breadcrumbs,但它们暂时还不支持 Swift。

? Operation and OperationQueue Tutorial in Swift

一个使用 Operation 和 OperationQueue 的教程,Operation & OperationQueue 相比 GCD 而言,可以在 Operation 之间添加依赖关系决定它们的执行顺序,并且可以取消暂停和恢复.作者利用这些特性,来改善一个图片列表页的体验。将图片的下载及加工添加到 OperationQueue 中。在列表页开始滑动时,暂停所有的 OperationQueue,停止滚动时,恢复 OperationQueue,并取消掉屏幕外 cell 的 Operation,启动屏幕内 cell 的 Operation,提升了列表页滑动的流畅度。

? Ways we make the Slack iOS app accessible

Accessibility 这个话题由于种种原因,在国内的重视程度通常远远不及国外,可以说是国内应用普遍的短板。Slack 团队在 iOS app 里专门针对这一点做了许多优化,如对于眩晕症用户禁止动画/转场,视力不佳的用户提供字体缩放,听障用户支持 VoiceOver 等等手段来增强 app 的 accessibility,同时还增加了代码的可测试性,相信对于我们的日常工作会有一些启发。

? FOUND: 7 lost principles of continuous delivery

持续交付在当前产品测试发布中扮演着很重要的角色。通过 Fastlane & Jenkins 的组合搭建持续集成和持续交付环境也深受广大 iOS 开发者喜爱。但我们在开发和部署这些持续交付环境时,往往容易因为一些错误的原因而做得过度了。该文总结了我们在实践持续交付时需要注意的七点原则。分别是:

  • 为软件发布创造一个可复用和可靠的步骤,例如持续集成(CI)技术;
  • 让一切能够做成自动化的自动化;
  • 所有东西都是基于版本控制的;
  • 将痛苦的流程提前,比如通过单元测试,组件测试等将测试流程提前;
  • 保持构建和测试的过程是简短的,敏捷开发和快速迭代;
  • 保证产品构建、部署、测试和发布流程中的每一个部分都对其参与人可见,每个人都是问题反馈者;
  • 完成就意味着已发布,在产品迭代中,我们常会把完成等同于开发完成,但在持续交付管理中,完成应该是指的已经面向客户发布阶段;

? View Controller Lifecycle Explained: When to Use viewDidLayoutSubviews

我想每个人在学习 iOS 开发时都会去认真思考的一个问题便是 View Controller 的生命周期是什么样的。这篇文章通过几个例子,分别说明了 viewDidLoadviewDidAppear 以及 viewDidLayoutSubviews 三个回调方法的含义及其使用场景。

值得一提的是,文中提到的一个观点本人很是认可。作者主张通过细节去进一步理解框架,这和我们古人『知微见著』和『一叶知秋』的智慧不谋而合。

? AutoLayout 中的线性规划 - Simplex 算法

从数学角度出发探究 AutoLayout 可能采用的高效算法。 熟悉 AutoLayout 的朋友应该知道,AutoLayout 的实现本质就是提供一个有解的多元一次方程,由系统去解出方程,用来确定 Layout 位置。当然,想要解开一个有大量未知数的方程,不同的算法会带来截然不同的结果。 而今年 WWDC 上苹果一再强调的 AutoLayout 性能的大幅提升,更是再次证明了算法的重要性。 作者从 Simplex 算法出发,提供了完整的解法过程,也提供了 Python 实现的样例代码,值得学习。

? A look at UIView Animation Curves Part 1 Part 2 Part 3

文章用具体的动画,向你展现了各种不同的动画曲线的效果差异。 很多时候,我们通过看各种曲线的名字并不能很好的理解在实际中,具体动画效果的差异。而文章中提供了具体的动画曲线来解释每种曲线的效果,同时也提供了简单的自定义 Bezier 曲线的效果。 在此提供一个第三方网站,可以更好的让你理解控制点对 Bezier 曲线效果的影响。 当然,如果有机会的话,自己亲自动手实践能进一步加深对各种曲线效果的理解。

? ? 15 Years Ago, I Went Indie and Didn’t Know It.

Ulysses 15 周年之际,Ulysses 创始人 Max Seelemann 回顾了他与 Ulysses 的渊源。15 年前,他 16 岁还没上大学,和朋友用业余时间一起打造了 Ulysses。2011 年他大学毕业的时候,将 Ulysses 放到了 Mac App Store 上,出人意料的是居然大受欢迎,并且第一次给他们带来了一笔收入。收入够他们两人花三四个月,于是他们抱着热忱开始全职开发 Ulysses,到现在团队已经有 12 人。

行文间能感受到作者作为一个开发者的纯粹,所以最后他发出标题这样的感慨:15 年前,我开始独立开发,然而我并不知道最后它能发展成什么样样。作者从来没有制定一个远大的目标,只是抱着对开发的热忱一步一步走到了今天。

? iOS代码调试: Safari / Chrome 调试 WebView

随着越来越多的应用使用混合架构,开发者和 WebView 打交道总是免不了的。本文介绍了通过 Safari / Chrome 来调试模拟器/真机中 WebView 的方法。即使对于 iOS 原生开发者,这些技能也是用得到的,推荐阅读。

? iOS代码调试: 启动参数和环境变量

对于 Xcode 的环境变量,大家最熟悉的一定是刚用 Xcode 8.0 时,使用 OS_ACTIVITY_MODE = disable 来屏蔽一些多余的控制台日志。除此以外,估计大多数人都没有动过 Edit Scheme 的念头。本文介绍了 Edit Scheme 中的 Argument/Options 模块。通过这两个模块,我们可以在启动应用时定义一些额外参数,从而实现特定场景的调试。例如覆盖 UserDefaults 中的默认值、变更语言等,赶紧试一试吧。

? React Native: A retrospective from the mobile-engineering team at Udacity

又一家公司 Udacity 宣布放弃使用 React Native 。尽管 Udacity 的团队中大部分人都对 RN 的开发很满意,但因为他们用 RN 开发的业务功能模块被下线了,所以 App 内移除了 RN 相关的功能代码。他们也把他们的经验整理汇总希望对其他人有帮助,至于未来还会不会有新的业务模块重新用RN进行开发,团队内部也有不同的看法,iOS 团队表示如果有机会还是愿意在用 RN 试一试,但 Android 团队持保留意见。

本文从产品设计角度,代码整合角度,RN 自身角度,团队协作角度,分别阐述了 Udacity 团队的一些看法与经验。

  • 产品设计角度:从 UI/UX 的设计越来越无法做到两个平台一样的设计统一,总会根据各自平台的各种特性与用户群体有不同的交互设计,导致他们其实并没怎么用 RN 来实现跨平台的一次性开发工作,尤其是安卓设备太多的碎片化差异化的独有硬件功能,基本上用了 RN,还是在两个平台各写各的功能。
  • 代码整合角度:安卓平台与 iOS 平台都在是用各自的包管理工具。当把 RN 整合进现有仓库之中后,他们的持续集成系统被迫要根据 RN 的引入进行很大的调整,这对他们造成了很大的负担,并且现在也解决的不是很顺畅。
  • RN 自身角度:RN 的文档缺失,导航问题,页面性能问题等,在 RN 相关的社区其实都有很多的讨论,不仅如此,每当 Google IO 或者 WWDC 发布新功能的时候,RN 组件跟进慢也是一个问题。
  • 团队协作的角度:由于他们本身产品设计已经在针对安卓和 iOS 有着不同的功能,当 JS 快速迭代的时候,经常会面临一个问题,当一个平台快速开发或修复一个功能很容易引起另一个平台的问题。使得以前修 bug 只需要懂一个平台就好了,现在修 bug 需要同时考虑 js Android iOS 三个平台,无形之中增加了沟通成本以及测试成本。

? 厌倦了 Core ML?试试 Google ML

今年 Google I/O 上,发布了一款叫做 Google ML 的跨平台机器学习框架,最大的特点就是开箱即用,可以直接使用 Google 已经训练好的模型,包括表情识别,文字识别以及图片标识等等,感兴趣的同学可以看看这篇入门教学,写出属于你的 Not Hotdog 应用?。

? 程序员应不应该背锅?

Peak 大神在本文分享了 Fackbook 对于线上事故的 Review 流程和处理思路,对比了国内和国外团队对于事故追责的不同做法,Peak 大神本人倾向于赞同对事不对人的做法,建议应该查清流程上的漏洞而不是定性人为疏忽。窃认为国内的制度本质上是保持团队的紧张感,对于工程化程度不高的团队而言是一个很好的管理工具,能够保证整个管理体系不会腐烂掉,属于通往高效能团队的起始阶段,我们很难要求在国内的大环境下做到一步登天。

? REST vs. GraphQL: A Critical Review

当前 REST 风格的 API 架构方式已经成了主流解决方案了,它是对于资源( Resource )的模型化而非步骤( Procedure )。因此它可以很好地将前端和后端的工作进行解耦,只需要设计好 API 以后就可以分别进行开发。

GraphQL 是近来比较热门的一个技术话题,相比 REST 和 RPC ,它汲取了两者的优点,即不面向资源,也不面向过程,而是面向数据查询( ask for exactly what you want )。同时 GraphQL 本身需要使用强类型的 Schema 来对数据模型进行定义,因此相比 REST 它的约束性更强,所以 GraphQL 也有 REST 2.0 的别称

本文分别比较了 REST 和 GraphQL 两种技术方案的优缺点和适用场景,对于想要对新项目制订技术方案的读者有很好的参考价值。

参考资料 如何给老婆解释什么是 RESTful RPC vs REST vs GraphQL 安息吧 REST API,GraphQL 长存 30分钟理解GraphQL核心概念

? A fresh way to build native apps for Apple platforms with Swift

现如今,各个 App 普遍集成了越来越多的功能,开发人员需要为此付出大量的精力在诸如应用内购买、系统权限授权、universal links、Siri 支持等等。一直以来我们可能都期待一个简单的框架能够让我们快速实现这些基础功能,而 Flint 恰好就是可以让我们轻松应对这一切的框架。Flint 可以使我们更加专注于产品特性。它采用 FDD(Feature-Driven Development,即特性驱动开发)的开发模式,在开发中我们可以围绕 Feature 和 Action 两个部分进行编程,而其余的部分 Flint 会帮助我们来完成。Flint 特别适合中小团队或者个人开发者进行快速的迭代开发,有兴趣的同学不妨一试,换一种新的开发思路。

? 华为快应用引擎技术架构详解

2018 年 3 月华为与小米,Oppo,Vivo 等 9 家手机厂商,联合发布快应用联盟标准。快应用是一种基于手机硬件平台的新型应用形态,无需安装,即点即用,又兼具原生应用体验(性能、系统整合、交互等)。

本文讲了华为快应用的技术架构,及通过「流式加载」来解决网络延时问题、「快照」解决首屏渲染问题。虽然都是安卓平台,但对其引擎内核的研究有助于自研或部署垮平台方案。

? 如何在 iOS 11 里把你的 App 集成到 Files

iOS 11 里首次加入了文件管理应用,让我们可以在手机和平板上更加方便地管理文件,并且提供了 API 让第三方应用集成到 Files App 里,如果你的 App 也像 Dropbox 或者 Office 那样重度依赖文件管理系统的话,那这篇文章就很适合你,作者通过 Demo 逐行代码带你走一遍接入流程,并且把过程中所有需要注意的点都非常详细地讲述了一遍,绝对是新手友好的一篇文章。

? 美团出品:EasySequence

美团在国内一直是 MVVM 以及 FRP 的资深玩家了,前不久他们刚刚宣布即将开源一套基于响应式的基础库 EasyReact,同时也将陆续开源与之相关的其他 Easy 系列框架,这次刚刚开源的EasySequence 想必就是其中之一。对这一块技术有兴趣的同学,可以先 Down 下来率先开源的这个框架,相信后面陆续开源的一些列 Easy 框架会给该领域带来一个强大的新鲜血液。

? ? What It Was Like to Write a Full Blown Flutter App

作者拥有 17 年的开发经验,其中近 4 年专注于 iOS 开发,期间也接触了如 React Native、Flutter 这些跨平台开发框架。在他做了一个完整的 Flutter 应用后,就感觉自己可以放心地投入更多的精力在 Flutter 框架上。并且计划要做一个叫 Practical Flutter 的课程 —— 通过移植自己的 Steady Calendar 应用到 Flutter,来从头到尾地教其他人使用 Flutter。对 Flutter 感兴趣的可千万不能错过,课程将会在 7月18日 后开启,可以通过登记 邮件列表 第一时间获得通知。

本文开头描述了作者对移动/跨平台开发的一些想法,接着罗列了自己在把 iOS 应用移植到 Flutter 上的经历、学习 Flutter 后的一些思考以及对 Google 团队的几点建议。其中提到比较多的有开发体验、开发教程以及 UI 设计相关。可以看出作者对 Flutter 社区的依赖性和用户体验的执着感都是比较强的。这也从侧面说明很多人对 Flutter 是非常看好的,预示着 Flutter 正在开启下一阶段跨平台开发的浪潮。

? UITableView Infinite Scrolling Tutorial

本文是一篇新手向的文章。介绍了如何构造可无限滚动的 TableView。内容涉及了网络请求,TableView 基础知识。值得一提的是,本文使用了 iOS10后 引入的 Prefetching API,用于优化 TableView的性能和体验。

? 追踪 Objective-C Block 代码定义的位置

之前周报收录过一篇 《追踪 Objective-C 方法中的 Block 参数对象》。本文则是在此基础上,通过 Mach-O 文件格式获取 Mangle Name 并根据 Clang 源码实现对其解析,探寻如何追踪 block 代码定义的位置。

设计

? The iPad as a fast, precise tool for creativity

这篇 Ink & Switch 研究团队的文章分析了如何让 iPad 应用向桌面级生产力工具迈进(甚至不依靠实体键盘):

  • 利用 Apple Pencil 提供高效的操作方式(画个 □ 就是新建,画个 ∧ 是拷贝,画个 ∨ 是粘贴,画个 × 就是删除)
  • 尽可能减少界面上的按钮(尤其是靠近边框的按钮),让用户可以随心所欲地抓持 iPad(像纸质笔记本那样)而不会误触
  • 为每个界面都提供类似桌面端菜单栏的快捷键列表
  • 移除所有不直接的操作(例如长按触发),多采用拖拽等直接的交互方式
  • 为用户提供使用说明书,生产力工具需要说明书(例如 Photoshop、vim、AutoCAD 等等)

工具

机器学习50个最佳免费数据集

深度学习的研究和生产之间存在较大差异,在学术研究中,人们一般更重视模型架构的设计,并使用较小规模的数据集。特斯拉 AI 总监 Andrej Karpathy 在某次会议上祭出了一张图,展示了工业界和学术界在数据和模型上的时间花费对比。从这张图中,我们可以看到业界在处理数据集上所花费的时间比学术研究多得多,几乎占据了 3/4 的时间。这里列出了 50 个可以用来训练模型的免费大型数据集,大大帮助研究者和开发者减少寻找合适数据集的时间。

代码

Bartinter

Bartinter 是一个状态栏外观管理器,根据状态栏的背景内容来动态改变状态栏的颜色,以便让状态栏清晰易读。

内推

字节跳动 北京 iOS 团队持续招人中

这是一家非常年轻的创业公司,充满活力与激情,只招优秀的人,一起做有挑战的事情。直接内推可以将简历及心仪岗位发送至我的邮箱 [email protected],或者添加我的微信 jingmu1994 了解更多公司信息。有需要的我也可以直接帮你对接技术 Leader 详聊。

深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目

如想了解更多深圳头条的信息,可以加小T微信:tomtan,切磋技术和聊情怀都可以喔~~~~

杭州/广州/深圳 奇志科技招聘 iOS、前端

奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域, 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。Mesh 在运用 yarn, rollup, vue 等技术栈的同时,利用 Couchbase 设计多端数据同步方案,并深入研究 React Native。也可以微博上私信 @没故事的卓同学 了解。

百度教育事业部招 iOS 开发

部门下面有百度阅读,百度文库,百度爱听等 App 产品。团队技术氛围浓厚,有兴趣的同学欢迎将简历发送到我的邮箱:[email protected]

上海-加入即刻

即刻 iOS 团队从一开始就使用纯 Swift 开发,至今已有三年多时间,是国内较早大规模使用 Swift 的团队。我们比较偏爱 RxSwift 和 Texture 等框架,追求和最优秀的工程师一起,用最高的标准做用起来最爽的 app。 如果你认识聪明勤奋、胆大心细、有追求的工程师,那就来加入我们吧!任何推荐或简历可直接发给 Jason(即刻 iOS leader): [email protected],或微博 @JasonYuh。

关注我们

我们开通了公众号【OldDriverWeekly】,每期发布时公众号会推送消息,欢迎关注。

同时也支持了 RSS 订阅:github.com/SwiftOldDri… 。

本期编辑

@没故事的卓同学,@四娘,@mmoaay,@享耳先森,@Damonwong,@折腾范儿_味精,@张嘉夫,@AidenRao,@Parsifal,@aaaron7,@方秋枋,kyo,tom510230,anotheren,水水,looping,@JasonYuh

说明

? 表示需,? 表示编辑推荐

预计阅读时间:? 很快就能读完(1 - 10 mins);? 中等 (10 - 20 mins);? 慢(20+ mins)

你可能感兴趣的:(移动开发,swift,ui)