Skip to content

Releases: SwiftOldDriver/iOS-Weekly

老司机 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)

老司机 iOS 周报 #3 | 2018-01-15

22 Dec 09:34
Compare
Choose a tag to compare

第三期的周报如愿以偿的在周一和大家见面了。前两期的时候因为刚开始做不知道能否做到每周一更。小伙伴们在磨合了两周之后也互相有了默契。希望我们能够继续陪伴大家一起成长。

在掘金上我们也开通了专栏,如果是掘金的用户欢迎关注我们:老司机 iOS 周报

新闻

国区 iCloud 账户将转由「云上贵州」运营

2018 年 2 月 28 日起,国区 iCloud 账户将转由「云上贵州」运营。如果想要把 iCloud 的东西继续存在美区,可以参考少数派的文章:不想停用 iCloud?不妨迁移数据到其它 Apple ID

英特尔处理器打补丁后,性能并没有下降很多

标题已经说明一切,为了照顾强迫症我随手打几个字给你。

微信着手封堵 Universal Link

恭喜微信离成为操作系统的目标又近了一步。

Announcing Realm Cloud: Realm Platform as a Service Beta

Realm 云服务新版本开始第一轮公测啦!只需要简单的配置即可接入,现在就来试试吧:申请试用 Beta 版,只有 500 个名额哦~申请通过的话还能以 5 折的价格购买 1 年的 Realm 云服务。

文章

移动 APP 网络优化概述

从速度、弱网、安全三个方面介绍了移动场景中的网络优化。概念清晰易懂,bang 的文章一如既往值得一读。

接手一个刚起步的 iOS 项目后我做了什么

过去半年我负责一个刚起步的 iOS 项目后的工作实践总结。

WCDB 源码解析

介绍了微信 WCDB 的代码实现,有不少数据库的知识点。

[译]2017 Swift 单元测试文章资源精华

medium 上有人整理了 2017 年单元测试相关的优秀视频文章。非常值得收藏,所以我翻译了一份资源的简介。

[译]用Buck构建混合语言iOS项目

Buck 是 Facebook 开源的编译工具,可以提高编译时间。用来编译纯 Swift 或者纯 OC 项目都没问题,然而编译混合语言的项目则会碰到很多问题。Airbnb 在这篇文章里介绍了他们是如何解决 Buck 在混编项目中使用的问题。

iOS 9 之后 NotificationCenter 还需要 removeObserver 吗?

iOS 9 之后,通过 selector 方式 addObserver(_:​selector:​name:​object:) 不用显式 remove,但使用 block addObserver(forName:​object:​queue:​using:) 依然需要在 observer 销毁之前主动调用 removeObserver。文中还给出了一种 Automating unregistering 方案。

Xcode 9 里一些实用的 URL

大家都知道 Xcode 9 里优化了代码版本控制的功能,甚至可以直接在 GitHub 上使用 Xcode 打开项目,这个功能主要是通过 URL 实现的,URL 并不只是支持了跳转项目的功能,这篇文章就介绍了很多其它实用的路径。

开源项目挣钱实用手册

整理了开源项目获得收入的各种方式。

Swift Non-Nil Values In An Array Of Optionals

如何优雅的过滤数组中值为 nil 的数据?你可以试试 flatMap。

Write your scripts in Swift with Beak

用 Swift 也可以轻松愉快地写脚本啦,当然,首先需要安装 Beak

工具

create dmg

dmg 是 macOS app 常用的分发格式。一行命令将你的 macOS app 打包成 dmg 格式。

typewriter

当不同系统之间进行数据交换时,往往要有一套特殊的数据交换格式或协议来作为中间人,比较典型的就是 JSON 和 ProtocolBuffer。而把中间数据格式转换为具体数据,实际上就是将中间数据格式进行语法翻译,翻译成系统中对应语言的代码,typewriter 就是上述问题在客户端领域的翻译器,纯 Swift 实现,值得学习和使用。

AutoPacking-iOS

在实际的 iOS 开发、测试、发布过程中,需要不停的打各种包用于各个流程,开发人员忙于新需求实现的同时,还要花费大量时间在打包这种重复且没有意义的事情上,十分浪费精力。AutoPacking-iOS 为我们解决了这个问题,配置好参数后可以一键打包上传到蒲公英、fir.im 等内测网站或 App Store,方便快捷。

Step by step – The story about a code bookmarking tool

这是一个代码标签工具,可以通过简易的流程图来描述代码的行为,然后跳转到对应的代码,目前支持 Xcode / Android Studio / Sublime 等编辑器。

thefuck

控制台执行命令经常报错却不能自动执行某些操作一点也不智能?一定是没有调教好,试试 thefuck,大幅提升工作效率!

代码

XLForm

XLForm 是一个 iOS 表单页面的一个解决方案。可以解决各种复杂交互的表单页面,功能十分强大。用 OC 实现,代码质量很高,其设计思想也很值得学习,是一份很不错的源码学习内容。

比较有意思的一点是,XLForm 的 Swift 版本 Eureka 并不是单纯的翻译 XLForm,而是用一种全新的方式去实现相同的功能,通过大量的函数符重载,让写出来的代码特别清晰。

但是,我觉得对于大部分的 app 来说,没有太过于复杂的表单需求,所以没有太大的必要引用这个库去实现一些简单的表单页面。会给人一种,用复杂的工具去解决简单的问题的感觉。

当然,如果是一个类似系统设置的 app 来说,使用 XLForm 一定是首选之一。

iOS 性能优化合集

关于 iOS 性能优化梳理:基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、安装包瘦身、启动优化、网络优化等。

CollectionViewSlantedLayout

CollectionViewSlantedLayout 是一种 UICollectionView 的布局,实现了倾斜卡片的布局样式。同时支持纯代码使用和 Xib 配合使用。

React Native 应用开发实例解析

共五章,前两章介绍 React Native 的历史发展和基础知识,包括原生组件和第三方库;余下三章则分别介绍三个企业应用——Myagi、TinyRobot 和 Fixt,探讨了当今业界使用 React Native 的方式,以及生产环境下需要注意的问题和相应对策。

适合想初步了解 RN 开发的开发者。

音视频

Checked #51: 准确表达与善意理解

51 期聊了苹果的降频门。

Swift Talk #82 Refactoring Imperative Layout Code

这一期的 Swift Talk 通过实现一个简易的 FlowLayout 来为我们介绍如何使用函数式去重构布局代码。

招聘

36氪: iOS Leader

北京 D 轮,使用 Swift 开发哦。

流利说: 资深 iOS 开发

上海,使用 Swift 开发,业内口碑巅峰。感兴趣微博联系 hr: JaniceWU贾尼丝

hr 表示:

我们也有很多不足的,比如说始终因为要求太高招不到足够的人。

基础架构开发工程师

B 站搬到新地方后业务依然迅速发展。喜欢 B 站的朋友可以试试。

喜马拉雅 iOS leader

上海 D 轮。

本期编辑

@没故事的卓同学@四娘@mmoaay@享耳先森@EyreFree@Damonwong

说明

🚧 表示需翻墙

老司机 iOS 周报 #29 | 2018-07-30

22 Dec 09:49
Compare
Choose a tag to compare

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

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

新闻

Mattt 和一些国内开发者一起重启了 NSHipster.cn

自 Mattt 今年从苹果离职并重新投入到开发社区后,先后创建了 @Flight-School 和重启了 @NSHipster 的更新。而就在上周,有心的开发者会发现 NSHipster 的中文版仓库也开始有更新了,Mattt 已经确认将会和中国开发者一起完成 NSHipster 的翻译工作(详见这里)。目前一些旧的文章正在进行一些审校更新工作,相信新的文章也很快会完成翻译更新。同时,也欢迎有能力和精力的开发者一起投入到 NSHipster.cn 更新维护中来!

文章

🐎 Updating Strings For Swift 4.2

Swift 4.2 中的 String 只有一个属性 characters 被标记为废弃,因为从 Swift 4 开始 String 已经是集合类型,所以直接删掉 characters 属性即可。

一个改进是原来只有获取第一个元素的方法: first(where predicate: (Character) throws -> Bool),在 4.2 中增加了获取最后一个元素的相关方法: last(where predicate: (Character) throws -> Bool), lastInex(of: Character)。为了方法名称的统一,原来的index(of: Character)重命名为 firstIndex(of: Character) ,但是原来的方法名依然可以正常使用,推测下一个大版本 index(of: Character) 会被标记为废弃。

🐕 Snapshot Testing on iOS

Snapshot Testing on iOS (快照测试)是这样一个想法:拍摄用户界面的屏幕截图并将其存储为参考图像。然后进行单元测试以获取同一 UI 的屏幕截图并将其与参考图像进行比较, 基于此想法应运而生的工具有很多,其中由 Facebook 创建 Uber 维护的 iOSSnapshotTestCase 测试框架使这个过程变得非常容易 。
本文作者萌生了在项目中使用快照测试的想法而发起了这个关于快照测试的的讨论,并且整理出了一系列优缺点,对快照测试感兴趣的朋友可以关注下哦~

🚧 🐎 RESTful API Design — Step By Step Guide

Restful API 的设计对于很多客户端工程师来说可能有一点陌生,但其实这些设计原则不仅仅可以用来指导服务端接口的设计,客户端的一些公用组件的设计依然可以参考其规范来提升可理解性、可复用、可扩展性等方面。本文首先介绍了 restful 接口实践的标杆 - Amazon 的一些经验,然后重点介绍了几个设计的关键原则,其中提到,优先使用名词,而不是动词来命名接口,相信是绝大多数从 C 语言和面向过程编程开始入门的程序员经常犯的错误。文章措辞简练,读起来很轻松,举例也很生动,推荐阅读。

🐢 iOS 启动时间优化

标题虽短但这篇文章却是小编阅读过对 iOS App 启动时间分析和优化类最为系统透彻的。该文从 App 启动的两个阶段 - 『pre-main 阶段(点击桌面图标到 main 函数被系统调用这段时间)』和『main 阶段』分别进行原理剖析,并对一些涉及到的概念进行释疑,而后针对剖析出的可优化点结合实际项目进行优化实践。其中 pre-main 阶段的优化主要基于 linkmap 分析各个静态库依赖包大小并针对性瘦身,而 main 阶段的优化主要是减少阻塞主线程的任务。

整篇文章阅读下来,会对 iOS 中 App 的启动有一个很清晰深刻的认识,对我们自己动手进行启动时间优化很有参考意义。

🐕 Swift HTTP Server 开发体验

从 Swift 开源并支持 Linux 运行之后,Swift Server API 趋热,先后出现了 PerfectVaporKituraZewo 几个框架。

本文作者使用 Perfect 开发了一个 以 MySQL 和 HDFS 作为支撑,应用了包含 Web 服务、JSON 接口服务、以及基于 Socket 的文件传输和视频直播流服务的项目 给大家讲解开发体验及部署过程,并介绍如何接入第三方服务(以 MySQLHDFS 举例)。

🐎 Custom Types for Powerful Matching

我们经常会遇到关于 url 解析的场景,输入一个 url,输出跳转的目的地,来实现类似路由的功能。作者利用了 Swift 的强类型、模式匹配和运算符重载的特性,给出了一个相对优雅的解决方案,逻辑清晰易懂,相信会对大家会有所启发。

🐕 Conditional Compilation in Swift, Part 1

本文讲述了 Swift 中方的条件编译。当然首先是传统的方法 arch(),作者对各个参数都做了详细的介绍。不过随着 Swift 4.1 的到来,你更应该了解一下方便好用的 targetEnvironment()(SE-0190)。其次是使用配置文件(.xcconfig),这个方式其实被 CocoaPods 大量使用。作者也用示例做出了详细的介绍,同学们不妨也在自己的工程中试一试。

🐕 让你的 Swift 代码保持良好的向后兼容性

重构是代码构建过程中不可避免的一个阶段,尽可能保持 API 的稳定对于平稳的迁移是一件很重要的事情,这周的 Swift Sundell 就介绍了一些保持语法稳定的重构技巧,Swift 由于其良好的语法设计,可以在修改接口的同时保持语法的向后兼容性,这篇文章里挖掘了很多相关的语法特性,强烈推荐大家阅读!!!

🐕 Better iOS projects: Getting (nearly) rid of Xcodeproject - A (not so) short Introduction to Xcodegen

在我们日常开发中,绝大部分情况都是手动创建和维护.xcodeproj文件。但是在团队开发中,我们经常需要处理项目文件冲突,维护依赖也是一件比较麻烦的事情。本文则是介绍了Xcodegen这一工具。通过创建一个描述文件,就可以自动生成项目文件,和管理依赖。

🐕 Password Rules / UITextInputPasswordRules

自 iOS 8 以来,Safari AutoFill 已经能够生成随机密码,但只能生成字符加数字(顶多中间补点横杠)。Apple 在 iOS 12 中的 Automatic Strong Passwords 解决了这个问题,其中包括一个新的 UITextInputPasswordRules API,以及其他一些密码管理功能,包括验证码自动填充和联合身份验证。UITextInputPasswordRules API 可以用来指定服务需要的特定密码规则,例如必须的字符种类、允许的字符种类、允许的最大连续字符数、最小密码长度、最大密码长度。但这个 API 是 String Base 的,可以使用更加安全的枚举形式改造一下。

🐕 NSHipster.cn:WKWebView

Mattt 重启了 NSHipster.cn 之后,更新了一篇关于 WKWebView 的旧文,列举 WKWebView 与 UIWebView API 差异,还有一些 iOS 11 之后的新特性,包括内容过滤规则,浏览器截屏等等。本次 Mattt 更新文章一大原因就是 iOS 12 苹果将 UIWebView 标记为 deprecated ,还未尽快升级 WKWebView 的朋友们,可以看看 Mattt 的这篇文章复习一下。

代码

DBDebugToolkit | Wormholy | GodEye

最早看到监控或是 Debug 类 SDK 完整功能的实现是子循的 Godeye ,最近似乎此类 SDK 又重新被大家关注起来了。

这里提供了几个最近比较有代表性的库的链接,大家可以了解一下。

iOS 面试之道

故胤道长和唐巧合著的这本《iOS 面试之道》终于在长时间的等待后上架了。

唐巧从他多年招聘经验出发,给出了诸多面试流程,简历修改,Offer 选择的知识,而故胤道长则是从他多年在北美的 iOS 面试经验出发,给出了具体的算法及 iOS 基础指示的准备。

相信读完本书,您一定能对 iOS 面试有一个更深刻的理解和认识。

音视频

🚧 Appdevcon 视频

Appdevcon 是由 App 开发者组织,面向 App 开发者的技术大会,它的前身是 mdevcon。他们目前已经把今年大会上的所有演讲视频都上传到了 vimeo,供大家免费观看学习。当然也可以对照日程表,选自己感兴趣的主题看。

内推

北京-蚂蚁金服 招 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 周报 #28 | 2018-07-23

22 Dec 09:48
Compare
Choose a tag to compare

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

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

文章

🐕 How not to be a mediocre developer

成为优秀程序员的 12 条 Tips,涉及到代码习惯,学习方法以及态度等多个方面,值得大家学习和思考。

🐎 移动应用架构演变及泛前端趋势下移动团队破局

看到这样的标题是不是被吓了一跳。我一直觉得一般标题太牛逼的文章都会有点刻意感,不过看完这篇文章之后打消了我的偏见。这篇文章核心是两部分,首先是回归了移动端工程体系发展的历史,然后是讨论了在现在这个局势下,技术团队和工程师个人的发展方向。作者分析总结的很到位,虽然作者是从 Android 工程师的角度来看的,但是很多建议对 iOS 工程师也同样适用。

文章的最后作者提炼了目前值得投入的几大方向:容器化技术、跨平台开发方案(RN,Weex,Flutter),体系化运维以及垂直领域技术(音视频,图形图像)。对于目前觉得自己技术深度提升遇到瓶颈的同学,可以参考。

🐕 mock in iOS

mock 并不是一种特定的操作或者编程手段,它更像是一种剖析工程细节来解决特殊环境下难题的解决思路。无论如何,如果我们想要继续在开发领域上继续深入,必然要学会从更多的角度和使用更多的工具来理解和解决开发上的难题,而 mock 绝对是一种值得学习的开发思想。本文作者详细列出了什么时候�用 mock 以及如何实现 mock 。

🐕 How to write a good software design doc

一般来说在一个大团队或者大公司里,开始动手实现一个新功能之前,开发者需要写好 Design Doc ,然后进行 Design Review 。Design Doc 作为记录,描述设计,并阐述未来实现方案的文档,其重要性不言而喻。然而现实中很多人并不知道怎么去写一份好的 Design Doc 。

而在本文中,作者从她的角度出发,阐述了她心中理想的 Design Doc 的样子。作者同时还在文中提出了几个合理的建议用来判断一个 Design Doc 是不是一个好的 Design Doc , 值得学习。

🐕 2018年 iOS 面试心得

关于 iOS 面试的详细攻略,适合最近想要换工作的同学们学习。如果想成为一个合格的 iOS 工程师,赢得面试官的认可,必须要沉下心来,多花精力在各个领域里耕耘,不光是日常应用层面,也需要练习数据结构和算法基本功,同时调整好心态。作者分别从这几个角度出发,给出了自己的一些经验和建议。

🐕 Bug Reporting

“Radar” 是苹果的 bug 追踪系统,不仅可以用于追踪软件、硬件中的功能和 bug,还适用于追踪文档、本地化、web 属性甚至是 Siri 回答的问题。对于苹果员工来说,Radar 指导了从问题报告到问题验证的整个工作流程。但外部开发者是无法直接访问 Radar 的,所以在这篇文章里,知名 iOS 开发者 Mattt 会为你介绍作为外部开发者应该如何报告 bug,包括使用 Apple Bug Reporter、Feedback Assistant 以及一些第三方工具,此外还包括如何撰写 bug 报告,最后还介绍了如何避免让自己提交的 bug 报告石沉大海、杳无音讯。

🐢 苹果 iOS 系统源码思考:对象的引用计数存储在哪里?- 从 runtime 源码得到的启示

对框架原理的掌握程度一直是大厂招人考核的一个重点。这篇文章通过对 Objc 源码抽丝剥茧,层层递进地从底层原理解释了 OC 是如何实现引用计数的内存管理方式。这类文章总是不可避免地会包含大量源码片段,不过作者能通过自己的阅读和理解后,梳理出一个清晰的学习目录,且对每段源码的分析都比较到位,很值得同在啃底层源码的同学借鉴。

🐕 WWDC18: A Basic Guide to App Store Connect API

Apple 将 Apple Developer Portal 和 iTunes Connect 结合起来,并将其重新命名为“App Store Connect“。也带来了一些新的改变:

  • Transporter 工具支持 linux 系统
  • TestFlight 支持可以直接下载安装的公开链接
  • 销售和趋势页面的展示
  • 更强大的 App Store Connect 移动端

App Store Connect API 是基于 JWT(JSON Web token) 的标准 RESTful API,具备跨平台性以及拥有完整的使用说明文档。通过该 API 我们可以自动化的去管理几乎所有 App Store 相关的内容。例如管理证书、管理配置文件,管理设备和安装包 ID,管理用户、设置用户角色以及 app 的访问权限,管理 TestFlight、公测用户以及公开链接,下载财务和销售报告。在使用 App Store Connect API 之前,你必须生成一个 token。苹果使用 JWT(JSON Web Token)标准在 App Store Connect 和您的终端设备之间建立连接。登录 App Store Connect 网站创建新的 API 密钥,根据密钥生成有时限的 JWT token,就可以通过传递授权标头来使用 App Store Connect API。

🐕 An Introduction to AR Quick Look in iOS 12

在 iOS 12 里 Quick Look 支持了预览 AR 对象,也就是说可以在邮件、信息和任意支持 Quick Look 的应用中分享 .usdz 文件,接收者可以打开并查看 AR 对象而不需要下载其它 app。而且 AR Quick Look 不仅局限于在 app 中使用,甚至连网页也可以整合 AR Quick Look!这篇教程会教你如何在 iOS 应用中整合 AR Quick Look,并且还会用 GitHub Pages 构建一个非常基本的 HTML 网页,为你展示如何给网站添加 AR Quick Look 功能。

🐕 Automatic Screenshots With fastlane snapshot

Fastlane 是一个自动化的工具集,主要用于自动化的打包,发布等工作。本文介绍的是 Fastlane 的一个控件,主要用于自动截屏工作。自动截屏在平时的开发中可能使用的不多,但在自动化测试领域上,是很重要的一个模块,例如对错误时候页面的现场截屏,测试结果的比对等等。Fastlane 只需要简简单单的一点代码,以及一些设置,就可以集成到我们的项目中,使用起来非常方便。对自动化方面有需求的同学不妨看一下。

🐕 Refactoring Swift code for testability

代码的可测试性是衡量代码质量的一个重要标准。如果你还没有写过测试用例,那我建议你应该先补一下这方面的功课。这篇文章为如何更好的测试你的 Swift 代码,提出了两点重构思路:纯粹的函数(Pure functions)与依赖注入(Dependency Injection),并都给出了示例代码。值得想要提高代码质量、以及获得新思路的同学借鉴。

🐢 GraphQL 在微服务架构中的实践

之前老司机周报已经介绍了 GraphQL 与 RESTful 之间的异同,GraphQL 对于资源的管理提供了比 RESTful 更多的灵活性,同时也增加了后台服务治理的复杂性。对于大型团队+大型系统的协同开发场景,微服务是已被证明有效的一种后台架构方案,然而微服务架构本身也是一种复杂抽象的架构。当灵活多变的 CGI 设计方案遇上复杂抽象的后台架构,需要考虑的事情将会异常的多,大部分情况下都要摸着石头过河。本文作者通过半年多以来的实践经验,阐述了在工作当中遇到的问题和采用的解决问题的思路,提供了很多很有价值的经验供各位架构师参考。

🌟🐢 The Lotus MVC Pattern: Solving the 5 Issues of the MVC, MVVM and VIPER patterns

长文宜细读。

这是一篇长文,作者分析了现有架构的优缺点,之后提出了自己的架构:Lotus MVC (名称的由来是此架构下各模块之间的类图非常象莲花),文章大题分为三个部分:

  • 现有 MVC、MVVM、VIPER 架构是怎么分层的,解决了哪些问题,但带来或还有哪些问题没解决;
  • Lotus MVC 各模块的角色及关系;
  • 通过 Github client app 来讲解 Lotus MVC。

代码

美团客户端响应式框架 EasyReact 开源啦

在我们日常开发中,状态可以说无处不在,就像笔者最近参与的一个项目的开发,一个数据的改变牵扯到多出 UI 的变化,这时候,就很自然想到用响应式编程的方式去解决这个问题。恰好,就在最近,业界期盼已久的响应式框架 EasyReact 终于开源了。美团一直是 FRP(函数响应式变成)的重度使用团队。他们在此之前很早就引入了 ReactiveCocoa 这个框架,对推动 ReactiveCocoa 框架本身以及 FRP 的编程思想起到了重要的作用。但随着美团业务及团队的发展,在使用 RAC 上,美团也遇到了一些问题。例如 RAC 本身公认的学习曲线较为陡峭,调试困难等问题。为了改善这些问题,同时保持响应式编程带来的种种便利,美团团队自研了响应式编程框架 EasyReact 。从官方的说法中,EasyReact 在性能上,测试的便利性上,写法的统一上都更胜一筹。虽然目前笔者还不能确定这些说法是否都是对的,但无论如何,在响应式编程这一领域上,美团无疑带给我们了一个很重磅的开源框架。对此方面有兴趣的同学现在可以 Down 下来代码尝试学习或者使用啦!

RxReduce

Redux 在前端是一个很流行的框架,在 iOS 上根据相同的思路与之对应的框架是 ReSwift。因为所有的变化都是响应状态的变化,所以天生带着响应式属性,非常适合 Rx 体系。这次 Rx 社区推出了 RxReduce 来实现这个框架。所以如果现在项目里打算使用单向数据流的架构,可以考虑接入 Rx 全家桶。

ZJAttributedText

ZJAttributedText 是一个富文本框架。和 YYText 对比起来,更轻量级,并且能通过链式调用进行富文本的样式编辑。

Twitter Network Layer (TNL)

Twitter Network Layer (TNL) 是 Twitter 开源的一套基于 NSURLSession 的扩展性强且功能丰富的 iOS 网络层框架。建议对构建基础网络层感兴趣的同学都深入学习下,据说该框架在 Twitter 内部已经用了 4 年,并且最近 18 个月都是处于 no bugs 状态,具体介绍可以看下 Twitter 官方发布的博客文章 🚧 Introducing Twitter Network Layer iOS framework for open source

内推

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

这是一家非常年轻的创业公司,充满活力与激情,希望能有更多优秀的人,加入字节跳动,一起让人们看见更大的世界(今日头条、西瓜视频、悟空问答、懂车帝 、TopBuzz、News Republic...),也让更多人的美好生活被看见(抖音、火山小视频、Musical.ly、图虫、Faceu...),我的邮箱 [email protected],或者添加我的微信 jingmu1994 了解更多公司及岗位信息。

深圳头条研发中心诚招各路 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

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

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

关注我们

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

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

本期编辑

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

说明

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

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

老司机 iOS 周报 #27 | 2018-07-16

22 Dec 09:48
Compare
Choose a tag to compare

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

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

新闻

WWDC18 Video Transcripts Now Available

WWDC 2018 的字幕支持全文关键词检索了!而且通过这个关键词打开的视频会直接定位到关键词所在的位置,另外分享的视频也支持分享某个特定的时间点了。

文章

🐎 Swift GYB

大家经常听到 boilerplate 这个单词,一般都用来指代一些相似但又不完全相同的代码结构。这篇文章讲述了关于这个单词由来的趣闻,而且还介绍了在 Swift 开发中最常用的一个处理 boilerplate 代码的工具:gyb.py。如名字所示,gyb.py 是一个 python 脚本,这个脚本可以理解成一个模板生成器,你可以按照规定的格式书写一个 Swift 模板文件(其中可以使用 python 的代码来做一些重复代码的生成)。然后使用 gyb.py 执行该模板文件即可生成最终的 Swift 代码文件。

除了基本使用方法的介绍,文章中还介绍了如何将 gyb.py 配合 Xcode 一起使用。工程中有不少 boilerplate 代码但又苦于 Swift 没有宏支持没办法很好的简化的小伙伴们,不妨试试看这个方案。

🐕 Web Architecture 101

曾经有一段时间很流行一个面试题:请描述一下用户在浏览器输入一个网址点击访问,到最终网页显示出内容这之间都发生了什么。如果你对这个问题感到困惑,这篇文章就是为你而生。该文剖析了一个时下流行的网站系统最常见的组成部分。内容很新,比如还介绍了时下流行的 “Data” 系统的概念,现在大数据时代,越来越多的公司会专门开一个 Data Service 来解决日志数据存储、分析、挖掘、模型训练等需求, 和 Database Service 这样仅仅完成数据存储的目的不同,Data Service 往往指一整套数据生命周期的逻辑,而在之前这类数据往往只是扔到一个日志系统里进行定期存档。除此之外,经典的负载均衡、DNS、Cache、搜索等组件也有逐一介绍,是不可多得的 web 系统入门文章,墙裂推荐。

🐕 [译]Create ML 教程: 开始入门

Core ML 把机器学习的模型应用变得如此简单,而唯一的问题就是如何快捷地训练自己的模型。为此,Apple 在 WWDC18 推出了 Create ML。这篇文章以图片分类器为例,同时使用了 Create ML 与 Turi Create (WWDC17 后被苹果收购,使用 Python 来自定义模型)作为对比,让你对图形化的模型训练有一个直观的认识。如何训练、评估、改进模型都是值得进一步深入思考的。

很明显,你能在 Create ML 的身上看到许多 Turi Create 的影子,在 Create ML 上实现所有 Turi Create 的功能也只是时间的问题。另一方面,Swift for TensorFlow 也已经来势汹汹。想要使用 Core ML 又不会训练模型的同学,绝对值得推荐。唯一的问题是,Create ML 需要 macOS 10.14 Mojave Beta。

🐕 腾讯社招 iOS 面试记录

最新出炉的面试真题,一面常规基础问题,帮助你查漏补缺。二面聊项目,看完也可以回顾一下自己的项目,对使用到的技术,解决的问题是浅尝辄止,还是层层深入,从原理层面理解技术,理解问题。

🐕 Flutter混合工程改造实践

咸鱼团队作为国内 Flutter 的先行者,给我们带来了好多优秀的 Flutter 实践,这次给大家带来的便是 Flutter 与原有 iOS 工程混合改造实践。在 RN/Weex 的框架机制下,原 iOS 工程只需要引入基础 SDK ,js 开发的功能只需要将打出来的 jsbundle 下发/资源引入到原有 iOS 工程即可。而 Flutter 由于在机制上和他们截然不同,在 Release Mode 下,dart 开发的功能需要编译成 iOS 的 framework ,再由原工程引入,因此在工程混合上会需要对现有工程的持续集成打包构建体系进行不小的改造工作。闲鱼团队针对此给大家带来了他们的解决方案。

🐕 Better iOS projects: How to manage your tooling with mint

Number42 的 "Better iOS projects" 系列旨在收集能够方便高效处理 iOS 项目的一些工具和环境。这次介绍的是 Mint —— 一个通过 Swift Package Manager 来构建 Swift 命令行工具的依赖管理器。Mint 最大的亮点就是可以指定工具在不同项目环境下运行不同的版本,解决由于环境配置不一致会影响开发效率的问题。同时它也支持通过 Mintfile 来配置和隔离不同项目中使用的工具,确保各个项目在所有开发环境里使用的工具都是相同的版本。一直被环境配置问题困扰的 Swift 开发团队可以尝试下,不管是设计思路,还是使用体验都是不错的。

🐕 你可能会忽略的 Git 提交规范 约束你的git操作,让你生无可恋。

现今,Git 已经非常广泛的应用了。它不仅仅被用在代码的版本控制上,甚至类似 UI 设计图( Sketch )这种工程都开始用 Git 进行版本控制。然而,当团队到了一定规模的时候,没有一个统一,合理的 Commit Message 会成为严重阻碍开发效率的障碍。

这两篇文章都是通过介绍一些相关的工具来展示如何规范 Commit Message ,进而通过规范化的 Commit Message 来生成 Changelogs 等。虽然文中案例都不是 iOS 相关,但是依然值得学习参考。

🐕 Video Streaming Tutorial for iOS: Getting Started

Ray Wenderlich 的入门教程基本都是通过一个具体,渐进式的案例,来介绍做法,非常适合刚接触某个领域的开发者。

本文通过几个简单的播放器案例来介绍如何使用 AVPlayer 进行开发。对于刚接触 iOS 视频的开发者来说,是个很不错的入门资料。

🐕 实现一个优雅的 iOS 事件总线

iOS 开发中与不同事件打交道是家常便饭,苹果提供了不同的方式来订阅各种类型的事件。比如通过观察者模式订阅不同的 Notification,通过代理模式实现不同回调的订阅,或者通过 Target-Action 模式 UIButton 等控件的用户事件。那么能不能有一种更加优雅的方式来处理这些事件呢?接触过函数响应式编程的同学应该都会知道 ReactiveCocoa,它通过 Signal 订阅的方式提供了一系列的 API 来帮助我们方便地处理这些事件。本文则自己实现了一套优雅的事件总线机制,只要通过『定义事件』、『订阅事件』和『发布事件』三部曲,就可以优雅地使用这套事件总线。

🐎 带着《iOS应用逆向与安全》,我还在路上

距离庆哥新书『iOS应用逆向与安全』发布已经有一个多月了,这篇文章上半部分庆哥发表了自己对学习与选择的一些看法,下半部分则通过《逆向世界杯直播App 央视影音 - iOS 客户端》的实战,为大家演示了如何完成一次简单的逆向。

文中关于学习的看法,深表认同,摘录一部分与大家分享:

还有就是总会想为什么别人这么优秀,都是“大佬”,其实并没有什么大佬,或者说每个人都是大佬,只是在不同领域不同方向别人比你多花那么一点点时间和多那么一点经验,换一个领域我们都是小白。或者你有没有想过,你在做什么事情的时候总是想着推迟一点点再想,晚一点点再做,或者每一点点就是现在的你和优秀的你之间的一点点差距。

🐕 Anti-If: The missing patterns

代码中如果有大量嵌套的 if 逻辑判断会增加代码的理解难度,降低可维护性。文中针对几个使用 if 的场景提出了优化的方案。

🐎 深入理解 iOS Crash Log

有一定开发经验的同学对 crash 日志分析相信都已经非常熟悉了。不论是自研或者第三方的,还是苹果自带的 Crash 收集框架,我们往往都能够通过 dsym 文件将日志符号化后找到有用的异常信息。这篇文章通过系统自动收集的一个微信 Crash Log,很系统地介绍了如何获取 Crash 日志文件,以及如何解读 Crash 日志文件中的每个信息。最后作者还分享了自己的一些常见的 Code 和 Debug 技巧。

🐢 So, you want to build a “Silicon Valley-like” software developer culture

我们经常谈论“工程师文化”,而其中说的最多的是“硅谷的工程师文化”。作者从五个角度来分析工程师文化到底是什么,包括效率、自我驱动、激励、试错、成长这几个角度。过程和结果同样重要,而“怎么做每一件事”恰恰是铸就工程师文化的基础,尤其对于带团队的 team leader 们来说非常值得一看。

🐕 New in iOS 12: Adding a Custom UI and Interactivity in Local and Push Notifications

从 iOS 10 开始,苹果陆续增强了系统推送通知的能力,包括推送中附带图片、重按快捷操作等等。在 iOS12 中苹果进一步拓展了推送通知的能力,支持在推送详情中直接加入按钮等控件,给开发者带来更丰富的可能性。作者介绍了实现新特性所需要操作的每一个步骤,写的非常详细。

🐕 iOS 界面性能优化浅析

随着硬件升级及系统优化,日常开发中需要针对性的做性能优化的地方可能不多,但遇到问题时需要大量预备知识来应对。本文着重讲复杂页面的性能优化,包含了布局预排版重用池图片预解码及预渲染异步绘制及在异步绘制实现时候遇到的坑,推荐阅读。

🐎 @autoclosure what, why and when

Swift 真是门常用常新的语言,如果你之前没用过 @autoclosure(不是 @autoreleasepool),我相信你看完本文后会说「哇,还能这样」。

🐎 Swift 里的原子属性

虽然 Swift 里没有任何语言层面的支持让我们去声明属性的原子性,但苹果平台的框架里却有多种锁的 API,这篇文章就介绍了原子性的定义,各种锁的定义和应用场景,以及通过各种锁实现出来的原子属性。

🐎 减少 ViewController 的继承

这周 Swift by Sundell 的文章尝试着不使用继承去写页面,一个 ViewController 对应一个页面已经成为我们常识,但我们很多时候其实并不需要那些 ViewController 相关的功能,尝试着打破这样常识是改善我们代码的开始。

🐕 How To Make Your Code Readable

代码写得好与坏,很多时候不是跟技巧性有关,其实也是一种产品意识,即使是自己单干,3个月以后看自己如天书般的代码(尤其是带着傻气的算法实现)也往往无法追忆当时的思路,更何况大部分的项目都是团队协作型的,一份代码往往会由多个人负责维护,这个时候代码的可读性和可维护性就显得格外重要了。本文从一个常见的 bad case 出发,一步步展示代码的优化思路,让读者对于好代码和坏代码有一个直观的认识。如果想要了解更多的案例,可以读一下经典书籍《重构:改善既有代码的设计》

🐕 Two Years of Functional Programming in JavaScript: Lessons Learned

本文的作者是一位有着十年以上开发经验的资深的工程师,本文是他在接触函数式编程两年后所获得的心得和体验。首次面对函数式编程应该如何入手;函数式编程的重点不在于monads等晦涩的概念,而在于编写简洁清晰,无副作用的函数;函数式编程在团队协作中应该如何看待;明白刚开始切换到函数式编程时的困难。作者对以上几点都做了很不错的分析和解答。这是一篇值得对函数式编程感兴趣的小伙伴们阅读的好文章。

🐕 Debugging on iOS With Unified Logging System

介绍了 iOS10 新特性标准日志的特性以及使用方式。标准日志会对日志进行基本的分类,并且会附带一些关键信息,所以可读性将会大大增强,建议大家尝试一下。

🐕 iOS视频开发(一):视频采集

本文作者采用图文结合的方式清晰的介绍了 iOS 视频采集的相关概念及视频采集的工作原理,并给出了其在使用过程中的踩到的一些坑,是作为 iOS 视频开发快速上手不错的参考文章。

🐕 Design Ops — A New Discipline

当项目越来越大,参与的人员越来越多的时候,即使在目前很多公司已经做了诸如敏捷开发这样的流程来保证项目的迭代,但或多或少也会面临一些其他问题。例如设计标准的统一,工作流程的冲突,各种质量问题等等,尤其对于一些可能多地协同办公的公司就更加明显。 DesignOps 是一种全新的工作方式,通过这种方式,可以有效协调产品、设计、以及开发人员,通过设计即代码的理念,保证产品从规划、设计、开发、交付整个过程不至于出现流程上的问题,并且提高整个团队的效率。DesignOps 不是一个只存在于理论上的东西,像 Airbnb 团队就已经尝试使用这一工作模式,也有相关文章的分享,有兴趣的同学可以 google 一下。而且,目前国外甚至已经有一些公司开始招聘这个方面的职位了,相信后面会有越来越多的公司开始重视这一块。

工具

iOS 调试线上 app 中 WebView 的方法

在 JSBox 这款工具中提供了一种 Safari 浏览器插件,可以注入 Eruda / vConsole 等知名 web 控制台调试工具,来调试已经上线的 Web 页面。但是面对线上三方 App 就无从下手了。这里介绍一款调试工具 Thor ,以 HTTP 代理的方式修改网页中的内容,插入了调试脚本,从而实现调试已上线 app 中 WebView 的能力。

代码

Awesome macOS open source applications.

Mac 上的高质量开源应用列表,包含大量原生或跨平台的 app,这个 repo 的主要目的是帮助开发者找到免费的开源 app 并贡献代码。这个列表按照功能将应用分为 36 个大类,包括浏览器、通讯、数据库、开发者工具等等,此外还列出了每个项目的开发语言。无论是希望参考代码,还是希望找到优质的开源软件,这个列表都很有价值。

GPUImage3

GPUImage 的作者实在是太高产了。GPUImage3 的 shader 处理部分完全使用 Metal 框架重写了。当然 GPUImage 的 pipeline 还是和 swift2 一样,基于 Protocol,利用 ImageSource 和ImageConsumer 两个 protocol 来处理多滤镜的链接问题。
因为 Metal 的 shader 不是用 glsl 写的。用的是 C++,所以 Brad Larson 也用 C++ 重写了一部分shader 的代码。
如果研究过 GPUImage2 的同学看 3 应该也不会有什么压力。毕竟刨去 Metal 的内容,GPUImage3 和 2 区别很小。

内推

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

这是一家非常年轻的创业公司,充满活力与激情,希望能有更多优秀的人,加入字节跳动,一起让人们看见更大的世界(今日头条、西瓜视频、悟空问答、懂车帝 、TopBuzz、News Republic...),也让更多人的美好生活被看见(抖音、火山小视频、Musical.ly、图虫、Faceu...),我的邮箱 [email protected],或者添加我的微信 jingmu1994 了解更多公司及岗位信息。

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

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

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

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

百度教育事业部招 iOS 开发

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

[上海-加入即刻](https://www....

Read more

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

22 Dec 09:48
Compare
Choose a tag to compare

ios-weekly
老司机 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 那样重度依赖文件管理系统的话,那这篇...

Read more

老司机 iOS 周报 #25 | 2018-07-02

22 Dec 09:47
Compare
Choose a tag to compare

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

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

新闻

2018@Swift 大会来了~

由 SwiftGG 翻译组主办的第三届 @swift 大会将于 2018 年 9 月 15 日在北京举办,大会邀请了来自国内外的重量级嘉宾,旨在为 iOS 开发者带来一场 Swift 的盛宴。现在使用老司机周报的专属优惠码:SwiftOldDriver 报名立减 60 元 。

WWDC 2018 Viewing Guide

useyourloaf 对 WWDC2018 的 Session 进行了一个分类,并附带了少量的延伸阅读指引。

Zeplin 2.0 发布 — 引入组件模块

Zeplin 2.0 发布,带来了全新的 Components 模块、 assets 重命名,全尺寸缩略图等诸多新特性。

随着产品思路的转变,在开发和设计过程中「组件」的有效管理变得越来越重要,而 Componets 模块要做的就是让设计师和工程师更好的共享这些组件。 Componets 模块可以将 Sketch 中的 Symbol 上传到 Zeplin,选中单个组件,数显面板会显示该组件被用于哪些 Screens。

文章

🐕 JavaScript async/await: The Good Part, Pitfalls and How to Use

ES7 引入的 async/await 极大地提升了 JavaScript 的异步编程能力,可以使用同步风格的代码异步访问资源、而不至于阻塞主线程。但要用好 async/await 还是有一定难度的,在这篇文章里会从不同角度探索 async/await,并展示如何正确、高效地使用 async/await。

🐕 Handling mutable models in Swift

当我们能给数据结构的每个属性进行精确、访问权限可控的定义,其他模块就算不了解实现细节,也能从属性本身的定义认识数据结构,同时防止了意料之外的修改。作者权衡了代码的正确性和使用时的便利性,利用 Immutable 的性质和 FRP 的思想来描述数据结构,提升了数据结构的易用性和可维护性。

🐎 Learn Core Graphics with Swift Playground

在以前的一些电子书籍中,我们跑书籍中的代码,一般都需要我们根据指示建立 demo 工程,然后 copy 或者人肉将代码输入到工程中,再运行查看效果。整个路径比较耗时不说,遇到不太专业的书籍代码的版本不清晰的估计得调个十遍八遍的才能跑起来。既然书籍都已经电子化了那能不能让书籍中的代码就能直接在书籍中运行呢?在单一环境中完成整个学习的闭环,意义重大。

近年来,人们陆续通过扩展部分 REPL 的功能部分实现了交互式的教程体验,如 iPython、Jupyter Notebook 以及 Xcode 中的 Playground 等。不过在 Apple 推出 iPad 版的 Swift Playground 后更是把动态的、可运行的交互式教程发挥到了极致,毕竟 iPad 本身就是很多人拿来看电子书的设备。文中作者基于 Swift Playground 写了一本学习 Core Graphics 的电子书,在学习的同时可以交互时的尝试不同的绘图操作并实时查看效果,简直不要太棒!有 iPad 的同学可以考虑重新学习一下 CG,或许会有很多新的收获。

🐕 Airbnb and React Native Expectations

又一篇英文的文章来评论关于 Airbnb 宣布下线 React Native 的事情,作者提出了一个很好的观点,使用 React Native 的人,你希望用 React Native 达到什么样的期望,解决什么样的问题呢? React Native 的最初设计初中真的能符合使用者的预期么? Airbnb 在运用 React Native 的时候,总共提出了 4 点目标,最终这 4 点目标他们完成的并不好,所以才决定下线。那么如果作为 React Native 使用者,你的预期又是什么呢?

作者还针对自身的体会对 Airbnb 的 4 点目标中的 2 点,跨平台与提升开发效率做出了自己的看法。跨平台方面,React Native 确实可以实现一套代码2个平台适配,甚至 Airbnb 在实践中做到包括 Web 在内3个平台适配,但这之中遇到的很多坑也是造就了不满足预期目标的原因,而 React Native 最初的设计初衷是 “learn once, write everywhere” ,当我们预期变成 “write once, run everywhere” 的时候,你是否能 handle 的住你的新预期与新规划呢? 关于开发效率上,Airbnb 因为他们缺乏移动端工程师,使用 JS 技术栈可以最大限度发挥他们前端工程师在移动端的作用,所以他们内部的调研报告里有 60% 的人觉得,React Native 的开发体验非常的 amazing,但如果作为原生安卓/苹果开发者们,面向人群变了,还会是开发体验的一种提升么?

🐎 Upgrading To Swift 4.2

从 Swift 4.1 升级到 4.2 的语法改动不大,主要是一些类型、常量的命名由 OC 的一长串改为按照 Swift 风格的嵌套命名空间。比如 UIApplicationState.active 改为 UIApplication.State.activeUIContentSizeCategoryDidChange 改为 UIContentSizeCategory.didChangeNotification

🐕 DeepLearning 101: Coursera Vs Udemy Vs Udacity

深度学习的热潮在近几年越来越明显,各种框架如雨后春笋般出现,苹果也相继在 WWDC17 和 18 推出了 Core ML 和 Create ML 。除了一些全职的博士/教授等科研人员,广大工程师们如果想系统的学习深度神经网络,最便捷靠谱的途径就是通过参加各种在线课程。作者横向比较了几个目前比较火的深度学习在线课程的不同点,相信能帮助感兴趣的人找到适合自己的课程。

🐢 🚧 ReSwift in Practice

单向数据流是一个经典的设计模式。相比在前端中的 Redux 被广泛接受,在 iOS 端与之对应的框架 ReSwift 则少被人提及,业内对于 ReSwift 在项目中的实践文章也少(因为没人用啊),这篇文章针对在业务中使用 ReSwift 做了一些总结,对于 middleware 的使用也让人颇受启发。

务实的说,大多数团队在项目中引入 ReSwift 并没有太大的价值。它的使用门槛比带来的收益大。但是通过学习这个框架深入理解单向数据流的模式是很有意义的一件事。

🐎 Xcode 小技巧:利用 assets 配置针对不同设备的资源

介绍了利用 assets 中的 Data Set 配置针对不同设备的资源文件的方法。

🐕 Swift vs. Kotlin — the differences in memory management

本文对比了 Kotlin 和 Swift 如何进行内存管理。Kotlin 使用了基于 CMS 算法的垃圾回收,而 Swift 则使用了 ARC。本文没有拘泥于过多底层细节,而是用平白的语言介绍了两者的区别。是一篇入门开发者也能阅读学习的文章。

🐕 What’s New in Swift 4.2?

Raywenderlich 出品的 Swift 4.2 更新内容总结,功能示例代码非常齐全,而且还介绍了 SE-0193 跨模块内联函数的提案以及 SPM 的一些小更新就,目前已有的更新总结文章对于这两个方面提到的比较少,所以可以重点看一下这两个小节。

🐎 Non Empty

在 Swift 里很多时候你明明知道数组不为空,但还是需要为 first 或者 last 之类的属性进行解包才行,更好的方式应该是构造一种非空集合类型去进行约束。

Swift 教学网站 PointFree 最近就开源了一个 NonEmpty 库,通过给集合类型加上一层封装,让我们可以在类型安全的情况下,更加方便的使用非空数组,避免多余的解包。

🐢 帮助你做一个更好的软件架构师

何谓"架构",架构师的工作是什么,这是长久以来大家一直在讨论的问题。本文是作者通过对软件架构的本质的思考,总结出若干条软件架构师必备的技能,从而提出个人的方法论。作者认为对于软件架构师而言,有以下10个点是必须要考虑的

  • 软件设计:在合适的设计模式中选择,并制定出适合团队的方案
  • 方向选择:通过多方面的评估,根据自己的能力选择团队前进的方向
  • 方案简化:最简单的方案往往就是最合适的方案
  • 坚持编码:站在别人的角度看问题会更好
  • 文档:如果可以的话,尽量采用工具自动生成文档
  • 沟通力:好的沟通能力有助于方案落地
  • 前瞻性:具有前瞻性的软件架构生命周期会很长
  • 性价比:制订方案的时候需要考虑方案的投入和收益是否在合理的范围
  • 咨询辅导:通过大量的培训帮助成员提高技术水平
  • 营销手段:高明的营销手段能让大家的目标一致,达到事半功倍的效果

🐢 美团外卖iOS多端复用的推动、支撑与思考

前两年,组件化的话题在iOS业界可以说是非常火。组件的通信解耦方案,是runtime,还是openURL,又或者protocol方案,组件怎么进行包的管理等等讨论的非常多,很多大牛以及公司都给出了自己的答案。我在工作中也在团队中进行了组件化的一些探索。在整个实践过程中,我发现,最重要的其实并不是上面提到的这些,而是对现有工程更好的分层,尤其是对于要支撑部门多个App的场景下,基础库的下沉,如何设计去提高组件的复用程度从而带来整体开发效率的提升,这个在我看来可能是最重要的,而相反的是,这部分的文章并不多。这次美团的这篇文章详细叙述了这一块的实践和思考,我觉得各位在有想法进行组件化的时候,不妨先看下这篇文章。

工具

Test Drive

在 playground 上快速尝试一个 Swift Pod 库或框架。例如使用命令 testdrive Kingfisher,即会新建一个集成了 Kingfisher 的 playground,提升体验各种库和框架的效率。

代码

Sift app - 实时监测手机所有 App 的网络情况

Sift 是一个开源 App,可以监测手机上的所有网络请求,根据规则屏蔽请求,最重要的是:可以作为调试工具,在手机上实时看自己 App 的网络连接状态。

新一代 Swift ORM: Perfect-CRUD

Perfect-CRUD 是基于 Swift 4 以上版本的关系数据库对象管理系统(ORM),采用Swift 4 Codable (可编码)协议映射到SQL类型的数据库表格。其采用了一种丰富多样又简洁明了的表达形式,通过类型模板(Generics)、字段路径(KeyPath)和可编码(Codable)的实现方式来确保编译阶段对数据类型的安全检查。
CRUD 是链式操作的(每个操作的结果都是可以继续作为参考进行下一步操作),它还提供了一个异步的日志系统用于记录错误以及每一条 SQL 语句。
有兴趣的可以到 Perfect-CRUD 下载源码体验一番~

Lynx - 又一个跨平台开发框架

Lynx 是一个使用 Javascript 来构建 Android 和 iOS 应用程序的跨平台开发框架。Lynx 首选 Vue.js 作为开发框架,通过适配也可以使用其他前端框架进行开发。Lynx 是直接使用系统 UI 来进行渲染的,同时也支持使用 CSS 进行排版。据文档介绍,Lynx 不仅保留了类似 React Native 的动态特性和开发体验,还与 Flutter 有着相同流畅的性能体验。目前项目还处于 alpha 阶段,喜欢尝鲜的同学可以跑下工程的 demo 进行体验,对跨平台开发感兴趣的可以持续关注。

ZHNJSBox - 乞丐版JSBox

iOS 内置了 JavaScriptCore(戴铭前辈的『深入剖析 JavaScriptCore』为它作了很细致的分析),这为 JavaScript 与 Native 交互提供了很便利的基础。目前业内诸多跨平台方案,如 Weex 和 ReactNative 的 iOS 版本也都是通过 JavaScriptCore 实现的,还有一些动态化方案,如 JSPatch 等也是基于此。JSBox 是 iOS 上基于 JavaScript 的可扩展效率利器,它的 JavaScript 与 Native 间的通信同样也是依赖于 JavaScriptCore。

ZHNJSBox 是一名 JSBox 深度使用者为研究其实现而写的一个小项目,实现过程记录在了『如何实现一个乞丐版 JSBox』一文中,该文还谈到了实现中遇到的一些技术瓶颈和如何借鉴 JSPatch 和 ReactNative 这类开源框架解决这些技术问题。如果对于如何利用 JavaScriptCore 搭建自己的动态化系统感兴趣,又苦于无从下手的话,这个开源项目是一个不错的入门选择。最后,如果仅是对 JSBox 实现原理充满好奇的话,这里再次推荐钟颖小专栏内关于 JSBox 的几篇文章 - 『JavaScriptCore 与 Promise 那点事』、『使用 JavaScript 来写 Masonry 代码』以及『使用纯 JavaScript 编写 iOS 界面』。

Swift 4.2 功能 Playground 全展示

Ole Begemann 大神出品的 What's New in Swift 系列,使用 Playground 为我们展示 Swift 4.2 的所有新特性,让大家可以直接上手感受。需要注意的是,现在 Swift 4.2 还在开发中,大家要使用的话需要安装 Swift 4.2 的工具链或者使用 Xcode 10.0 beta。

iOS 应用逆向与安全

@Alone_Monkey 的iOS逆向方面的新书,让读者不仅仅局限在各种逆向工具的使用上,而是从全局的角度,从原理的角度,来了解逆向与安全这个领域,并且还因为深入到了程序运行的本质从而加深更多iOS开发方面的理解。全书开篇1-3章,快速上手介绍了一些基础概念,逆向工具的使用。4-6章则全面系统的进行了知识储备与原理进阶。7-8章带着大家进行逆向实战与安全防护。非常推荐对逆向工程有兴趣的朋友们入手学习。

附带知识小集团队 @Lefe_x 的读书笔记一则:《iOS 应用逆向与安全》读后感,方便大家更好的初步了解书的全貌,不过还是推荐入手一本系统性的学习一下。

内推

字节跳动 北京 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

关注我们

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

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

本期编辑

[@没故事的卓同学](https://weibo.com/1...

Read more

老司机 iOS 周报 #24 | 2018-06-25

22 Dec 09:47
Compare
Choose a tag to compare

ios-weekly

新闻

《WWDC 17 内参》免费订阅

去年我们组织针对 WWDC 17 的内容写了 25 篇文章,原来售价 39 元,现在免费开放给大家。

"iPhone Only" apps on the iPad

一个不错的消息,在 iOS 12 beta 2 上,你的 iPhone Only 应用程序将会以 16:9 的比例运行。在此之前,尽管 iOS 10 不再支持 iPhone 4S,但你依旧需要让 APP 能以 3:2 的比例运行在 iPad 上。

苹果键盘维修计划

苹果确认 MacBook 的蝶式键盘出质量问题,开启键盘维修计划 ,如果你的苹果笔记本出现了诸如字母或字符意外重复/字母或字符不出现/按键感觉粘滞或按键反馈不一致,并且符合维修计划覆盖的机型范围,请预约去 Genius Bar 进行维修。

重磅!Google发布Flutter Release Preview 1

在 GMTC 2018 大前端大会上,Google Flutter 高级工程师于潇宣布 Flutter Release Preview 1 发布,这标志着 Flutter 进入了一个新阶段。同期还发布了基于 VSCode 扩展等辅助开发工具。Flutter 一直在不断地进步,并且得到了来自全世界社区的支持。

文章

🌟 🐢 WWDC2018 - 来自一线开发者的技术笔记

头条客户端团队针对 WWDC 2018 写了 15 篇技术笔记,有些是 老司机x知识小集xSwiftGG WWDC 18 专题目录 没有覆盖的。可以看看目录挑选自己感兴趣的看看,一定不会让你失望。

🌟 🐢 What’s Next for Mobile at Airbnb

对于 ReactNative 社区来说,上周两大事件值得关注:Facebook 宣布对 ReactNative 底层进行重构;Airbnb 宣布放弃 RN 并连发了五篇 blog 来解释。

  • Part 1: React Native at Airbnb
    讲为什么 Airbnb 在 2016 年决定投入 RN,比如 比拟原生体验代码可以跨平台提升开发体验 等。

  • Part 2: The Technology
    着重写 RN 在技术层面的一些优劣,优势:垮平台、迭代速度、与 Native 代码桥接方便等,劣势方面:因 JS 无类型导致不好重构、JSCore 在双平台的不一致性、App 体积、RN 初始化及首次渲染时间等。

  • Part 3: Building a Cross-Platform Mobile Team
    从团队管理角度来讲引进 RN 之后带来的一些问题:要用好 RN 开发者还需要懂 Native,这种混合对招聘、测试、迭代都会带来很多挑战。

  • Part 4: Making a Decision on React Native
    由于 RN 在技术方面的一些问题及对团队带来的挑战不能很好的解决,Airbnb 决定 Sunset RN,停止用 RN 开发新功能,逐渐转向 Native。对于开源,他们会将一些项目转到 react-native-community。

  • Part 5: What’s Next for Mobile
    讲 Airbnb 在移动方向的未来,介绍了 Server-Driven Rendering,还有努力推进的 EpoxyMvRx 等项目。

🌟 🐢 On Apple's Love Affair With Swift

标题读起来有点困惑? 不过这不重要, 文章内容和这个标题关系不大。之前一位名叫 Dominik Wagner 的博主写了一篇 diss Swift 的文章, 本文的作者通过从之前 Chris Lattner 在一个 Podcast 接受采访的观点中有针对性的摘抄了一些,来对 Dominik Wagner 的观点进行了回应。于是有了本文。

Swift 不只是一门多了面向协议能力和静态类型的语言,要了解 Swift 的诗与远方,还是要多看看 Chris 发表的,关于 Swift 的设计的一些观点, 比如这篇博客。里面解答了诸如为什么要发明 Swift,而不是简单把 OC 变得更好等核心问题,当然也包含一些有趣的观点,比如 Chris 说明了 Swift 的 functional 的特性大量参考了 Haskell,这些从 Haskell 参考的概念也成为其他高级特性的基础(如面向协议)。以及 Swift 并不只是成为一门新的 Cocoa 编程语言,而是对标 C 和 Rust,成为更好、更安全的系统编程语言。

笔者看完后竟然有一丝感动,仿佛感受到了 Chris 在设计与迭代这门语言上的思考与倾注的各种努力,通过一个又一个巧妙的方式把种种先进的理念汇集到一起,make things happen。恍惚间觉得什么 ABI 稳定,Playground 崩溃,Source Intellisense 崩溃都是浮云, 这是一门虽然年轻但未来潜力无限的编程语言, Let's make Swift great again!

🐕 🚧 Maintaining Productivity as Engineering Teams Scale

早早的时候《人月神话》里就指出了:往一个延迟的项目里添加人手只会拖慢项目的进度。那么随着业务增长,开发人员也越来越多后要如何保持团队的效率要解决什么问题呢?文章给出了极富建设性的意见。

  • 花时间偿还技术债,否则往后会越来越拖累开发进度
  • 随着用户的增加,避免工程师陷入解决客服、运营的问题,分散开发精力
  • 关注“老人”的价值。随着新同事的加入,“老人”还额外承担了介绍项目情况,说明某个功能对业务的价值。这个过程中要理解“老人”自身的开发进度可能会变慢。
  • 技术人员的职能分化,有些人可能倾向于往管理岗发展,有些人适合技术专家方向
  • 注重沟通效率。团队人数少于十人的时候什么事在饮水机旁边可能就讨论完了。人数增加后则要注重如何有效的沟通,有的团队也可能都不在一个办公地点。同时这个环节也体现了高质量文档的重要性。

🐕 [译] 怎样(以及为什么要)保持你的 Git 提交记录的整洁

作者通过日常工作中常用的 4 个 git 使用场景,向读者解释了为什么要保持 Git 提交记录的整洁,以及保持 Git 提交记录的整洁的方法。建议读的时候跟着作者的思路操作一遍,更能加深理解!

🐕 Create ML Tutorial Getting Started

Raywenderlich 家出的 Create ML 入门教学,手把手教你用 Craete ML 和 Turi Create 构建一个通过图片分辨猫狗的机器学习模型,体验过一遍以后大家可能对 Create ML 这门框架,并且国内有开发者已经翻译了这篇文章,感兴趣的同学可以考虑跟着文章体验一次机器学习模型的训练过程。

🐎 iOS中的图片使用方式、内存对比和最佳实践

在 WWDC2018 的图像最佳实践中,苹果为我们介绍了一种缩放图片的方式。本文则是对这个议题进一步探究,研究了三种创建UIImage的方式所占用的内存大小,结论是苹果官方提供的方式占用内存最小,推荐大家使用。

🐕 Using generics and descriptors to standardise icons, images and placeholders on iOS

通常应用里的图片占位图只有少数几种样式,如果粗暴的使用继承来复用不够灵活。本文介绍了利用泛型约束来进行图片配置。我个人认为这个实现方式清晰且安全,值得借鉴。

🐢 2018 年主流 RSS 服务选哪家?Feedly、Inoreader 和 NewsBlur 全面横评

在我们已经有了公众号、QQ/微信群、直播平台等各种技术社群的集中式服务时,RSS 是否还适合技术人员?唐巧在3月25日的博客是这么说的

我之前做 iOS 开发,白天上班完成公司的需求,晚上就自己研究一些技术细节,写一些总结的博客。每年的 WWDC 视频,我都坚持看完并且写一些总结笔记。我还用 RSS 订阅了很多 iOS 国内外的博客,平时和周末没事就翻来学习。

可见,在信息高度过载的今天,RSS 无疑发挥了一个「聚合器」(aggregator)的作用,帮用户抓取各个高价值订阅源的更新。但各家 RSS 服务之间的区别性其实很高,最终阅读体验也大相径庭。此外,目前绝大多数的 RSS 服务都是有收费选项的,要不要付费、付费给谁也是需要考虑的问题。为此,本文挑选了几家有代表性的 RSS 服务进行对比,分析各自优劣,希望能帮读者做出最适合自己的选择。更多的时候,RSS 是一种学习习惯,而 RSS 服务就是学习的工具。工具好不好用,关键还是要看主人。

P.S. 国内的 RSS 源数量正在逐渐减少,这里吐血推荐一个基于多人协作式开发的 RSS 生成器,毕竟没有池塘哪有鱼,对嘛!

🐎The Problem You Solve Is More Important Than The Code You Write

You are not a Code Monkey paid to write characters on a screen.

作为研发,可能会认为,产品业务的方向、需求应该仅仅是 PM 们需要考虑的事情,而我们只需要通过代码完成一个又一个的需求,但事实真的是这样吗?在 coding 过程中,我们可能常常执迷于代码写的漂不漂亮,接口设计符不符合 DRY 原则等等。当然,这并没有什么不对,只是,似乎我们忽视了一个问题,那就是,我们的每一行代码,最主要的目的是为了解决问题,或者说,为所在公司、团队创造价值。本文虽然没有介绍任何技术相关的东西,但可能比很多技术文章更值得技术人员去看一看。

PS:文中举的蓝牙解锁的例子,实际上我觉得无匙进入比按个按钮解锁在技术上难实现的多(手动滑稽)

设计

🐎 How Apple can fix 3D Touch

作者认为目前 3D Touch 的体验有待改进,用户无法区分普通按钮与支持 3D Touch 的按钮,只能不断尝试然后记住那些支持 3D Touch 的按钮。所以作者认为 3D Touch 按钮应该在视觉上加以区分,例如在右下角加一条短线。

代码

MessengerKit

MessengerKit 使用 Swift 编写,是一款基于 UICollectionView 的消息 UI 框架,可以方便地搭建类似 iMessage 的界面。它内建了可自定义的主题,你可以根据示例来快速地构建符合你应用 UI 的消息对话框,值得一试。

StyledTextKit

StyledTextKit 是一款支持后台渲染和 LRU 缓存的富文本框架。在 iOS7 之前,UITextView 由于使用了 UIWebView 导致性能十分差,虽然后来苹果给出了 TextKit 框架,但是所有的渲染和尺寸计算依旧还是在主线程。所以 GitHawkApp 的开发者自主开发了 StyledTextKit 这个富文本框架,用于含有大量富文本的列表。在子线程中计算背景大小及文本内容渲染,保证在滚动大量文本的时候依旧十分流畅。

内推

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

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

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

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

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

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

百度教育事业部招iOS开发

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

关注我们

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

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

本期编辑

@没故事的卓同学@四娘@mmoaay@享耳先森@EyreFree@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal@叶孤城@aaaron7@方秋枋kyotom510230anotheren

说明

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

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