Skip to content

Releases: SwiftOldDriver/iOS-Weekly

老司机 iOS 周报 #39 | 2018-10-15

22 Dec 09:52
Compare
Choose a tag to compare

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

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

新闻

Swift in 2018

JetBrains 针对 Swift 编程生态做了一个调查。结果显示只使用 Swift 的开发者占比 54%,混编的占 16%。83% 的 Swift 开发者在使用 4.0 或者以上的 Swift 版本。

仅 23 天,iOS 12 安装率超过 50%

iOS 12 推出仅 23 天装机量超过 50%,而 iOS 11 达到这个成绩用了超过一个月。相比 iOS 11 发布后的 bug 满天飞,iOS 12 的改进赢得了用户口碑。

文章

🐎 质量监控 - 卡顿检测

卡顿检测是 APM 里体验是否流畅的重要标准,被大家熟知的卡顿检测方式通常是基于主线程是否执行任务过载来进行。这篇文章较为系统地分析了卡顿检测的各种手段及其实际效果和性能损耗,除了借助 Instruments 工具,在代码侧还有 FPS、Ping、Runloop、Stack Backtrace 和 msgSend observe 5 种手段。

🐎 It’s wrappers all the way down

"Swift 标准库目前的求值策略是:如果一个操作的惰性求值是无需消耗性能的话,那就应该让它成为一个惰性操作。如果惰性求值的实现反而会消耗性能的话,那应该就让它及早求值,如果它有一种等价的 lazy 实现的话,那就应该通过 .lazy 去实现。"

基于这种求值策略,我们在对数组进行一些复杂的操作时,更 Swifty 的方式是考虑如何为这一种操作创建合适的 wrapper。这篇文章带着我们重新实现 lastIndex(of:) 函数,为这一种集合操作创建 ReversedCollection2 的抽象,并解释 joined / reversed 之类的集合操作的原理。

🐕 如何实现可以获取最小值的栈?

这是前几周微博上和微信大家争相转发的一篇公众号文章。文章用漫画的形式讲了一道算法题目的解题过程、文中一步一步逐渐深入,逐渐优化,最后得出最优解。

其实在真正的面试过程中,情况也是一样的。面试官很多时候并不希望你能一次就给出最优解,反而是期待你能从最简单的暴力解法开始,一步一步优化出最优解。面试中很多同学一旦遇到了自己曾经准备过的题目,往往会选择直接写出最优解,殊不知很多时候反而会得到一个负面评价,原因是你曾经做过了这道题,但是却没有主动让面试官换一题新的,不够诚实。这种时候,跟着面试官的思路,从暴力解法开始一步一步优化,最后得出最优解,反而更能体现你的解决问题的能力。

没读过这篇文章的同学不妨读读文章,来看看解题应该是个怎么样的思考过程。

🐕 [译] 揭秘 iOS 布局

iOS 的布局系统是每个 iOS 工程师都需要具备的基础知识,我们可能每天都在跟诸如 setNeedsLayout()、updateConstraints() 之类的方法打交道,但是可能并没有形成一个非常系统的认识。本文作者详细讲解了每个方法的作用以及不同方法之间的联系,相信能带给大家一个相对全面的认识,加强对布局原理的理解。

🐢 iOS Memory Deep Dive

这是一篇内容非常详实的文章,作者围绕着内存这个话题,从现代计算机操作系统的虚拟内存机制一步步讲到 iOS 的虚拟内存机制,最后给出了在实际开发中一些如何高性能运用内存的建议。

🐕 Access Control Management with Swift

本文介绍了用户权限管理的抽象方式,构建了一个基于用户属性的访问控制框架(Attribute Based Access Control),利用了 swift 中 protocol 的强大功能,以策略(Policy = Role ShouldBeAbleTo Action when Condition)的形式,对需求进行建模。该框架可以以非常小的变更成本,增加新的策略来维护权限要求,最后产生的判断用户权限的 API 也非常优雅。

🐢 How to Write Clean Code

本文是一篇介绍 Code Review 工作流程的文章,从以下四个维度介绍了作者的经验

  1. Code Review 的必要性和最佳时间点
  2. 如果已经准备提交 Review ,注意代码规模(太多别人看不来,太少看不出端倪)
  3. 执行 Code Review
  4. Code Review 的例子
    总体而言,Code Review 应该是审查代码内容、代码逻辑和安全边界,如果可以的话连测试用例也一起进行 Review,对于代码风格类的东西应该借助 Checkstyle、TSLint、Baseline、Prettier 等工具完成,而 Review 的记录应该保存在一个平台上以供参考,可以使用 Reviewable、Gerrit、GitHub 等工具

🐕 🚧 On Learning to Code (for 2019)

通过谷歌 learn to code 趋势可以看出从 2012 年开始人们学习编码并成为职业人员的趋势开始有所增长。作者就自己从业 7 年的经验,给大家分享作者认为很重要的三点。

  1. 学习的初始编程语言应与您的目标保持一致
  2. 计算机科学≠软件工程
  3. 技术面试并不是完美的

工具

JSDebugger 一款iOS的动态调试器

一款可以动态在 iOS 中执行调试代码的工具,原理是利用 JavascriptCore 与强大的 iOS Runtime 还有很多其他的 dynamic call 方式来结合形成的一套可以动态调试 iOS app 的工具。工具内的代码堪称对 JSCore 还有 iOS Runtime 学习的样本,值得一看,值得一学

Sizes

Sizes 这款工具可以根据不同 iPhone/iPad 设备及尺寸规格、横竖屏、字体预览界面显示效果,省去同时打开很多模拟器并来回切换的麻烦,提高布局测试的效率。

代码

smoke-framework

SwiftNIO 的推出被视作 APPLE 终于肯“认真对待” server-side swift 的标志。目前各大 swift 服务端框架都纷纷接入了 SwiftNIO 的支持。简单的总结 SwiftNIO 就是:很强。

smoke-framwork 是 Amazon 推出的 server-side swift 的框架,默认使用 SwiftNIO 来做网络层,并且支持 OpenAPI 这样的代码自动生成工具。Amazon 作为行业主要是云服务提供商,这个发布是极具指导意义的,代表 swift 真正被服务端市场所接纳、认可。虽然目前针对 smoke-framework 的评测还不多,但基本可以确定的是该框架会和 Amazon 的 AWS 生态有较好的融合,这对于绝大多数公司而言绝对是利好。

还等什么呢,学就 vans 了。

推荐人:LeeCenY

Logan

对于一个 App 来讲,日志的收集、上报、查询是非常重要的。而目前在各个公司中,对日志的处理大多并没有形成一套完整的体系,都是针对不同的日志类型,如crash、性能、打点等等进行单独的处理。近日,美团点评开源了移动端基础日志库 Logan ,Logan 是一个功能完善、无侵入的日志框架,解决了很多移动端日志方面的痛点,并且拥有较好的性能,可以很方便的接入。

音视频

NSSpain

一份来自西班牙 Cocoa 开发者的视频合集,最近一篇就来自 Mattt 大神,同时,作为英语听力材料也是很棒的说。

🚧 SwiftConf '18

Swift Conf 是欧洲技术爱好者组织的 Swift 大会,今年大会的主题演讲视频在大会完成之后立刻放了出来,里面包括一些今年比较火的主题,例如机器学习,ARKit,Swift ABI 稳定,Swift 服务端开发等,有兴趣的同学可以看一下。

内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

@没故事的卓同学@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal@aaaron7@方秋枋kyotom510230anotheren水水looping@JasonYuh@老老老老老老老驴@小非86

说明

🚧 表示需翻墙,🌟 表示编辑推荐

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

老司机 iOS 周报 #38 | 2018-10-08

22 Dec 09:52
Compare
Choose a tag to compare

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

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

新闻

TestFlight 开始支持邀请链接

在今年的 WWDC 中,苹果就已经透露将在下半年推出 TestFlight 的公开链接邀请功能,现在这个功能已经正式开放。

另外 dustturtle 也第一时间分享了自己的实践成果 - 千呼万唤始出来 - TestFlight public link 功能正式发布了!

Apple’s use of Swift in iOS 12

iOS 中使用 swift 的地方在持续增加,在 iOS 12 中包含 swift 的库相比 iOS 11 增加了一倍。

Swift 5.0 Release Process

Swift5.0 离我们越来越近了,了解一下最近的进展吧

  1. 二进制不向下兼容,容易理解,Swift 新版本就没有向下兼容过
  2. 必须强制迁移 Swift3.0 的代码,不然你只能使用 Swift4.2 来编译了
  3. 现在提供了 Swift5.0 的尝鲜版
  4. 预计2018年11月16日对于 Swift5.0 是一个很关键的时间结点(真的吗?)
  5. 希望你们会喜欢 Swift5.0 的新编程思想(又变?)

专栏

iOS 上修改私有方法的几种方式解析

iOS 开发中,或多或少都会有遇到修改私有方法的需求,这篇文章总结了目前我们能够使用的方式,并从面试官的角度推荐应聘者应该怎么回答这类开放性问题。

文章

🐢 Mirror 的工作原理

这篇文章主要介绍了 Mirror 的工作原理,Mirror 简单来说就是用来做类型反射的 API,可以在运行时里获取实例的类型信息,例如 Playground 里的变量数据预览就是基于这一套 API 来完成的。

文章主要分为两个部分,第一部分是元类型的抽象(类型的类型),运行时函数动态派发的实现原理,第二部分就是 enum / struct / class / tupe 四种元类型各自的实现。

通篇看完感觉其实 Mirror 的实现非常直截了当,因为 Swift 的泛型功能要求它必须有足够丰富完整的 Metadata,才能在运行时更好的描述泛型实例的存在,完成函数派发,属性存取和类型转换的工作。

在这么一个背景下,Mirror 的实现基本就是从已有 Metadata 里获取类型数据,然后展示出来,或者是通过 Metadata 定位成员变量的相对位置,然后进行存取操作。

🐢 AR Face Tracking Tutorial for iOS: Getting Started

Ray Wenderlich 的又发新教程了。这次是教你如何用 TrueDepth Camera 来做 AR 面部追踪。

和往常一样,他家教程类文章会有非常详细的步骤和截图,带你一步一步的操作,非常适合对文章中涉及的知识领域不是很熟悉的同学们。

另外这篇文章也是免费教程的一部分,所以并不需要进行任何付费。

🐎 Why #if DEBUG Conditional Should Be Avoided in Library Code

文章作者分享了一次自己使用 Carthage 导入自己的库时遇到的坑,来说明了为什么在 SDK 的开发中尽量避免条件编译指令,因为你不知道使用你 SDK 的人的编译环境会有怎样的变数,文章很短,算是一次有趣的小分享。

🐢 [译] Metal 渲染管线教程

Apple 在 2018 的 WWDC 上正式宣布 OpenGL ES 标记为 deprecated,推荐使用 Metal 来做 3D 渲染,很有勇气。在细致的了解 Metal 后,就能发现苹果的勇气不是没有原因的,Metal 几乎最大限度的利用了 iOS 的硬件特性来提升性能,是 iOS 的首要选择。

本篇文章的文风很像很多经典的 OpenGL 教程,从渲染的概念,流程讲起,并一步步教你如何画出第一个三维的物体,强烈推荐有兴趣的同学仔细阅读。

推荐人:史前图腾

🐢 beeshell:开源的 React Native 组件库

文章介绍了美团所开发的基于 React Native 的组件库,提供了一系列基础 UI 组件,包括按钮、弹窗、表单、输入框等等,覆盖了 iOS 和安卓两端,并分析了一些设计理念。

🐕 从 FE 视角看大前端

大前端是现在比较流行的话题与方向,相信也有很多移动端的同学对这个方向有很浓厚的兴趣,而这篇文章的目标阅读群体刚好适合对前端 FE 感兴趣的 Native 开发同学, 聚焦在 PC 和 H5 浏览器层面。可以让你对前端开发有全景方式的了解, 以及引发大家的兴趣。很多 native 开发可能苦于前端众多的名词,众多的框架不知从何下手,这篇文章刚好适合你。

🐕 UIField​Behavior

文章以悬浮框为例,讲解了 iOS 物理引擎 UIKit Dynamics 中的 UIField​Behavior 的相关内容。首先描述了 Field Behaviors 是什么,接着讲解了 Spring Fields 怎么用,最后结合 Behaviors 的一些特性实现了一个适用于开发调试的悬浮框。

推荐人:WXGBridgeQ

🐕 巧妙实现 debugOnly 函数

作者在学习 Vapor 的源码看到一段不需要宏定义的 debugOnly 函数实现。代码如下:

func debugOnly(_ body: () -> Void) {
    assert({ body(); return true }())
}

对于大部分项目来说,这个功能看似没有什么用处,但是仔细考虑一下,对于一个可以被任何一个项目依赖的 SDK 来说,这个 debugOnly 实现可以说是很完美了。

🐢 Bloom Filters and Swift 4.2

文中实现了 Bloom Filter,并使用了 Swift 4.2 中 Hasher 新特性来优化代码。

🐕 驴妈妈客户端频道页模块化设计思路

对于做偏运营类的应用开发,有一项很重要的技术需求就是能够做到对应用内容进行实时更新,而且是越灵活越好。本文就详细介绍了驴妈妈客户端团队在 SOLID 原则的指导下,重点围绕面向接口、数据驱动、模块隔离这三个点设计了适合自身业务场景的模块化框架。它既满足了缩短内容上线周期的需求,也为创建一个统一规范的业务组件库提供了思路和方向,同时框架的整体设计也是非常值得参考和学习的。

🐕 INSIDE AUDIOKIT SYNTH ONE: A BRIEF TOUR FOR DEVELOPERS

本文的大部分内容是作者在对 Synth One 应用添加 AUv3 扩展时的开发笔记。后来他为了分享自己捣鼓开源项目 AudioKitSynth One 的经历,就写了这篇文章,也希望借此帮助那些想要做类似 iOS 音乐合成器开发的人能够快速了解框架内部的设计。

🐎 代码评审的不可能三角

Code Review 是保证代码质量的重要手段之一,但许多研发团队中它常常由于各种原因并未得到真正的落地。为什么会这样呢?本文作者用一个非常简单的观点理解了这个现象,并据此给出一点优化的想法。希望本文的想法对同样被评审困扰的同学有帮助 :)

🐕 利用函数组合提升代码可维护性

在平时的开发中,我们可能会遇到一些场景,开发起来,代码写的很繁琐,例如文中作者举的例子:

process1(_ param: String) -> String
process2(_ param: String) -> String
process3(_ param: String) -> String
process4(_ param: String) -> String

这种情况,如果直接采用函数式编程,可读性又不会太好。而为了重构让代码变得具有更好的可维护性,作者利用函数的组合来解决这个问题。除了上面函数签名致的例子,作者还提到了函数签名不一致,以及异步操作这两种情况的解决方案。

推荐人:matthew

🐎 MMKV 中的简单 LRU 缓存(LRUCache)

本文简明地分析了开源库 MMKV 中 LRUCache 的实现。MMKV 中的 LRUCache 实现简单易懂,文章中的源代码也加上了注释,大家看一遍这篇文章就能明白具体的实现原理。

🐕 Migrating to Unified Logging, Swift Edition

本文介绍了一种更优雅的打log方式,使得开发人员不要再混乱地管理log代码

  1. 正确对待 OSLog,他本来就帮你分了 log 的等级
  2. Console.app 能够帮你更好地查看客户端的 log (如果你用的是 os_log 的话)
  3. 尽量使用 os_log
  4. 更多应该注意的细节

代码

andreamazz/SubtleVolume

SubtleVolume 是一个音量条组件,也支持在 iPhone X(S/R) 的刘海上做文章,如果你的播放器需要一个自定义音量条,不妨看看它。

设计

一定要会的Sketch设计方法和工作流

泊学关于 Sketch 入门相关的视频课程。

内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

@没故事的卓同学@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal@aaaron7@方秋枋kyotom510230anotheren水水looping@JasonYuh@老老老老老老老驴@小非86

说明

🚧 表示需翻墙,🌟 表示编辑推荐

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

老司机 iOS 周报 #37 | 2018-09-24

22 Dec 09:52
Compare
Choose a tag to compare

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

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

新闻

Swift 4.2 正式发布

Swift 4.2 正式发布。我们可以通过 WWDC 2018 的 Session What’s New in Swift 快速了解新特性。Ole Begemann 总结的 Playground 也方便我们上手试验把玩。

一本走心的 JS-Native 交互电子书

知识小集团队 @lefe_x @halohily 同学潜心著作的一本学习 JS-Native 交互的电子书,这个专题旨在能够帮助更多的同学掌握 Hybrid 在 iOS 中的应用。整个专题总共分为四章,强烈推荐给大家

第一章 主要介绍 JS 语法,为后续的章节做好铺垫,不过建议读者系统地学习一下 JS,对整个专题的理解有很大的帮助;

第二章 介绍了 JavaScriptCore 这个框架与 OC 间的通信;

第三章 介绍了 WKWebView,以及一些调试技巧;

第四章 主要对前面讲到的知识进行实践,其中 JSPatch 部分理解起来比较吃力,如果读者想深挖 JSPatch可以结合源码一起看本章内容,理解起来更透彻。

微信开源基于 mmap 内存映射的 key-value 组件 MMKV

微信团队于最近宣布开源 MMKV,这是一个基于 mmap 内存映射的 key-value 组件。而这个组件在微信内部已经使用了 3 年,稳定性上得到了验证。而在性能上,也比传统的 NSUserDefaults 等方案更加出色。并且也移植到了 Android 平台,在这次一起开源。

专栏

🐢 Swift for TensorFlow, First Class Machine Learning in Swift

Swift for TensorFlow 是 Chris 到 Google 之后发布的新项目,目的在为 Swift 提供内建的机器学习能力。整个技术用了非常巧妙的方式,在编译器层面实现了对 TensorFlow 的支持,非常创新。并且从项目的设计思路也能够感受到 Chris 对 Swift 这门语言的一些想法,Swift 绝不简单是客户端或者服务端编程语言,而是一个全新的编程平台,开放优雅的架构使其能够无缝和其他语言进行交互,而且是在类型安全的前提下。

我在 2018@Swift 大会上分享了一这项技术的一些原理和应用,这篇文章是分享的文字版。

Swift for TensorFlow

🐢 [译]SE-0206 Hashable 加强

Swift 4.2 其中一个比较大的改动就是 Hashable 协议,对这么一个基础的协议做改动,即使在一年出一门新语言的 Swift 大家族里也几乎是第一次🤷‍♂️,看到这篇提案的时候我就产生了这么几个疑问:

  1. 为什么要用 inout 这种大家很陌生的概念?
  2. Hasher 好像是哈希函数的抽象,那为什么它不是一个泛型,而是结构体?那应该怎么去自定义哈希函数?
  3. 而且为什么要去改动这么一个基础协议?之前的协议有哪些不足?

在查阅了一些资料之后,我发现国外对于这件事情的讨论其实也不多,最好的资料还是 Swift-Evolution 的提案,所以特意翻译出来,希望能够帮助大家更好地了解这一次基础协议改动的来龙去脉。

文章

🐎 这次 swift 大会分享准备的幻灯片和 demo

这次 2018@Swift 大会,戴铭的幻灯片惊艳全场,把本身就比较晦涩的编译原理相关的知识,用美轮美奂的漫画体现出来,给人一种耳目一新的感觉。这篇文章讲了一些分享的背景还列出了全部幻灯片的截图,错过大会的同学不容再错过文章。

个人最喜欢的是 AST 那几 p,你们呢?

🐎 Facebook 工作体验之绩效考核

本文讨论了 Facebook 和国内公司的业绩考核之间的异同。讲来不同的考核制度本身并没有什么好坏之分,更多的还是在不同环境下取得对公司和员工最有利的情况。

Peak 老师自加入 Facebook 后贡献了好多篇国内和湾区的工作生活比较的文章,对于好奇湾区这边(不代表美国其他地区)码农的工作生活状态的同学,值得一读。

🐎 员工之间可不可以讨论工资收入?

Peak 大神抛出了一个比较有意思和值得讨论的问题,员工之间可不可以讨论工资收入?Peak 大神还贴出了阿里和Facebook在这个问题上的态度对比并附上了自己的见解。不知你们对这个问题又有什么看法呢?

🐢 深入浅出 Swift Numerics

Swift 社区开发者 Xiaodi Wu 写了一系列文章,介绍了 Swift 中数字类型背后的设计思想(如 Int、Float 等)以及许多 Numeric Protocols 间的关系,建议有 Swift 开发经验的开发者们精读。

🐕 FastImageCache 原理

对于大多数 app 来说,图片存取/编解码都是绕不过去的话题,而这通常会占用相当一部分的计算/存储资源,值得大家反复研究。本文作者分析了 path 维护的 FastImageCache,从 mmap、decoding 和 byte alignment 几个角度来分析其对图片加载性能的优化。

🐎 iOS 12 JS 数组 Bug,可能带来互联网风波,附解决方案

iOS 12 发布了,但很多前端同学却发现 iOS 12 中 WebView 的一个大 BUG ,对数组进行 reverse 操作会导致 webview 将该数组的最后形态进行缓存,关闭页面退出页面都不会清掉,在 StackOverFlow 上也有人探讨,好在博主给了一个解决方案,快来看看吧。

🐎 Capturing Self with Swift 4.2

Swift 4.2 中 self 在 optional binding 中不再作为保留关键字。现在可以忘记 strongSelf 了,直接这样写吧:

guard let self = self else { return }

🐕 Adding Padding To A Stack View

UIStackView 是苹果在 iOS9 中引入的一个新的视图类。Stack View 可以高效的排列一行或者一列视图。在使用中,我们的子 View 很可能是需要动态调整高度的,这时候,我们既可以通过 Interface Builder,也可以通过代码在需要调整高度时候重新布局。但是,实际上,我们可以更简单高效的解决这个问题,就是使用 Readable Content Guides。

🐎 Async/await in Swift unit tests

Async/await 一直是 Swift 开发者期待的功能,但是由于在写单元测试的时候需要一些异步测试场景,所以 sundell 通过对 Futures & Promises 的进一步改造实现了一个 await 函数 的作为 Swift 还没支持 Async/await 的折中方案。整个实现思路还是很通俗易懂的。

🐕 What I Learned Making 5 ARKit Prototypes

5 个基于 ARKit2 的原型,用来提升购物体验、给报纸添加视频、观看绘画时增强关键人物,使涂鸦墙能够观看历史,给穿戴设备做屏幕延展。 AR 有非常大的潜力,这 5 个原型也许能激发你的灵感。

🐕 2018 Google 开发者大会现场纪要

Google 今年在上海的 GDD (Google Developer Days) 上周末圆满结束,算是一次做的非常成功的国际公司在国内搞的 Developer 相关的活动。如果你没有去现场参加的话,赶紧跟着去参加了的开发者们去看看 GDD 上的亮点吧。

🐕 What’s new in Swift 5.0

Swift 的下一个版本是5.0,首要目标就是让 ABI 稳定(存疑,现在还有好几个issue没动静),另外还有一些比较重要的特性,通过预设置好的playground可以体验这些特性

  • Raw strings:可以将字符串的转义操作变得更好用了
  • Handling future enum cases:switch 操作中,default 的处理通常意味着一些未能处理得很好的逻辑,现在可以在 default 前加上@unknown标记,让编译器在编译时产生一个 warning
  • Checking for integer multiples:增加了isMultiple(of:)函数,相当于之前的模除操作,譬如if rowNumber % 2 == 0rowNumber.isMultiple(of: 2)等价
  • Counting matching items in a sequence:数组的 count 函数也可以加上一些 filter 操作了
  • Transforming and unwrapping dictionary values with compactMapValues():对于 Dictionary 对象增加了compactMapValues()函数,将compactMap()mapValues()结合起来,变得更加方便

🐢 i​OS 12

NSHipster 出品,从 API 角度解析 iOS 12 中值得关注的改进。主要包括了以下几部分内容:为重要数据请求提高网络优先级、后台读取 NFC 标签、使用电话号码和电子邮件地址来匹配通讯录、在航空中更新位置、识别平放的设备、输入框中的自动填充新密码和短信验证码。十分推荐阅读。

🐕 操作系统是如何管理内存的

作者针对Operating Systems: Three Easy Pieces这本书中关于内存管理这块的做了一个小结,介绍了操作系统在处理内存管理中遇到的问题和演化方案,帮助读者增加内存管理方面的知识

  • 如果是单进程模型,很简单,一块内存空间是内核的,一块内存空间是进程的
  • 如果是多进程模型,考虑一下上下文切换问题,就需要有 base 和 bounds 来表示如何切换
  • 考虑多进程间使用内存的空间利用效率问题,出现了分段的解决方案
  • 为了解决分段方案带来的内存碎片问题,出现了分页的解决方案

工具

Xcode 10 小技巧: NSData 的 popover 里可以直接下载内容

Xcode 在 debug 的时候,能够直接查看 UIImageNSString 等类型数据,但是一直不支持 NSData 的查看。现在 Xcode 10 已经提供了这么一个功能,可以允许你通过预览小窗导出当前正在 debug 的 NSData 对象到本地,再进行查看。

代码

2018 中国 Swift 开发者大会源文件,包括 pdf 和源工程文件

@swift CON 2018 - 一场面向 Swift 开发者的知识盛宴,已于 09 月 15 日在北京顺利举行。由于各种原因未能去参加的各位同行,现如今可以通过这个开发者大会源文件了解到此次大会的主要内容。

Awesome README

好的 README 包括但不限于配图、屏幕截图、GIF、文本排版等。这是一个优秀 README 列表,以及一些帮助你写好 README 的工具。

设计

Designing and Developing for Siri Shortcuts

作者从代码和 UI/UX 设计角度展示了如何为现有的 app 加入 Siri Shortcuts 功能,包括增加 App Store 截屏、启动屏通知并且在设置界面里着重展示。

内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

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

说明

🚧 表示需翻墙,🌟 表示编辑推荐

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

老司机 iOS 周报 #36 | 2018-09-17

22 Dec 09:51
Compare
Choose a tag to compare

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

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

新闻

DCloud 发布又一个跨端开发框架 uni-app

随着微信、支付宝、百度陆续发布小程序,手机厂商联盟发布快应用,移动互联网快速向以 js 为核心的动态 App 发展。手机硬件性能日益提升,动态App体验也越来越好。一方面前端工程师迎来历史性的机遇,另一方面又发现开发如此多版本让开发者苦不堪言。

DCloud 大力投入资源为开发者打造动态 App 时代的最佳解决方案:uni-app。开发者使用vue技术,开发一次,可以同时生成 iOS、Android、微信小程序。接下来 uni-app 还将覆盖到 H5、其他厂商小程序及快应用。

提交 app 适配 iOS 12,watchOS 5, and tvOS 12

现在,可以使用 Xcode10 GM 版本构建您的应用,并对 iOS 12, watchOS 5, and tvOS 12的最新版本进行测试。从2019年3月开始,苹果会要求所有 iPhone 的应用更新都要使用 iOS12 SDK,以支持 iPhone XS Max;而手表的应用更新需要使用 watchOS 5 SDK 以支持 Apple Watch Series 4.

文章

🌟 🐎 老司机推荐书单

周报编辑们根据各自喜好推荐给程序员的书单。每一本被推荐的书都有它的独到之处,按照自己的兴趣挑几本去买来看看吧。

🐎 你的标签是什么?

每个人都会被打上标签,可能是正向的善于解决问题、Web 安全专家或者是擅长创新。也可能是负向的粗心、眼高手低。程序员不能一直埋头苦干,要适当建立起自己的标签,尤其对职场新人而言,好的标签会让你脱颖而出,更多的机会会垂青于你。

🐢 Swift for TensorFlow 官方教程

Swift for TensorFlow 是今年的 TensorFlow 峰会上,Chris 团队发布的一项新的技术,旨在为 Swift 提供内置的、first class 的机器学习的能力。Swift for TensorFlow 使用一系列很有趣的技术来实现了同时具备可用性和性能,有兴趣的同学可以进一步了解。同时,Swift for TensorFlow 也提供了 jupyter kernal 得支持,使得可以使用 notebook 来写 swift。

机器学习入门教程最经典就是识别鸢尾花,iris detection。本篇教程就是 Swift for TensorFlow 版本的 iris detection,对 Swift 做机器学习感兴趣的筒子不要错过。

🐢 镣铐之舞:美团安全工程师 Black Hat USA 演讲

这是一篇来自美团安全团队的分享。美团安全团队在今年的 Black Hat USA 上做了关于 App Store Malware Automatic Hunting System 的演讲分享。团队设计了一套可自动大规模获取应用样本的 Crawl 系统,通过使用基于树莓派的构建集群来实现沙盒自动分析系统,最终实现了自动化收集样本并对样本进行自动化安全分析的APT攻击捕获及分析系统。

这篇文章中很多概念对于不做安全或者对安全领域接触较少的同学来说比较难理解,但是不妨边搜索概念和知识点边读,可增加一些安全方面的基础概念知识。

🐕 How Apps Adapt to the Series 4 Apple Watch Screen Sizes

9 月 21 日新一代 Apple Watch Series 4 就要开始发货了,包含 40、44 毫米两个新屏幕尺寸,文章介绍了 watchOS App 如何适配新的设备:对于 watchOS 4 的 App, watchOS 5 默认兼容,只是还是以老的 38、44 毫米显示,以 Xcode 10 编译后,再辅以适当的调整,就能在不同屏幕尺寸上以实际大小显示。

🐕 JSPatch 的 dealloc 忧伤

有挖过 JSPatch 源码的同学应该都会留意到,它为了让 JS 能够更安全合理地 Hook dealloc,做了以下的处理:

  1. 调用 dealloc 时 self 不包装成 weakObject,而是包装成 assignObject 传给 JS,解决了 over-released crash 问题;
  2. 调用 ORIGdealloc 时因为 selectorName 改变,ARC 不认这是 dealloc 方法,所以需要欺骗 ARC,解决了对象正常释放的问题;

这样的处理可谓巧妙,但这位细心的读者却发现了另一个遗留问题 - JS 的 dealloc 方法和 OC 里面的 dealloc 方法会同时被调用。于是他针对这个问题进行了深挖,从 OC 对象的 dealloc 原理开始,一步步尝试,最终仅使用几行代码便解决了这个遗留问题。目前该问题已经反馈给 Bang,相信很快便会发版解决。值得一提的是,这是小编看到的第一篇从解决实际问题角度出发,来解读 Runtime 中 dealloc 原理的好文,好奇作者解决方案的同学快点开文章链接阅读吧。

🐕 iOS 中的多进程,下拉关闭系统的词典界面(Tweak 开发)

本文作者就下拉关闭系统的词典界面需求的实现过程进行了记录,从发现 _UIRemoteViewController 到找目标进程,再到 hook delegate 实现功能。整个过程都比较常规,但是 iOS 多进程这块确实是个冷门,资料也很少,iOS 开发一般是接触不到这块知识的,就算知道,也很难在实际开发中得到运用。不过当作扩展知识了解一下还是很有意思的,特别是文中提到的 Ole Begemann 写的那几篇 关于 Remote View Controllers 的博文

🐕 关于 iOS 私有 API 扫描

作者就网易游戏开源的 iOS private api checker 项目,一一阐述了如何构建私有 API 库、该项目又是如何识别 APP 中的私有 API、该方案存在哪些问题。并提出了行之有效的改进建议。
构建私有 API 库需要先构建 documented API 数据集,而新版 Xcode 的 API 文档不再使用 docSet 这种格式。这篇文章分享了 Xcode 9 在 Mac 上存储 documented API 的细节。

推荐人:balloonsys

🐕 Preparing Your App For iOS 12 Notifications

iOS 12 带来了一些新的与用户通知相关的功能,如新的授权选项、动态的快速操作与在通知内进行的用户交互。了解并适配这些新特性以助于改进应用通知在 iOS 12 中的体验。

推荐人:RocZhang9673

🐢 一次高效的依赖注入

本文分析了 iOS 目前依赖注入的几个开源库。 并选择 EXTConcreteProtocol 进行了详细的分析,给出了实际项目中遇到的问题与解决方案。

🐎 DRIVING CARS WITH ARKIT

这篇小短文会教你如何利用 ARKit 制作一款增强现实的奥迪 Q7 驾驶 app。利用平面检测模拟真实的驾驶效果,而不至于漂浮在半空中。

🐎 利用 ARkit,eBay 用头部运动控制 iPhone X 屏幕进行购物

电商巨头 eBay 日前揭晓了一项新技术 HeadGaze,利用了苹果 ARKit 平台和 iPhone X 的原深感前置摄像头(支持 Face ID)来支持残障人士通过头部运动来与 iPhone X 屏幕进行交互,并已经将底层技术开源托管至 GitHub。简而言之,HeadGaze 会通过虚拟触针紧跟用户的头部运动,把游标移向滚轴或其他交互式按钮。系统可检测游标停留在一个位置的时间,并在达到一定阀值时予以触发,实现激活点击操作。

🐕 利用柯里化去除重复代码

柯里化是把接受多个参数的函数,变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数,的函数式编程方式,本文通过一个实际案例尝试了使用柯里化来完成对代码的精简,对于理解柯里化是很好的案例。

🐢 JSPatch VS Aspects

JSPatch 应该已经无需过多介绍。Aspects 是 iOS 上的一个轻量级面向切面编程(AOP)的库。本文先后介绍了 JSPatch 和 Aspects 如何利用 forwardInvocation 将实现自己的功能,同时介绍了 iOS 上消息转发机制的 Hook 原理。而Hook 是有风险的,那么项目中同时接入这两个库会有什么样的问题呢?文章作者通过实践列出了可能遇到的一些问题。现实中,一个工程往往会接入更多的一些三方库,以及自己的一些功能也可能使用 Hook,所以,在对 Hook 的处理上要格外小心,关于如何正确使用这一点,作者也给出了自己的答案。

工具

pointfreeco/swift-html

swift-html 是一款 server side swift 的工具,能够帮助swift使用者在开发服务器后端的时候方便快捷的生成html,从而进行后端渲染页面,并且类型安全,可扩展性强。

代码

VideoFlint/Cabbage

Cabbage 是一个基于 AVFoundation 封装,易于使用和方便扩展的视频编辑框架,能够缩短开发者在短视频功能上的开发时间。

推荐人:vitoziv

专栏

🌟 WWDC18 内参

6 月的时候我们联合一些开发者翻译了一些 WWDC 18 的 session(老司机x知识小集xSwiftGG WWDC 18 专题目录),当时为了尽快呈现一些内容给大家,也只是挑选了一部分 session 讲解。于是剩下的几篇 session 的内容就留到了这个专栏上发布。

如果没有时间看 session 的同学强烈推荐购买支持一下作者们了。

音视频

提交镜像到 DockerHub
Docker 提供了一种和 git 类似的机制来管理我们对容器的修改,因此我们也可以利用这种机制来提交和分享镜像。这段视频里,我们就来分享 DockerHub 的用法。

构建 Vapor 开发环境 1
这段视频里,我们和大家分享如何让 Nginx 容器作为一个反向代理,把需要动态请求的部分,转发给 Vapor。

构建 Vapor 开发环境 2
Docker 提供了一个 link 的功能,我们可以使用它把之前创建的 Nginx 和 Vapor 容器连接起来,这样,就有一个最原始的 Vapor 开发环境了。

关于 iPhone Xs, iPhone Xs Max, iPhone Xr, 和 Apple Watch Series 4 的适配
苹果官方提供了新的视频,用于指导开发者如何适配新的手机和新的watch,Apple Watch Series 4 堪称超级传感器的集合,因此对于开发者来说需要适配的东西还是蛮多的,建议大家在9月份发布新版app之前都先用Xcode10-GM版过一下模拟器,看看有没有明显的问题。

Building Apps for iPhone XS, iPhone XS Max, and iPhone XR
Designing for Apple Watch Series 4
Developing Complications for Apple Watch Series 4
P.S. 我们团队发现如果用 Xcode10-GM 打包 IPA,里面的 Assets.car 文件,包含了重复的 png 图片信息,而之前 Xcode9.4.1 却没有此问题。Xcode10-GM 版的这个 bug,会导致 iOS9.0 ~ iOS9.2 的机子在使用 Assets.xcassets 里面的图片后,发生随机 Crash。
解决方法有二:要不不使用 Assets.xcassets 而改用 Bundle 取图片(对旧项目改动较大),要不就将 APP 支持的最低版本升级到 iOS9.2 以上。目前已将此 bug 报告给苹果,希望在 Xcdoe 10 正式版中得到改善。

内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

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

说明

🚧 表示需翻墙,🌟 表示编辑推荐

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mi...

Read more

老司机 iOS 周报 #35 | 2018-09-10

22 Dec 09:51
Compare
Choose a tag to compare

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

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

新闻

Swift Server 工作组

Swift Server 工作组现在正式宣布进入下一个阶段,工作组接下来的目标是建立一套健康强壮的生态系统,让开发者可以更容易找到高质量的库和工具。其实早在 2016 年这个工作组就已经成立了,当时的目标是创建一套通用的底层 API,供上层的 Swift 服务端框架使用,这就是 Swift-NIO,那么接下来实际要做些什么呢?

类似于 Swift 的核心开发团队,这个工作组会负责提供总体的技术方向和制定标准,围绕 Swift Server 去构建一系列的服务端生态,工作组的成员包括了来自苹果,IBM 和 Vapor 的工程师,他们也会积极参与开发,并且希望社区也可以参与到这个过程中,目前工作组已经在论坛里列了一份草稿去描述未来的工作方向,包括了工具链,Database Driver,分布式系统架构等等。

BTW,Swift 官网把 Server Work Group 放到了 Focus Areas 那一栏里,表现出了对于服务端重视。(同一栏里的还有 ABI Stability)

10 月 3 号起所有 App 必须在 App Store Connect 里配置隐私政策链接

10 月 3 日起,所有新的应用和更新的应用程序都必须在 App Store Connect 里配置隐私政策链接。隐私政策必须清晰且直白的告知用户,他们的应用会收集什么数据,以及根据他们的隐私保护协议,这些被收集好的数据会被如何利用,幷确认是否有第三方机构有权接触到这些数据。

文章

🐕 Early returning functions in Swift

Early Return, 顾名思义,就是早点儿 return 的意思。作者指出当我们做一些分支逻辑的时候,结合 guard 来在不满足条件的时候直接 return 掉 function,可以使得我们的代码更加清晰,以及更易于 debug。不过我个人认为对于类似的逻辑,更合理的逻辑应该是用 do{} while(false), 在不满足条件的时候直接 break 这样确保函数有一个单一的 exit point,更有可维护性。除了 Early Return,文章还推荐使用函数来封装复杂的条件判断,使代码更具可读性。

总体来说,文章深度一般,但是探讨的 case 还是比较有趣的,可以看看。

🐎 TODO FIXME And Compiler Directives

Swift 4.2 中添加了两个新的编译器命令,#warning("message")#error("message"),可以让你的代码在编译的时候,产生警告及错误。

🐎 iOS App 连接外设的几种方式

如果开发的应用功能涉及到和硬件交互,那么知道 iOS app 连接外设有几种方式就很重要了。

  • 无线的连接是日常里非常常见的蓝牙、WIFi。
  • 有线分成两派:
    • MFI:苹果认证的外设。亲儿子 CarPlay 是特供的 NCM。其他外设则是基于 External Accessory Protocol,通过引入 ExternalAccessory.framework 进行通讯。但是 MFI 的申请门槛非常高。
    • 没什么卵用的 USB 热点共享。

spirit-jsb 推荐

🐎 iOS 如何精确还原 UI 稿多行文字间距

大家开发中一定遇到过文字间距如何精确还原的问题,不论是 PhotoShop + 标注工具还是 Sketch 。文章介绍了通过设置 minimumLineHeight maximumLineHeight ,然后利用 baselineOffset 修正完美还原多行文本间距。

🐎 Why you’re not supposed to call description

大家在使用 Swift 的时候,一定会经常把一些任意的字符串、整型或者对象作为调试信息的一部分来输出到控制台。可能你注意过 CustomStringConvertible 和 CustomDebugStringConvertible 这两个协议,还有 String(describing:) 但是却不太清楚其中有什么区别。本文作者讲解了这几个类型分别做些什么,以及为什么使用时调用 String(describing:) 和 String(reflecting:) 是最佳的选择。

🐎 Practical Dynamic Type

在 iOS 11 之前,如果想根据 iOS 系统字体大小来动态调整字体尺寸,只能观察 UIContentSizeCategoryDidChange,并在变动发生时手动渲染视图。但 iOS 11 推出了一些改进,方便 app 针对视弱用户开发辅助功能,作者在这篇文章里展示了如何实际利用 iOS 11 对 Dynamic Type 的提升,对视弱用户提供完整的辅助功能,同时还能支持之前的 iOS 版本。

🐎 iOS App 后台任务的坑

Peak 最近一直在调研和分享 Background Crash 相关的知识,比如 32 期周报中推荐的『iOS App 后台 Crash 调查』一文。而这篇文章则是他最近这段时间调研结果的总结。文中提到,涉及 Background Task 的 Crash 主要有以下三种类型:

  • 0xdead10cc - 为了保证 Extension 和 Host App 对 DB 操作的数据库完整性,系统强杀应用;
  • 0xbada5e47 - 发起过多的 Background Task,或者 Background Task 在超时之后会调用 expiry handler 超过几秒钟,都会被系统强杀;
  • 0x8badf00d - 主线程卡死,被系统的 WatchDog 强杀;

另外此类 Crash 第三方的收集框架捕获不到,所以需要借助苹果自带的 Crash 日志才能排查。

🐎 打造高可拓展的 iOS KeyValueStore

本文循序渐进地讲解了如何打造一个高可拓展的 iOS KeyValueStore。从最开始一个 Key,一个 Data 的表,逐步讲解如何支持存储元数据,分组,索引。行文流畅,没有废话,值得一看。

🐢 MacOS 的安全和隐私指南

本文翻译自 drduh 的一篇文章, macOS Security and Privacy Guide。如今用户电脑的安全及隐私问题越来越被重视起来,无论是公司还是个人。本文对于想要提高个人 Mac 的安全性以及隐私性的人比较有帮助。文章从 Web、 VPN、防火墙、系统服务等很多点详细讨论了 MacOS 的安全和隐私问题,读完这篇文章,相信对于这方面的很多疑问都可以迎刃而解。

🐎 Swift Knowledge Base updates for Swift 4.2

Swift 4.2 正式版再过几天就要发布了,这一次更新虽然只跨了一个小版本,但还是带来了许多实用的新特性,还没来得及了解的同学推荐看一下这篇文章。

🐎 Hacking Hit Tests

来自 Soroush Khanlou 的一篇文章。文章介绍了 HitTest 这个来自 UIKit 的快被大家遗忘了的方法。

在一些特定情况下,开发者可能会需要 Override HitTest 方法来达到一些特定的目的。作者就遇到了类似的情况。而 Override HitTest 在很多时候能给开发带来更多的可能。相信大家若是对 HitTest 有更深入的了解,也能对 iOS 开发有更深的理解。

🐢 CLI: improved

作为开发人员,一般都离不开命令行工具,本文的作者分享了自己在命令行工具上的一些积累和经验,帮助大家更好地提升工作效率

  • cat的升级工具
    1. 你可以使用 ccat 来对cat的结果进行颜色分类
    2. 你可以使用 bat 来对cat的结果进行二次检索和分页
  • ping的升级工具
    1. 你可以使用 prettyping,这个工具对ping的返回结果做了一层GUI的封装
  • ctrl+r(回溯过往输入的命令)的升级工具
    1. 你可以使用 fzf 来更好地进行回溯匹配
  • top的升级工具
    1. 你可以使用 htop 获得更多的交互命令来显示系统硬件信息
  • find的升级工具
    1. 你可以使用 Alfred,这个 app 能够帮助你更好地检索文件
    2. 你可以使用 fd 来获得更好的文件检索功能
  • du的升级工具
    1. 你可以使用 ncdu,这个工具可以跟 iTerm2 更好地结合使用
    2. 你可以使用 nnn,这是一个磁盘空间管理的高性能工具
  • man的升级工具
    1. 你可以使用 tldr 更好地阅读帮助文档
  • grep的升级工具
    1. 有些时候,grep的对于复杂的过滤规则力不从心,这个时候可以考虑用ack || ag来代替
  • grep et al的升级工具
    1. 你可以使用 jq 来更好地处理 json 转换的问题
  • 更多更好的工具等待挖掘中
    1. ponysay替代cowsay
    2. csvkit替代awk et al
    3. noti替代display notification
    4. entr替代watch

设计

Lessons Learned From the RWDevCon 2018 Design Lab

在今年 RWDevCon 2018 大会的 Design Lab 中,两个资深 UI/UX 设计师解答了 Ray Wenderlich 读者有关 app 设计的问题,其中包含了很多常见解决方案,具体分为以下四个方面:格式塔理论、原生组件及行为、竞品研究和产品文案。阅读这篇文章可以让你在创建移动应用时避免犯同样的错误。

Mac 高效开发指南

bestswifter 同学一直非常的重视工作效率,本书从系统配置、Mac 工作流、编辑器之神:Vim、Git 从入门到进阶、终极武器 Zsh 等方面去打造一个高效的工作流,致力于提高 Mac 工作效率的实用手册。不管你是入门新人,还是撸码老手,都能从书中学习到很多你平时不会注意的,提升工作效率的点。效率上去了,你才能有更多的时间,去对自我进行提升。

音视频

泊学技术视频

构建自己的Docker镜像
Docker用类似git的方式管理了我们对容器的修改,这也就意味着,我们可以“提交”这些修改,查看修改的历史记录,以及制作新的镜像。

使用Dockerfile自动化镜像构建
如何自动化镜像的定制过程呢?你可以把每一步修改的动作写在Dockerfile里,然后执行docker build就好了。

通过Docker执行任意版本的Swift
这段视频里,我们基于Swift官方提供的二进制程序,制作一个可以执行任意版本Swift的镜像,有了它,我们就能更方便、安全的实验各种Swift新特性了。
[视频链接]

内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

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

说明

🚧 表示需翻墙,🌟 表示编辑推荐

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

老司机 iOS 周报 #34 | 2018-09-03

22 Dec 09:51
Compare
Choose a tag to compare

ios-weekly
为了提高大家分享高质量的文章给我们的积极性,我们做出了一点小改变。如果文章是读者推荐给我们的,我们会在文章的点评后面声明推荐人,可以带一条推荐人的链接(博客,微博都可以)。具体了解可以看这里:对提高读者反馈技术文章热情的一点尝试。欢迎大家到 Issues 里多多推荐有价值的信息、文章、工具等可以提给我们。

新闻

iPhone 8 主板更换计划

Apple 已经确定,极少数 iPhone 8 设备的主板存在制造缺陷。受影响的设备可能会出现意外重新启动、屏幕死机或无法开机。Apple 将会免费维修符合条件的设备。受影响的设备是在 2017 年 9 月至 2018 年 3 月期间售出,销售范围覆盖澳大利亚、中国内地、香港特别行政区、印度、日本、澳门特别行政区、新西兰和美国。可以去本篇链接进行序列号查询,从而判断你的 iPhone 8 是否在更换计划范围内。

文章

🐕 [译] 在 Codable 中实践类型推断

类型推断是 Swift 类型安全的一个强大特性。本文介绍了利用类型推断来优化 Codable API。看完文章后对类型推断的运用场景会有更好的理解。

🐢 手把手教你查看和分析 iOS 的 crash 崩溃异常

我们开发的 App 不可避免会出现闪退,可以通过集成一些第三方的闪退收集系统或 iTunesConnect 自身来收集闪退日志。有了闪退日志之后,并不是所有闪退都能快速的定位解决,特别是没有明确上下文或者没有一个函数或者方法能够被直接定位到源代码的场景,本文介绍面对这类闪退的几种可行办法,特别是通过寄存器及汇编代码来定位问题。

🐢 🚧 🌟 Why Monads?

了解过函数式编程的同学多多少少应该都听说过 Monad 这个异常鬼畜概念,似乎从来没有一篇文章能用人话把这个概念说明白,比如学理论的同学会说 Monad 是自函子范畴上的幺半群,Haskell 程序员同学会说如果我们能为一个 type 定义 bind 和 return,那这个 type 就是一个 Monad,而 Swift 程序员一般则认为能被 flatMap 的类就是一个 Monad。那叫一个热闹。其实都不能算错,毕竟每个语言的表现能力不同。

本篇文章尝试从 monoid 开始,使用 Swift 的语言来更严谨的介绍什么是 Monad 以及我们为什么会需要他,写得非常棒。既最大限度的还原了学术层面的定义,但又切实的使用 Swift 来实现并结合了实际的例子,是不可多得的好文,适合对函数式编程有兴趣的同学研究阅读。

文章还有一大亮点就是,一针见血指出了函数式编程普及的最大难点:如果使用 inductive 的方式,从简单的实践出发来学习函数式编程,会发现其实有很多替代方案,很容易质疑 FP 的意义,而另一方面,deductive 的方式,也就是从理论出发落地到实践,却又面临比较陡峭的理论学习曲线。作者深信学好 FP,live with them, 对一个人的编程思路和方法会有极大的增益,所以在尝试中和理论和实践的方式来做 Monad 的介绍,从这篇文章上看他也的确做到了,真心为 Swift 能有这样的开发者高兴。

从本文的专业程度、对理论的还原程度以及对 Swift 语言特性的挖掘这些方面来看,基本可以标志着 Swift 进入主流函数式编程语言的阵营,未来和 Scala,Haskell,OCaml 等竞品同台飙戏的日子指日可待。最后就摘选一句作者原文中的句子作为结尾:I hope I was able to shed some light on why, once upon a time, someone even considered applying mathematical concepts like monads to programming, and on why these structure are useful in solving practical programming problems: now it’s up to the reader to consider taking this leap.

🐢 🌟 Google Swift Style Guide 浓缩版

谷歌版的 Swift Style Guide 是现在公开的 guide 里实用价值最高的一篇。每一个使用 Swift 的开发者看完应该都会有所收获。于此同时我也翻译了官方 Swift API 设计规范,对规范感兴趣的朋友也可以一起阅读。

🐕 Improving Your Build Time in Xcode 10

今年 WWDC 上 Session 408 的主题是 Xcode 中如何提升编译速度,视频链接在此。强烈建议在实际项目中忍受缓慢的编译速度之苦的同学们花费一点时间看一下。

而这篇文章总结了 Session 408 ,对于没有时间好好过一遍视频的同学来说,是个不错的学习资料。

🐢 Dynamic Features in Swift

在大家印象中,Swift 一直是以静态语言、类型安全、编译器检查等特点而为人所熟知的,事实上也正是因为这些 OC 无法实现的优点,苹果才会愿意在 OC 之外另起一门新的语言并大力推广。但是这不代表 Swift 只能是静态的,只要有简洁的语法和尽可能安全的调用方式,Swift 也能拥有一些动态特性。作为 iOS 工程师们的老朋友,Raywenderlich 的这篇文章分别介绍了 Swift 中的一些动态特性,包括 Mirror、KeyPath 和 KVO,甚至还有 Swift 4.2 中的新特性 @dynamicMemberLookup,使开发者们在享受 Swift 类型安全的同时,能有更多的选择去完成一些更灵活的需求。

🐢 在 ARKit 中创建一个时空门 App

本文译自 Ray Wenderlich《ARKit by Tutorials》一书免费发布的 7、8、9 三个章节,向你展示了如何利用 ARKit 构建一个沉浸式的时空门 app。时空门 app 是指在现实世界的地面上放置一个通往另一个房间的虚拟门,可以走进走出这个房间,探索其中的内容。

本文由译者史前图腾推荐。

🐎 iOS 的高性能、高实时性 key-value 持久化组件

FastKV 是本文作者参考微信团队的 MMKV 实现的一个 key-value 组件。底层同样使用的是 mmap,上层数据序列化为了不依赖 protobuf 自己实现了一套。mmap 纯读写性能的确要比 NSUserDefaults 高,但是 mmap 也有它的局限性,它需要整数倍的物理页大小(page_size),并且也需要连续的内存区域,同时还需要自己实现映射关系、维护数据结构和异常处理。这相当于提高性能的额外成本,如同作者本人在文末说的 “如果对实时性要求不高的项目,建议还是使用官方的 NSUserDefaults”。有兴趣的同学可以跟作者一起维护这个组件,或者自己动手学习和实现一个类似的 key-vale 组件。

🐢 Life of a Pixel 2018

Steve Kobes 做的 Life of pixels 2018,讲了如何从一个 HTML 文件到屏幕上显示。前端或者对排版有兴趣的同学推荐看一下。从 Dom 到 Display,这中间是一个很复杂的过程。解析、排版、渲染,每一个环节下的结构设计、与 GPU 的协同工作等分享中都有提到。这可以让我们对 Chromium 的页面展示有一个大体的了解,有视屏不用读文字,看起来也会比较轻松一些。分享用到的 PPT 的连接

🐎 When You Refactor, Are You Using Small Steps ?

文中提出重构采取较小步骤原则( Take smaller steps ),作者贴出了他将占位符文本的从 ViewController 转移到 ViewModel 的例子来讲述整个最小步骤重构过程。并提出一个非常好结论:真正的重构是逐步进行的,并且每个步骤都通过单元测试进行验证。相信文本对你在重构的认识上会有所帮助。

🐎 闲聊 Flutter

跨平台一直是大家前赴后继不断追求的目标,原本 web 作为跨平台的解决方案很完美,但历史代码的兼容、CSS 过于复杂、DOM 接口粒度大等问题,造成 Web 技术下的跨平台方案有较明显的性能问题。而 Flutter 基于一个精简版的 web 引擎,抛弃兼容性,只保留主要功能,性能较前者快了不少。虽然 Flutter 还有包大小、缺乏动态性等问题,但一个完整的比 webkit 简单的多的引擎,源码很值得挖掘学习。

🐕 Enum iterations in Swift 4.2

Swift 4.2 为我们带来了全新 CaseIterable 协议,让我们可以快速地取到一个 Enum 中所有的 case。比 Codable 更方便的是,你可以直接扩展已存在的 Enum。文中的 Enum maps 一节为我们展现了很有趣的 CaseIterable 的用法,很快你也会爱上这个新协议的。

🐢 dyld_link & loaddyld_startup 解析

这两篇文章系统、全面地从源码级别探索 dyld 装载、链接、自举等工程。文章针对原本过程进行过滤,抓大放小,简单、明了地把原理阐述出来,并把简化后的伪代码贴出,可读性非常高。

本篇收录由该文作者 @mrriddler 自荐。

🐕 TCP 没那么难吧?

本文详细讲述了TCP 的握手和挥手流程,帮助大家更好地理解并掌握可靠性高的网络协议设计流程

  1. TCP 建立连接本身其实需要4次过程(客户端请求,服务器确认,服务器请求,客户端确认),在合并了第2、3步以后,就变成了我们现在熟知的3步走流程
  2. TCP 状态机将能帮助我们更好地了解,在建立连接过程中的各种异常状态流转过程,通过状态机模型能够很直观地表达复杂流程的各种细节
  3. TCP 终止连接显然也是需要4次流程(客户端终止,服务器确认,服务器终止,服务器确认),然而在这个流程下,第2、3步并不能合并

最后推荐两本书《Wireshark网络分析就这么简单》《Wireshark网络分析的艺术》。书的作者借助 Wireshark 这个“神器”,深入开发中的各种疑难杂症,剥茧抽丝,娓娓道来,是了解计算机网络编程非常好的参考书。

🐎 NSDataAsset

我们经常使用 Asset 来保存 @2x@3x 的图片资源,这样可以利用 app thinning,在不同的设备上之后打包进对应的资源文件。从 iOS 9 开始,Asset 不仅支持图片资源,也支持 data 格式。本文演示了如何使用 NSDataAsset。

🐎 Xcode 10 Storyboard Changes

Xcode 10 快要发布正式版本了,所以有必要了解一下新的改动。这篇文章没有列举所有的改动,主要列举了 Interface Builder 界面的一些改动,具体如下:

  • 浮动的 Library, 控件和资源的窗口不再依附在右下角,而是变成了一个浮动的窗口。
  • 多功能的 Embed in 按钮,主要是替代原来的 stackview 的按钮,同时也新增了 Embed ViewControllers 的功能

当然,Xcode 10 还有很多其他的更新的改动,感兴趣的可以看一下 What’s New in Xcode

🐕 Objective-C: 写一份可测试的代码

本文介绍了如何编写一份可测试的代码。主要阐述了依赖注入,最小知识原则在编写可测试性代码中扮演的角色,如何运用好它们来写出可读性和可测试性并存的代码。

🐕 UI 自动化测试:通过 Appium 加速你的客户端 UI 测试

这篇文章介绍了如何使用 Appium 编写一个完整的 UI 测试用例,Appium 是一个开源的 UI 测试框架,通过给外部暴露出一套完整的 REST API 去完成测试操作,支持 iOS 和 Android,使用 Appium 编写测试时有多种语言可以选择,例如 Ruby,Python 等等。

工具

Mermaid,一个生成结构图的工具

文章介绍了一个名叫 Mermaid 的软件,可以直接通过一定的语法来书写流程图的架构,简直是为程序员量身打造,目前支持流程图、序列图和甘特图(想起了手画流程图的那些蛋疼的日子)。不仅如此,Mermaid 还支持直接和 Gitbook 集成,而且因为本身 Mermaid 是以 SVG 文件输出的,所以和其他的 Web 场景也可以很好地兼容。

软件是好软件,不过这篇介绍文章有点过于简单,建议大家直接去官方地址查看学习。

代码

基于 ARKit 的 iOS 无限屏实现,还原锤子发布会效果

作者通过在越狱环境下修改 SpringBoard.app,并通过 ARKit 的惯导算法来获取手机的相对位移,然后渲染一个远大于手机屏幕的虚拟空间,从而实现了 iOS 桌面的无限屏模式,使得在视口发生位移时,产生在无限屏上游历的效果。即使没有越狱环境也没有关系,本文也适用于修改自己的 app,比如实现一个可以左右、上下翻阅的地图、PDF 阅读器等。

《iOS 面试之道》电子版

纸质书上线一个多月以来颇受欢迎,现在电子版正式开始发售,目前五折。喜爱电子版的朋友现在是入手最佳时机。

内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

@没故事的卓同学@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal@aaaron7@方秋枋kyotom510230anotheren水水looping@JasonYuh,[@老老老老老老老驴](https://...

Read more

老司机 iOS 周报 #33 | 2018-08-27

22 Dec 09:50
Compare
Choose a tag to compare

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

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

文章

🐎 Easier Scrolling With Layout Guides

iOS 11 为 UIScrollview 增加了新的 layout guide:frameLayoutGuidecontentLayoutGuide,目的在于让 scroll view 的 constraints 设置变得更加直观,这篇文章会为你实际展示如何使用它们。

🐕 Model controllers in Swift

如何封装 Model 相关的逻辑是保持代码高可维护性的关键之一,通常来说,设计优良的类型定义通常奠定了一个好架构的基础。作者介绍了如何通过创建一个 ModelController 类,将 Model 层相关逻辑封装其中,只暴露需要外界了解的一部分接口,相信会给大家一些启发。

🐕 Atomic Properties in Swift

Swift 语言没有定义原子属性的功能,但 atomic 内部也是通过自旋锁保证的 set、get 方法的原子性,Swift 中我们也能使用锁来实现属性的原子性,除了锁,使用队列也能达到同样的效果。

🐎 Swift Property Observers

文章详细介绍了 Swift 中的属性观察器,并通过两个例子来深入浅出地说明属性观察器适用的场景。如果你刚入门 Swift ,值得一读。

🐢 Hook 所有 +load 方法(包括 Category)Hook static initializers

在做 App 启动时间的深度性能优化时,我们会对 pre-main 阶段的耗时进行统计(如需更系统了解这部分,可参考 29 期周报中推荐的『App 启动时间优化』一文),其中统计所有 +load 方法以及 static initializers 的耗时就是很重要的一部分。everettjf 的这两篇文章分别阐述了如何进行这类耗时的统计。

🐕 Examples of NSPredicate usage

NSPredicate (谓词)类是用来定义逻辑条件约束的获取或内存中的过滤搜索。可以使用谓词来表示逻辑条件,用于描述对象持久性存储在内存中的对象过滤。作者详细的列出了 NSPredicate 的各种使用示例。是 NSPredicate 使用者的不错参考文章。

🚧 🐎The difference between Flux and Redux

使用 React 或者 ReactNative 的朋友们在开发中都接触过组件与组件之间的状态管理与数据传递。传统的通过 props 层层传递,在面对组件复杂互相嵌套等情况下就显得开发困难不利于维护。因此产生了状态管理的工具 Flux 后续又发展出来了 Redux。这篇文章就详细的为我们介绍了 Flux 与 Redux 的一些设计上的区别。

🐢 Let's Talk Architecture

iOS 的应用架构实际上是一个老生常谈的问题。相比于各种打太极的文章,本文从 iOS 应用架构的前世今生,详细讲解了 MVC、MVVM、MVP 在 iOS 上的使用以及他们各自的优缺点。并将 MVC 划分为过去,将 MVVM 和 MVP 划分为现在,而至于未来,作者也给出了自己的答案,函数式编程。当然,笔者认为,我们在真正开发中,具体要选择哪种架构最好还是要切合团队项目的实际情况。就像作者在文章末尾也有提到,这些框架都可以帮助我们实现相同的目标,也就是编写优秀的软件。

🐢 [译]构建流畅的交互界面

今年 iOS 花了很大的功夫在优化系统基础体验上,甚至在 WWDC 里专门开一个 session 来讲如何构建流畅的人机交互。这篇文章的作者在看了这个 session 之后有感而发写了这篇文章,在介绍和总结 session 内容的同时,还动手通过代码实现了那些 Design Tips,里面特定交互的最佳实现和动画实现的思路都非常棒,推荐一看。

-- #31 构建流畅的人机交互

31 期里提到的文章构建流畅的人机交互通过掘金计划进行了翻译,如果是因为英文而错过了这篇文章的朋友,这次可以毫无负担地进行阅读了。

工具

统计 CocoaPod 组件大小的工具集

这是一款用来计算把 CocoaPod 库打成二进制后的大小的工具。实现思路很简单,就是搞两个一样的壳工程,把其中一个通过 pod 安装好类库,再 archive 两个工程,最后计算差值。这种测量方式通常会在持续集成平台上用来自动计算每次发版包大小的变化。从文档描述中得知,实际安装大小会比使用该工具计算的大小多 3% 左右。试用下来的体验还是不错的,但也有很大的改进空间。还没有开始做安装包或 SDK 大小变化统计的同学可以开始搞起来了。

代码

Schedule

Schedule 是一个轻量级的定时任务框架,提供了许多友好语法供开发者执行定时任务。 我们可以从下面这行代码一窥这个库的用法。

Schedule.every(.monday, .tuesday).at("9:00:00").do { }

DifferenceKit

继上次推荐的 DeepDiff 之后,又一个计算两个列表的 Diff 差异的库,目前 iOS 大部分 Diff 库的灵感都来自于 IGListKit,因为 IGListKit 采用了一个 O(n) 的算法来寻找两个列表的不同,相比较于 DeepDiff 的动态规划寻找最短路径算法,有明显的性能提升。DifferenceKit 最值得推荐的一点就是 API 相比较而言更为丰富。但是,相比较于使用,我更推荐大家看一下源码或者学习一下这些 Diff 库的实现算法 Paul Heckel's Diff Algorithm

Validated

Validated 是一个同时处理多重错误的库,用于简化需要多次验证数据正确性的代码。

Validated 框架融合了之前一些已有的概念,例如 Result

我们也可以从以下几个样例代码中一探究竟:

let user = try validateUser(id: 1, email: "[email protected]", name: "")
// throws Invalid.error("name can't be blank")

func validate(id: Int) -> Validated<Int, String> {
  return id > 0
    ? .valid(id)
    : .error("id must be greater than zero")
}

let validInputs = zip(
  validate(id: 1),
  validate(email: "[email protected]"),
  validate(name: "Blob")
)
// Validated<(Int, String, String), String>

zip(with: User.init)(
  validate(id: -1),
  validate(email: "blobpointfree.co"),
  validate(name: "")
)
// invalid([
//   "id must be greater than zero",
//   "email must be valid",
//   "name can't be blank"
// ])

内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

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

说明

🚧 表示需翻墙,🌟 表示编辑推荐

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

老司机 iOS 周报 #32 | 2018-08-20

22 Dec 09:50
Compare
Choose a tag to compare

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

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

新闻

最亲民的 HomeKit:用 Siri 控制米家智能硬件

一直以来,HomeKit 配件因为过于昂贵的原因,阻碍着它进入寻常百姓家。另一方面,国内小米的生态布局已经初见规模:开关、插座、灯等品种繁多。但是,Apple 的生态中,使用 Siri 来控制家中的硬件无疑是最方便的。而通过米家应用来控制硬件总有点隔靴搔痒的感觉。为此,先行者们曾考虑使用树莓派来曲线救国,不过操作复杂,对一般用户还门槛颇高。这一次,米家原生的 HomeKit 控制器来了,使用原汁原味的家庭和 Siri。如果你正准备做智能化改造,不妨试一试。

文章

🌟 🐎 为什么大公司还在采用过时的技术?

本文描述了一个很现实的问题,就是部分人费劲心力加入的大公司,实际上却跟自己想的不一样。其实很多大公司都是从小公司发展来的,不可避免会遗留一些古董,甚至不良风气。从公司盈利的角度看,成本是首先需要考虑的,如果重构后带来的收益大于继续修补维护,那么大部分老板会愿意进行改良。但假如没有过硬的技术能力,大公司是不太可能会让你拿新技术试水的。并不是大公司技术不行,而是他们懂得风险控制,想寻找最合适的人来做而已。正如作者在文中所说,“工作中,不断的提升自己,少一些抱怨吧”。所以我们更应该努力成为公司老板们努力寻找的 —— 我们需要的就是你这样的 —— 人。

🐕 Let it Rip

作者记录了一次用 LLDB 的 regular expression breakpoints(正则表达式断点) 和 breakpoint commands 结合起来有效地追踪一个看起来毫无头绪的问题根源的过程。下一次当你面对貌似束手无策的 warning / error 时,考虑设置一个广泛的、基于正则表达式的断点和一系列命令来帮助你吧。

🐕 谈谈 RxSwift 和状态管理

现在大前端的概念非常深入人心,在大前端中一个体系是几乎无法被忽略的:React 体系。React 体系深入地影响了前端、客户端近几年的技术发展。从基于 JS 的 React,Vue,Rax 到基于客户端语言的 RxSwift,RxJava,虽然实现细节各有各的不同,但背后反映的思想都出奇的一致:通过利用函数式和响应式编程的思想,总结出了一套新的模式来更好的实现业务需求。

这篇文章探讨了在前端中已经取得广泛应用的两个模式,基于 React 的 Redux 和基于 Vue 的 VUEX,在 Swift 中的落地实现,分析了其中的优劣,并且在最后提出了一种相对简化的模式。文章写得循序渐进而且介绍相对全面,即便是之前并不熟悉这些概念的同学也能很容易看懂,推荐。

🐎 把 Objective-C 类迁移到 Swift

30 期周报中 Migrating an Objective-C class to Swift 的续篇,在重构的同时保持原有功能并且继续添砖加瓦,除了 extension 之外最显而易见的方法就是继承,逐渐把 Objective-C 类的抽象挪到 Swift 类里就可以平滑地完成迁移,其中的优劣势可以看 Ole 给你细细分析。

🐕 Scalable bulleted lists with UILabel or UITextView

一个使用 UILabel 实现段落样式的范例,主要是通过一个 NSParagraphStyle 的 headIndent 属性来完成整体段落缩进(首行除外)。

🐎 iOS App 后台 Crash 调查

Peak 最近在调查一个诡异的 crash,该问题无法通过 App 内部的 crash 捕获框架获取日志,但可以通过 Xcode 查看系统自带的崩溃日志看到。经过排查,最终将问题锁定在了系统为了保证本地共享目录下数据库的同步,从而强杀 App 生成 code 为 0xdead10cc 的闪退日志。

在这次问题排查后,Peak 还总结了现在 iOS 后台任务运行的一些场景以及一些无法通过 App 内部 crash 收集工具的 crash 类型,对于我们平常排查闪退问题,有一定参考意义。

🐎 Creating a Bottom Sheet

这篇文章比较详细的描述了如何实现一个类似于系统地图首页的底部带有一个列表的界面。虽然说这并不是一个很难的问题,但是作者提供的思路包括他的代码实现,都给人以一种十分精简的感觉。特别是通过组合的控制器,而不是在一个控制器上面操作不同的视图方式也给我带来不少新的思考。

🐕 端内外融合拉新,用户增长 -- 相关技术方案选型分析

H5 网页端有着便于传播,方便在各类 APP 与浏览器容器中进行推广,而 APP 客户端用来承接,有着更好的体验与长久用户存留的收益与价值。如果能将用户从 H5 -> APP 的流程进行打磨,将体验进行优化,就能极大程度的提高拉新的转化率,而这其中的关键就是打破 H5 -> APP 之间传递数据,进行无缝衔接的方式。

众所周知,从 H5 -> APP 传递数据广泛使用 deeplink ,也就是通过 Scheme/UniversalLink 直接唤起 APP 进行无缝衔接。那么假如你在浏览 H5 网页的时候未安装 APP,那么如何无缝的实现 APP 刚一安装就能自动拿到H5数据,从而进行体验上的无缝衔接呢?本文会带给你答案。

🐎 The 5 Whys for Product Managers

“5 个为什么”是借鉴自丰田产品系统的分析技术,用于寻找问题的根本原因。这个模型鼓励连续回答几个简单的“为什么”,然后会发现每个看似是技术上的问题,最后归根结底都是人的问题。但是“5 个为什么”并不是为了归责,而是为了找出异常出现的根本原因,以便让团队不断进步,让类似的问题不再发生。

🐢 How to Build Swift Compiler-Based Tool? The Step-by-Step Guide

Polidea 开源了一个名为 Sirius 的代码混淆工具,他们同时也根据在实现 Sirius 过程中遇到的问题和相关经验,写了一篇关于如何使用 Swift Compiler-Based Tool 的文章。

文章分两部分介绍他们在实现 Swift 代码混淆工具过程中的经验:

  1. 如何拓展 Swift 编译器,让其可在编译和集成阶段调用自己写的工具。
  2. 如何使用编译器内部方法,从 LLVM,Clang 和 Swift 本身提供的功能来增强写的工具。

文章比较长,最好大家能亲自动手实践一次,才能更好的理解文章。

🐕 Sourcery - Swift元编程实践,告别样板代码

Swift Codable 优化了解析 JSON 的体验。但是如果有一个属性的解析名称需要自定义,或者跳过某个属性的 JSON 映射,都需要自己手写全部的 Codingkey。本文介绍了利用 Sourcery 的元编程能力来优化一些需要手写 Codingkey 的场景。

🐎 Trimming long argument lists in Swift

当我们想为一个已有的方法增加新功能,但又不想重新写一个类似方法的时候,通常会往参数列表里增加新的参数。虽然每一次修改看起来都没什么问题,但是久而久之参数列表会变得冗长,对其他维护者来说也越来越难以理解。作者列举了几个小技巧,包括通过封装相关联的几个参数为新类型、通过拆分/组合的方法解耦复合逻辑等,展示了如何在扩展功能的同时,最大可能保持代码的整洁性。

代码

可视化调试时将指针地址转为 emoji

我们调试时经常需要判断两个变量是否是同一个实例,然而大部分时候 po obj 只能得到得到一串内存地址,需要人眼去比对。这个 gist 扩展了 NSObject,使得 print obj.asPointer.asEmoji 可以打印出 emoji 字符(比如 🌰),而不是指针地址。

内推

北京-蚂蚁金服 招iOS/安卓/前端开发

蚂蚁金服招聘,负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。虽然招聘链接只给了 iOS 的 JD,但前端/安卓/iOS 都要,要求相近。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱) 或这微博私信 @折腾范儿_味精 了解情况。

编辑内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

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

说明

🚧 表示需翻墙,🌟 表示编辑推荐

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

老司机 iOS 周报 #31 | 2018-08-13

22 Dec 09:49
Compare
Choose a tag to compare

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

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

新闻

备受 iOS 开发者喜爱的 raywenderlich 社区全新改版!

raywenderlich 这次进行大改版,为开发者提供更为优质的教程。此次更新主要有:

  • 教程将全部按照主题分类,目前已经有 iOS & Swift tutorialsAndroid & Kotlin tutorialsUnity tutorials 以及 Unreal Engine tutorials 四大类,未来 rw 也将继续增加新的分类;
  • 每个分类都会有自己的主页,可以帮助你更快地找到自己所需要的教程;
  • 全新的学习路径规划,真正实现从『入门』到『精通』;
  • 个人主页上线,掌控自己的学习进度;
  • 教程库,成千上万的教程资源供你筛选;

WWDC 2018 视频已经全部配上简体中文和日文字幕

在早些时候,苹果已经为所有视频配上了英文字幕,仅少部分视频有中文字幕,这次全部都已配上简体中文和日文字幕。相比去年第一次有中文字幕,今年的又额外增加了日文字幕,看来日语区的 Apple 开发者也不少。如果你对之前的看的某个 Session 还有疑问,不如趁着中文字幕上线的热乎劲再回顾一遍。

Dart 重启!Dart 2 正式发布,目标成为移动与 Web 开发主流语言

Google Dart 产品经理宣布 Dart 2 正式发布,这标志着 Dart 语言的重启,目标成为主流的移动和 Web 开发语言。同时,Google 还宣布重构 Dart Web 平台,这对开发者来说,是一个高效率、高性能和可扩展的组合。
Google 称,Dart 2 的目的有三个:优化语言开发,增强 Google 对 Web 和移动框架的支持能力,将 Google 内部的一些支持 Dart 的工具和组件带给外部的开发者。

文章

🐕 Guys, REST APIs are not Databases

作为目前最常见的后端设计风格,REST API 已经成为任何项目中不可缺少的一部分。然而在实际使用的时候,开发者很容易把 REST API 设计成直接对数据库进行操作。

作者在文章中解释了为什么直接对数据库操作是有问题的,同时也给出了自己的对 REST API 设计的一些理解。

🐕 Refactoring Massive App Delegate

每一个 iOS 程序员都需要和 AppDelegate 类打交道,App 生命周期的逻辑一般都会放在这个类中进行处理。该文作者提出了一个“Massive App Delegate”的概念,表示当一个 App 越来越复杂,其 AppDelegate 类也会变得越来越庞大并且难以维护,作者分析了一些有名的开源项目并抽取了一些大家喜欢放在 AppDelegate 类中处理的逻辑列表,并且针对性的提出了三个方向:命令模式,组合模式和中介者模式来更好的组织 AppDelegate 中的代码,很有参考价值。

🐕 Type inference-powered serialization in Swift

类型推断是 Swift 作为强类型语言的一个特性。本文介绍了利用泛型实现类型推断简化 Codable 解析 JSON 的操作。阅读本文可以学习到在实践中如何应用泛型。

🐢 面试中的个人竞争力

很多人都觉得自己没有竞争力,那相信这篇专栏会戳到你的痛点,找工作是不可能的,这辈子都不可能找工作,算法又不会,原理又不懂,只能做一个 github 的搬运工,才能维持会写代码的样子。

写简历要挑重点,用最简洁的篇幅,展现出你个人独一无二的亮点。面试需要多展现自己的思考过程,思考的深度。但这一切都基于过去的积累,就算是再平凡的工作,也能通过发现问题,探寻本源,自驱优化来锻炼自己,提升竞争力,从而赢得好机会的青睐。

🐕 由 NSObject *obj = [[NSObject alloc] init] 引发的一二事儿

这是一篇随想类型的文章,由 [[NSObject alloc] init] 开始讲起,覆盖了 Objective-C 内存分配、ARC、@propertyatomic 等,看的过程遇到不是很清晰的知识点建议另找资料细读。

🐢 剖析 ARM 64 架构中的 objc_msgSend

我们都知道 Objective-C 的"方法调用"其实是消息转发,[obj foo] 其实都会转变成 objc_msgSend 调用。本文概述了 objc_msgSend 内部的代码处理流程,而在具体代码实现层面,整个消息处理流程代码可以分为两个部分:通过汇编代码实现的快速路径部分(fast path),C 语言实现的慢路径流程(slow path)。其中汇编代码对应缓存表中查询方法部分并且未命中时跳转 C 代码来进行下一步处理。本文重点讲了 arm64 架构下 objc_msgSend 汇编部分指令细节。

🐢 构建流畅的人机交互

今年 iOS 花了很大的功夫在优化系统基础体验上,甚至在 WWDC 里专门开一个 session 来讲如何构建流畅的人机交互。这篇文章的作者在看了这个 session 之后有感而发写了这篇文章,在介绍和总结 session 内容的同时,还动手通过代码实现了那些 Design Tips,里面特定交互的最佳实现和动画实现的思路都非常棒,推荐一看。

🐕 血泪总结:如何从微信小程序的坑跳进支付宝小程序的大坑

支付宝小程序也在公测之中,开发者可以自由申请进行体验。不同于微信小程序的社交传播场景,在一些线下支付场景使用支付宝小程序也能获得很多流量,对产品也是大有助益,因为迁移成本低,也是值得尝试。

本文虽说是血泪总结,跳进大坑,但其实从代码的角度来看支付宝小程序的代码规范与API和微信小程序相比,真的是非常非常的近似,只有一些细节的差异。如果你的微信小程序已经很成熟了,那么尝试支付宝小程序将会没有障碍,毕竟微信已经成熟了如果差异很大就没人会用支付宝小程序了。不过终究还存着API差异,如果打算一套代码然后通过前端工程化的方案同时适配2种小程序,那么本文作者踩的这些坑值得关注。

🐕 WubaRN 分步打包流程

用官方命令打出来的 ReactNative(RN) JSBundle 都会带上自身框架代码。如果每个 Bundle 都自带框架代码的话,对于业务模块多的 App 来讲就不是很友好了。所以很多公司都会采取将框架和基础模块代码拆分出来,让所有业务使用同一份基础代码。

本文是 58无线技术 分享的一篇关于 RN 打包的文章,作者按照打包流程来解释他们的 WubaRN 拆分打包的思路,同时也介绍了如何通过缓存来加速打包。还在使用 RN 或对 RN 工程化感兴趣的都可以了解下。

🐕 NLLanguageRecognizer

在 iOS 12中,苹果开放了更多机器学习的能力给开发者。NLLanguageRecognizer 便是其中的一员。本文介绍了如何使用NLLanguageRecognizer判断字符串是属于哪种语言,检查拼写错误和合成声音。

🐎 5 分钟教你成为会赚钱的独立开发者

作者几个月前辞去大公司 iOS 工程师的工作,成为了一名全职独立开发者,目前已经在 App Store 发布了 17 款 app,累计下载量超过 56W 次,其中两款应用被 App Store 多次推荐。作者目前的独立开发月收入已经与辞职之前持平,在这篇文章里他会为你介绍如何把知识直接通过代码变成钱,包括获得创意、建立付费和内购模式、优化 ASO 等等。

工具

Xcode::Install

Xcode::Install 是一款从命令行更新 Xcode 的工具,它可以帮助你安装并管理多个版本的 Xcode。它使用了 Apple 的 开发者下载中心 来查找并下载指定的版本。

Knil

Knil 是一款帮助你测试和验证 Universal link 是否有效的工具。在 Knil 中输入对应的 host,它就会帮你把对应的 apple-app-site-association 文件下载到本地,并列出其中的 path 方便你进行测试。可以直接在 App Store 搜索下载 Knil。

内推

北京-蚂蚁金服 招iOS/安卓/前端开发

蚂蚁金服招聘,负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。虽然招聘链接只给了 iOS 的 JD,但前端/安卓/iOS 都要,要求相近。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱) 或这微博私信 @折腾范儿_味精 了解情况。

编辑内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

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

说明

🚧 表示需翻墙,🌟 表示编辑推荐

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

老司机 iOS 周报 #30 | 2018-08-06

22 Dec 09:49
Compare
Choose a tag to compare

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

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

新闻

新变化不多,但最新的 iOS 12 「剧透」了今年可能发布的新硬件 | 具透

在 iOS 12 的第四个公开测试版中,苹果可透露了不少新硬件的信息:比如支持双卡双待的 iPhone;支持 Face ID 的 iPad;支持无线充电的 AirPods 充电盒;以及 HomePod 将支持打电话。其他软件方面的改动也不少,具体还是仔细看看原文。当然,如果你问我自己能否瞧瞧固件里的秘密,IDAHopper 了解一下。

文章

🐕 Swift 4 弱引用实现

原文作者 Mike Ash,是知名博客 Friday Q&A 作者,现在是 Swift 团队一员。

2015 年的时候 Mike Ash 就已经介绍过 Swift 弱引用的实现了,这次 Swift 4.0 的对象内存布局做了一些调整,加入了 side table 去存放额外的对象信息,改变了弱引用的实现。文章还对 Objective-C 和 Swift 4 之前的旧实现做了对比分析。

🐕 如何在几十个 Repo 中游刃有余

本文对“研发效率”这个话题进行了非常深入的讨论,平时我们为了提升研发效率,会开发一些脚手架,工程模板等,但大多数时候都不会有量化指标去衡量,秉承“不谈目标的优化都是耍流氓”的原则,作者提出了一系列衡量项目迭代和发布时间的指标,来帮助衡量优化的目标。除此之外,还探讨了在复杂系统开发中保持高效开发的经验,很有价值。专注研发效能、工程架构的同学可以重点参考。

另外,作者陈天也是我很喜欢的程序员,经常会发表一些质量很高的技术文章,推荐大家关注他的公众号。

🐕 MessageThrottle Safety

MessageThrottle 是作者玉令天下开发的 Objective-C 节流限频组件,其原理基于 Hook 消息转发流程,在运行时应用了一套节流限频的规则。本文介绍了新版本中对于 hook 流程、多线程操作、规则管理的安全性实现细节。
本文是关于 MessageThrottle 的第四篇文章。前三篇如下:

🐎 Structuring Swift code

随着时间的流逝,几乎所有的 app 和框架都会变得更大、更复杂,所以维持一个稳定的、一致的架构就变得非常关键。这篇文章介绍了提升 Swift 项目架构的几个小技巧,包括"三个原则"(如果有三个相同类型的类、文件夹或文件,就将它们组合起来)、根据功能来组织架构的原则以及"侦查原则"(在改动代码库的时候时刻让文件处于更容易找到的位置)。

🐕 Flutter 的编译模式

Flutter 在 Google I/O 之后也算是火了一把,虽然之后能不能继续火下去也还是个未知,但是能多学习了解新东西总是有益无害。

蚂蚁金服的 stephenwzl 在自己的微信公众号写了一系列关于 Flutter 基础知识的文章,对于还在学习 Flutter 的人来说,比较有学习价值。

本文介绍了 Flutter 编译中的一些基本概念,阐释了基本的编译过程和不同平台上的区别。除了这篇文章,还可以参考学习一下他的其他文章。

🐎 Migrating an Objective-C class to Swift: a piecemeal approach

随着 Swift 越来越普及,很多人都会面临如何将 Swift 与已有的 OC 代码相结合的问题。对于一个已有的 OC 类,如果我们无法马上把它完全用 Swift 来重写,但是又想用 Swift 为它扩展功能,特别是添加不兼容于 OC 的存储属性(如带泛型的枚举类型),我们是无法把这个属性直接加到 OC 类定义里的。作者巧妙地做了一层简单的封装,轻松绕过了这个限制,相信对大家处理类似问题会有启发。

🐕 Never

Never 是 Swift 标准库中一个很特别的类型。在 SE-0102 中提出用 Never 去代替 @NoReturn。在文中 Mattt 先介绍了 Never 这个特殊的类型是什么,紧接着以 Result<Value, Error: Swift.Error> 为例介绍了一个 Never 用于解决不可能发生的场景的实际应用的妙处。最后在文章的末尾,Mattt 还写了一些对未来的 Swift 中 Never 可以以一个 Bottom Type 的角色去实现更多的功能的期待。

🐕 JSON Web Token 入门教程

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文主要是介绍它的原理和用法。

对于用户认证来说,用户的 session 数据如果存在服务端,那对于服务器集群,或者是跨域的服务导向架构。session 数据的共享,会是一个比较麻烦的问题。 JWT 方案则是将不可篡改的 session 数据储存到客户端,每次请求再将 session 数据发回给服务端进行用户认证。不同服务器之间,不再需要进行 session 数据共享,比较容易实现扩展。

🐎 Scrollable UIStackView

对 UIScrollView 进行自动布局(Auto Layout)时需要设置两套约束,分别是 frame 和 content。设置 frame 很简单,跟普通的 view 操作一样;但是 content 就比较特殊了,自动布局引擎会通过子视图的大小自动调整 content,所以加到 UIScrollView 里的视图必须是已经指定大小或者能自动计算大小(intrinsic content size)的。

本文主要解释了把 UIStackView 加到 UIScrollView 进行自动布局时出现的一些棘手的问题,并实现了一个可滚动的高度自适应的 StackView。相信大家看完后,对如何使用自动布局处理滚动视图会有一个比较清晰的认识。

代码

PerfectAccelerators - 加速 Perfect Server Side Swift 开发

上期我们推荐了篇文章介绍 Perfect 开发体验,这次,给大家推荐一组 Perfect 封装库,可以帮助 Perfect 加速 Server Side Swift 开发。

音视频

ADDC 2018

ADDC 是 2018 年 7 月 4 日至 6 日在西班牙巴塞罗那举办的 App 设计师和开发者大会,这个大会的目的是给设计师和开发者提供一个开放的、包容的、合作的空间,让他们在一起碰撞想法,找到新的合作方式。ADDC 请到的嘉宾都是移动 app 领域的顶级开发者和设计师,这个 YouTube 频道收录了他们精彩的、具有启发性的演讲。

内推

北京-拉勾网招聘 iOS 工程师

拉勾团队目前需要一枚 iOS 大牛,负责公司核心产品功能的开发和维护。

北京-蚂蚁金服 招iOS/安卓/前端开发

蚂蚁金服招聘,负责支付宝会员及帐号业务线,地点北京国贸,金台夕照地铁站出口 100 米。虽然招聘链接只给了 iOS 的 JD,但前端/安卓/iOS 都要,要求相近。有兴趣的同学欢迎将简历发送到:[email protected] / [email protected] (同一个邮箱) 或这微博私信 @折腾范儿_味精 了解情况。

编辑内推

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

本期编辑

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

说明

🚧 表示需翻墙,🌟 表示编辑推荐

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