Skip to content

Releases: SwiftOldDriver/iOS-Weekly

老司机 iOS 周报 #52 | 2019-01-14

14 Jan 03:29

Choose a tag to compare

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

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

新闻

GitHub 宣布创建私有仓库免费且不限量

微软在今年 6 月收购了 GitHub,而在半年后,它给广大开发者带来了第一个福音 - 私有仓库转为免费且不限量。但值得一提的是,私有仓库目前最多仅支持 3 个协作者,如果超过 3 个,仍然需要购买付费服务。

另外,在个人主页,GitHub 还在本周更新了一个小 feature - 个人主页的状态管理。我们可以在自己的主页为自己设置状态,包含一个 emoji 以及一句描述。

推荐人:tyrad

Flutter 示范应用现已开源 — 万物起源 (The History of Everything)

在本月初举办的 Flutter Live 活动上,Flutter 团队向大家展示了一款名为 The History of Everything(万物起源)的应用,向大家展示了 Flutter 的精美的界面和优秀的性能,现在这款应用的源代码已经在 GitHub 上开源。这款应用不仅突出了 Flutter 的强大,也展示了如何高保真的还原设计师设计并保持原生的应用体验。它构建了一个精美的时间轴,你可以上下滑动以及任意缩放整个时间轴,时间轴上的历史事件会随着缩放跟着消失或者出现。

他们的 2018 年总结

2019 已经过去了2周,相信小伙伴们对于 2018 年都有自己的总结。本期同样也为大家带来了小伙伴的年终总结,希望对大家有所帮助。往期 2018 年总结可以查阅 50期51期

文章

🌟 🐢 It Looks Like You Are Trying to Use a Framework

Frameworks 是打包资源和拆分代码的常用方式。拆分 Frameworks 的作用不仅仅是避免构建时的重复编译,合理的使用 Frameworks,可以让代码库层次清晰,提升调试效率,确保代码结构保持最大的可重用性。

第一篇文章 包含 Frameworks 相关的基础知识:

  • 静态库
  • 动态库
  • Frameworks 及其内部结构
  • 在 Xcode 中链接和嵌入 Frameworks
  • 使用 Frameworks 前要考虑的因素
  • 一些方便探索 Frameworks 的命令行工具

第二篇文章 则引导我们在逐步解决构建错误的过程中理解 Frameworks,还会介绍 Swift 和 Objective-C 混编时接口间是如何找到对方的。

🌟 🐕 The Complete Guide to iOS and Swift Job Interviews

这篇文章的作者是 Hacking with Swift 的创始人,文中分享了 iOS 程序员找工作的一些心得,值得注意的是,现在 iOS 招聘一般都要求熟悉 Swift 相关知识。

  1. 日常做好一些找工作的准备,譬如写播客,参加外部的技术交流,参与 GitHub 项目等
  2. 写一份好的简历,让人知道你过去的工作经历和价值,注意,复制粘贴和假大空的文字描述一点用都没有
  3. 准备面试,一般最好刷一些面经,也要做好手写算法的准备
  4. 面试时平复好紧张的情绪,越紧张越回答不上来问题
  5. 一般公司的面试题在网上都可以看到类似的,不用过于担心
  6. 初级工程师和高级工程师的面试侧重点有些不一样,不过尽可能地展示一下你的知识深度是没错的
  7. 编码能力现在在面试时都考察得比较多,千万不要轻视这个事情
  8. 每次面试都做好总结,让自己在面试中成长

🐕 开发者如何突破那被限制的视野

尽管作者的一些观点可能值得商榷,但更多的可以给我们一些指引。文末作者的高度提炼,“输出倒逼输入, 只有你真正知道自己要做什么了, 你学习的方向就会变的异常明确”,更是发人深省。

  1. 自我接纳,这是精准学习的前提
  2. 技术储备,要认识到技术只是一个工具,而工具是可替换的
  3. 动手实践,转换视角,学以致用

🐎 为什么我觉得 Flutter 短期内不会流行但依然选择学习它

最近 Flutter 的文章越来越多了,也有越来越多的人去尝试了 Flutter。有更多的人参与到 Flutter 生态中来,对 Google 来说,对 Flutter 团队来说都是一件乐见之事。

本文作者在自己尝试了 Flutter 的基础上,详细说了自己的开发体验,也说了自己对 Flutter 的观点。对于还没尝试的同学来说,本文可以提供一个初步的了解。

🐎 Swift: memory leak gotcha with 'weak self'

这是一篇挺有意思的文章,讲述的是在 Swift 的 closure 多层嵌套中,何时建立弱引用而有可能出现的问题。

相信这个问题,有很多人之前曾经遇到过,或者说曾经思考过那样的情况应该怎样处理。有兴趣的同学们不妨阅读。

推荐人:ApolloZhu

🐎 The iOS Menu & Detailing the iOS Menu

这两篇系列文章讲述了 Codea (ipa lua 编辑器) 作者在 iOS 上设计一个 macOS 风格的下拉菜单。文章中,可以了解到作者一步步的思考过程,以及相关的技术细节想法,例如:毛玻璃效果,贝塞尔绘制圆角,选择交互动效果等等。同时,代码也[开源]了。(https://github.com/TwoLivesLeft/Menu)

推荐人:ApolloZhu

🐕 State Restoration Tutorial: Getting Started

State Restoration(状态恢复)是在应用重新启动时恢复到上一次结束时的状态。当 APP 切到后台,很难保证应用不被用户或系统杀掉。在 iOS 6.0 中,Apple 为我们提供了 UIStateRestoration 来实现应用状态的保持和恢复。

本文作者通过实例 Pet Finder 向我们展示了应用如何实现状态恢复,主要有以下几个步骤:

  1. AppDelegate 中实现 shouldSaveApplicationStateshouldRestoreApplicationState
  2. 设置 views 或 view controllers 恢复标识符 Restoration ID。
  3. 在需要恢复的 views 或 view controllers 中 实现 encodeRestorableStateWithCoderdecodeRestorableStateWithCoderapplicationFinishedRestoringState 并处理相关的恢复业务逻辑。

另外文中作者也给出了恢复基于代码创建的 view controllers 实现方法,状态恢复尤其适用于恢复用户草稿状态的业务场景,有兴趣的读者可以实践一番。

原文中提供的 Demo 基于 Xcode 7.3、iOS 9.3 和 Swift 2.2,在 Xcode 10 中编译 Error 99+,编辑在实践中已对 Demo 进行更新,支持 Swift 4.2。值得注意的是 applicationFinishedRestoringState 是在 viewWillAppear 之后执行,很多资料对此描述有误。

🐕 ARKit Pods — SCNPath

很多 ARKit 开发者的首选框架是 SceneKit,因为 SceneKit 可以访问 iOS 的原生功能。SceneKit 提供了一些默认的几何体,SCNBox、SCNSphere、SCNPyramid 和 SCNShape,但如果你想构建点不一样的东西,就要深入钻研来创建自己的几何体了。作者最新的开源框架用于根据 SCNVector3 点数组来创建路径,在这篇文章里作者用一个实际的例子介绍了如何利用开源的 SCNPath pod 来创建路径。

🐕 Swift Import Declarations

本文中讲述了 import 在 Swift 中的使用。

  • 如果 import 复数 module 中有重复的字符,可以使用 ModuleA.func ModuleB.func 来区别调用。
  • 可以指定引入某个 Module 的单一方法、变量等,如:import func Module.funcA(第二个为 funcA 类型)。
  • Swift 同名处理优先级:本地声明 > 引入指定声明 > 引入模块。
  • 引入模块中常量,变量的时候,最好使用 import type Module.var 的方式,更好让其理解作者的意图。
  • 引入子模块 import Module.subModule,以防止其他子模块的影响,明确使用范围。(但是并不会是你的程序更快的编译)。

🐕 [NSMutableAttributedString initWithData:options:documentAttributes:error] 崩溃分析

本文从汇编的角度,逐步定位了 NSMutableAttributedString initWithData:options:documentAttributes:error 概率崩溃的问题,其定位问题的过程、思路和方法值得借鉴。另外文中提到的 优雅解决 iOS 8 UIScrollView delegate EXC_BAD_ACCESS 中的方法也推荐参考。

🐕 Why is there a "lag" in iOS gesture detection near the edges of the screen?

作者分享了一次排查屏幕边缘手势延迟 bug 的过程,小编觉得这个 bug 非常有意思,很值得大家花一些时间去了解它,让大家对手势有更多一点了解。

🐎 App thinning checklist

本文作者总结了他对 iOS 版的 Microsoft Edge 进行安装包瘦身时所用到的一些思路、方法和工具,各位可以收藏以便需要做应用瘦身时拿来参考用。文章中提到把监控包大小加入到持续集成环节中是非常值得去实践的一种做法。

🐕 饿了么物流移动端业务可用性监控体系建设

本文介绍了饿了么物流团队在移动端业务可用性监控体系建设上的一些探索和实践,这为有在做可用性监控体系的朋友们提供了一些很好的参考方案和思路。他们把监控体系大致分为了四层,从大盘趋势到异常实时告警以及使用日志进行现场还原,同时还可以通过大数据分析业务健康程度。之后分享了一个排查网络层问题的实战经历来说明这套监控体系的价值。在文末他们提到了一些目前遇到的问题和接下来的发展方向。

🐕 Implenting Promises in Swift

目前网上很少有 Swift 实现 Promises 相关的文章,所以作者写了一篇文章分享了相关的内容,并且作者选择了测试驱动开发,不断地构建测试,然后再不断地调整代码满足测试,非常值得一看。

🐕 How to read Apple’s developer documentation

阅读技术文档是工程师必备的技能之一,但很有趣的是,阅读技术文档不只是国人入门编程的一道坎,其实很多以英语为母语的人也一样不擅长。Swift 技术网站 Hacking With Swift 过去一年收到最多的文章请求,就是帮助读者阅读和理解苹果的代码文档,所以就诞生了这么一篇文章。

作者首先帮助大家理清技术文档的内容和结构,接着以具体的例子带着大家一起“查文档”,找到对应的定义,例子和代码,最后还鼓励大家,其实苹果的文档也有很多不足的地方,大家找不到自己需要的东西的时候也不需要灰心。

🐢 The Many Offline Options for iOS Apps

本文作者比较了 iOS 中的各种存储数据以达到 App 无网正常使用的方案,根据统计,如果加载速度超过 3 秒,有 40% 的用户会放弃使用。而在美国,有 15% 的 App 使用时间是处于无网状态下。因此,一个合理的离线运行方案将会为你的 App 带来更高的用户留存率。

  • 使用数据库:Realm、Core Data、Sqlite 等
  • KV 形式存放数据:plist、NSUserDefaults、NSKeyedArchiver、leveldb 等
  • 使用云数据库方案:Realm Platform、Firebase 等
  • 考虑一下将用户离线下的操作重放
  • 通过 React 的方式来监听数据变化

工具

iOS 模拟器录屏工具

Xcode 的模拟器自带有截屏功能,但是并没有录屏功能,通常我们需要使用其他的录屏工具(QuickTime、LICEcap等),但这个工具让你可以方便地直接使用 Alfred workflow 或者 CLI 去触发模拟器录屏。

代码

CoreML-in-ARKit

本项目利用 CoreML 运行机器学习模型来识别出摄像头拍到的物体,并利用 ARKit 为其加上 3D 标签,实现简单的 AR 效果。项目代码简单,创意好,非常适合入门,学习如何使用机器学习模型处理图片及如何在 AR 场景中添加 3D 标签。苹果官方也推出了一个类似的官方 Demo:Using Vision in Real Time with ARKit,供大家参考学习。

iOS 混合开发库(GICXMLLayout)

很多尝试过前端开发 Vue 开发的 iOS 同学,都感慨用 Vue 开发前端 UI 界面的时候,非常的方便,非常的强大。优秀的布局能力/数据绑定 MVVM/模板式的开发。如果能在 iOS 里也能如此方便的进行UI开发,相信也会大幅度提供页面开发效率,GICXMLLayout 这个库就是这样的一个库。

GICXMLLayout 能干什么?有什么特点?

  • 使用 XML 来描述 UI、动画、事件绑定、数据绑定。
  • 数据绑定。
  • 支持 MVVM 模式。
  • 优秀的布局系统。
  • 模板系统。
  • 简单、优秀的自定义扩展能力。
  • 支持 JavaScript。
  • HotRload & HotUpdate。

相关系列文章推荐去作者的掘金专栏, 作者从项目简介,到源码架构,再到新手项目,灵活扩展,还有两篇项目实战,总共有八九篇文章深入解析 GICXMLLayout,值得深入学习。

音视频

🌟 一起来开发泊学 App 吧

如果你正在自学使用 Swift 做 iOS 开发,并期望找到一份相关的工作,但却苦于没有项目练手和熟悉整个 App 的开发流程。或者你十分向往成为一个独立开发者,但又不知从何开始。又或者你想看看 Swift 充当服务端开发语言时会有怎么样的表现。那小编十分推荐你看看泊学上的这个系列视频,你得到的会远比一些培训班得到的多。目前已经推出以下 4 个系列,且内容仍在持续更新中:

  • 设计 iPhone 版泊学 App:基于 Apple 官方的 iOS design guideline,我们用 Sketch 从零开始设计泊学自己的 iOS App。在这个真实的项目中,了解 Sketch 的使用经验和常用插件。
  • Vapor Up and Running:如果,你已经掌握了 Swift 编程语言,再用它学习服务端开发,就变成了一个性价比很高的事情。这个系列里,我们会从零开始,基于 Vapor,详细地讲述每一个服务端开发领域常用的技术场景。
  • Vapor Fluent:在这个系列里,我们会实现一个类似论坛的App。通过这个过程,来了解Vapor中的Fluent组件。通过它,我们就可以无需了解SQL的细节,而是用Swift的方式和数据库打交道。
  • 基于 MVVM 构建泊学 App:在这个系列里,我们以实现 Boxue App 举例,以一个独立开发者的视角,尽可能在代码的可维护性、可测试性、可重用性以及可协作性,达成让自己满意的实践。

🌟 Teahour.fm | #94 与 Hawstein 和左程云聊算法和数据结构

这期的 Teahour,讲的是很多程序员很关心的算法和数据...

Read more

老司机 iOS 周报 #51 | 2019-01-07

07 Jan 06:44

Choose a tag to compare

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

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

新闻

iOS 靠谱内推专题

号外号外~这里有一份靠谱的 iOS 内推职位列表,希望能给大家在这个裁员寒冬带来一点暖意。

他们的 2018 年总结

在看完 50他们的 2018 年终总结,相信大家都有所收获。本期同样也为大家带来了一些小伙伴们自己的年终总结,希望这些总结能够帮助到大家。

文章

🌟 🐢 Understanding Xcode Build System

本文介绍了Xcode Build System的各个部分,帮助我们提升对于 Xcode 编译的基础知识。很多的包体积减少方案也是基于这个基础知识之上,对于 iOS 开发人员来说很有必要了解

  1. Preprocessor(预处理):这个阶段处理一些语法糖的东西,譬如一些编译宏的展开
  2. Compiler(编译):将 Swift 工程编译成一个中间语言,一般采用两个编译器,一个是 Swift 语言编译器,一个是 OC、C++/C 编译器(为了解决混编的问题)
  3. Assembler(汇编):将中间语言统一转成操作系统能理解的二进制代码
  4. Linker(链接):将一切依赖的外部库加入到二进制包中
  5. Loader(装载):变成一个可执行程序,添加程序执行的入口,以便操作系统能够直接跑起来

🌟 🐎 OCEval - 动态执行 ObjectiveC 的热修复方案

苹果在18年多次对基于 runtime & JavaScriptCore 的热修复方案进行全面的打压,导致 JSPatch 以及其混淆 or 变种,变得难以过审。但是本文作者依然在热修复的探索上寻找并实现了一条新的方案 OCEval。OCEval 的本质是作者自己实现了一个 OC 语法的简单解释器,包含了基础的词法分析与语法分析,从而能够在运行期将 OC 代码生成抽象语法树 AST 然后进行执行。这样就可以将OC这种原本必须经过编译再运行的语言,扩展为 js 那样的解释执行,从而能够做到动态下发代码并且运行。同时再通过 runtime 进行 aspect 那样的 hook 操作,实现热修复线上代码。整个代码都已经开源,对编译原理有兴趣的同学值得深入好好学习一下。

🐢 [App 探索] JSBox 中幽灵触发器的实现原理探索

JSBox 中有一项奇特的功能 - 幽灵触发器,它在 App 进程被杀死的情况下,也可以将通知固定在通知栏,即便用户点击清除,也能马上再弹出,永远不消失。本文作者通过一系列的实践研究分析了这个 “幽灵触发器” 功能的实现原理,最终以 Demo 的形式给出了一个可行的实现方案,希望对感兴趣的读者提供帮助。

JSBox 是由钟颖开发的一个提供 JavaScript 集成开发环境的 iOS 应用,可以通过它来构建各种有趣的效率工具,其中有很多巧妙的功能实现值得我们研究探讨。

🐢 10w+ 字详解 Runtime

如题,本系列 Runtime 文章总共九篇,总字数为 10w+。一个技术要点能写 10w+ 不容易,能把一个技术要点循环渐进、细致确当、系统全面地讲清楚,真正做到一个系列搞定,足见作者的匠心。如果不想再被 Runtime 题材的文章“碎片化”,那就从这里开始吧!

🐎 技术年货:美团技术沙龙合辑大放送——85 个演讲,70+ 小时视频

虽然美团近期在面临裁员风波,但不可否认的是美团是国内对技术分享做的最好的公司之一了。本文详细整理了今年所有线上线下美团技术沙龙的演讲稿和视频,覆盖前端、后台、系统、数据、算法、测试、运维等技术领域。这份“饕餮盛宴”必然会深受追求卓越的同学的喜爱。

🐎 How to use raw strings in Swift 5

当字符串应用于正则或初始化 JSON 等场景时,转义字符会给我们带来一些小烦恼。比如试试查找 \(sth) 的正则如何实现?
Swift 5 中,新增了 Raw String 语法(用井号包裹,#"raw string"#), 通读本文,可以快速了解 Swift 5 中的原始字符串该如何应用。

扩展阅读:SE-0200

🐢 iOS 性能优化之计算多行 Label 高度的新方法

本文中“根据字体来计算字符串总宽度,从而得到多行 Label 高度”的想法,也比较新颖,网上也没有找到资料,但是某些读者日常开发中可能会碰到,本文比较系列的从发现问题到解决问题进行了阐述。如果这篇文章能够给读者们造成一些启发,也能够让这篇文章发挥价值。

🚧 🐎 Swift CoreNFC as quick as possible

正如标题所写的,这是一篇快速使用 CoreNFC 的教程。本文总结了使用 CoreNFC 的主要流程和一些需要注意的细节。文章内容足够用来了解 CoreNFC 了,但如果想感受或者弄清一些细节,最好还是实践一下。

设计

🐎 [译] 色彩无障碍性产品设计指南

数字产品的无障碍设计旨在为所有人提供精致的使用体验,这些人包括有视觉、语言、听觉、身体或者认知障碍的人。关于无障碍设计的讨论有很多,但你是否想过色彩的无障碍设计?这篇文章会介绍如何使用你已经知道的设计原则来进行色彩无障碍设计。

工具

少数派 2018 年终盘点以及编辑推荐

本统计中列举了这过去一年里,文章,APP,编辑的受欢迎的榜单。在这份年终报告中,我们可以看到一些耳熟能详的应用,也看到一些我们并没有留意到,但别人很喜欢的应用。各位童鞋不妨看一下 2019 是否有适合你新应用。

AssetImportKit

AssetImportKit 是一个用 Swift 编写的跨平台库(macOS、iOS),可以在运行时将 Assimp 支持的文件转换为 SceneKit 场景。

Mach-O Kit

Mach-O Kit 是一个 Objective-C 框架,用来分析 Darwin 平台的 App 所使用的 Mach-O 二进制文件。Mach-O Kit 简单易用,并且是安全的,即使解析一个格式错误的 Mach-O 文件也不会导致程序崩溃,可以放心使用。

代码

DynamicJSON

DynamicJSON 使用了 Swift 4.2 中引入的新特性 @dynamicMemberLookup 来实现 JSON 数据的快速访问。相比传统方式,你不再需要使用方括号和双引号。

音视频

ggtalk | 创业那点事:普通开发者的回忆、反思和迷茫

这是 ggtalk 创业系列的第二期,从在创业公司工作过的普通开发者的口中了解对于很多工程师而言,在创业公司是一种怎样的感受, 主要由翻译组的梁杰、珂珂和 MM 来做分享。其中最典型的,就是个人发展和公司发展频繁的冲突和变化。公司业务经常变化,虽然能够磨炼工程师不断的接受新的挑战,但也会造成无法在某一个细分领域不断深入。工程师在类似的境遇下该如何权衡,如何选择,相信大家听完这一期节目,会有新的感受。

Typed Notifications

通过 Notification 时其中一个问题就是发送方跟接收方都必须通过约定去传值,Swifter Talk 这一集就探讨了如何通过类型化 Notification ,统一使用对应类型的 Descriptor 去完成 payload 的编码和解码,去完成一套类型安全的通知系统。

内推

关注我们

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

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

本期编辑

@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@Parsifal@aaaron7@kyo@tom510230@anotheren@水水@looping@老老老老老老老驴@小非86@邦ben@红纸@含笑饮砒霜@JimQ@XanderXu@老峰@zvving

说明

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

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

老司机 iOS 周报 #50 | 2019-01-02

02 Jan 03:39

Choose a tag to compare

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

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

新闻

🌟 我们一周岁了~

这是周报成立一周年的第 50 期,也是我们新年的第 1 期。过去 2018 年里,在编辑团队的努力和大家的支持下,我们达成了以下几点小成就:

  • 一共连续为大家贡献了 49 期周报
  • GitHub 累计获得 2000+ star
  • 掘金账号 收获大家 8500+ 关注,近 2400 次获赞,平均每篇约获赞 40 次,总阅读数约 12.5w,并从近一个月开始尝试不定期推送沸点
  • 微博话题 #iOS 周报 共 188w 阅读
  • SwiftOldDriver 精选 发表 23 篇文章,获得 255 个订阅
  • 联合兄弟团队 知识小集SwiftGG 翻译组 共同参与了掘金 WWDC 2018 专题活动,并在近期组织了 iOS 再就业联盟
  • 周报编辑团队也不断成长,目前已有来自一线 iOS 开发的 28 位伙伴加入我们

另外,我们在 12 月初向大家发起了问卷活动,收集大家对周报的建议和希冀,目前我们正在整理和汇总,并尽快在最近几期周报中根据建议作出调整。祝愿周报在 2019 年和大家一起继续成长~

🌟 老司机周报x知识小集xSwiftGG:iOS 内推职位召集

最近很多公司的裁员的消息相信大家都有所耳闻,与此同时也有不少公司逆势而上在持续招聘技术人员。因此我们三大组织决定牵头收集一些可靠的招聘,元旦结束后在我们的资讯发布渠道上发布 iOS 内推职位专题文章

🌟 他们的 2018 年总结

2018 已经悄然离开,2019 已经站在我们面前。这一年,相信大家都有收获,也有过遗憾,这都是常事。下面几篇文章,是几位小伙伴自己的年终总结或者是 2018 年 iOS 的技术发展总结,相信看了他们的总结之后,大家也会有所收获。

文章

🌟 🐢 The Layer Cake

Flutter 现在有多火,相信已经无需多说。尤其 1.0 版本发布后,各个厂也都有在进行先关的调研,不少已经在实际项目中使用了。之所以选择 Flutter,一方面是因为跨平台,另一方面我相信很大一部分原因是因为其高效的渲染性能。相信很多同学对 Flutter 如何进行渲染的也比较好奇,本文讲了 Flutter 的渲染层级及如果工作的,并且在处理负责视图结构中如何保持高效。本文对于正在学习或使用 Flutter 的同学,在思考 Flutter 的架构以及性能的优化等问题上,会很有帮助。

🐕 Advanced UIView shadow effects using shadowPath

虽然扁平化设计的 iOS 7 舍弃了大量的阴影,但最近几年阴影正在不断回归,以增加界面的深度。谨慎地使用阴影可以对 UI 中的内容进行区分、增加深度、吸引用户的视线。这篇文章介绍了用阴影实现的几种效果,全部通过操作图层属性实现。这些效果有的很简单有的很复杂,希望它们可以激发你的创造力!

🐎 A guide to writing your own iOS CI/CD integration script

FastlaneJenkins 是构建 CI/CD(持续集成/持续部署)工作流的常用工具。本文另辟蹊径,不使用第三方工具,只基于苹果的基础工具链构建一个包含编译、测试、检查代码覆盖、签名、分发等相对完整的 CI/CD 工作流。
如果你还不了解 CI/CD 原理,不妨对着本文做一遍,相信可以快速掌握其运行过程。

🐎 ISO-8601, YYYY, yyyy, and why your year may be wrong

小写 yyyy 是我们常用的格式化日期 参数,如果误写成大写 YYYY,会有什么问题?
大部分情况下,它们似乎没有区别,但在每年的最后一周,YYYY 又会给我们带来意外的结果。
本文作者将带你了解 YYYY 对应的 ISO 周日历,从而真正理解它们的不同。

🐎 系统学习 iOS 动画之一:视图动画

动画制作很有趣,可以为用户界面注入活力。如果使用得当,动画还可以向用户传达信息,并将用户注意力吸引到界面的重要部分。

作者学习《iOS Animations by Tutorials》系列笔记共 7 篇包括如下几部分内容:视图动画自动布局动画图层动画视图控制器的转场动画3D 动画其它类型的动画等。

本文是作者系列笔记中的第一篇,文章以实例的形式由浅入深的讲解了弹簧动画、过渡动画、关键帧动画的实现过程。推荐对动画感兴趣的读者跟着教程实践一遍,相信你会有收获。

🐎 函数式编程 - 酷炫 Applicative(应用函子)Swift 描述

函数式编程中,三个核心概念分别是 Functor,Applicative 和 Monad。其中,讲 Functor 和 Monad 的资料都不少,但 Applicative 一直都处于一个爹不亲娘不爱的地位,属实尴尬。核心原因还是其应用范围比较有限。本文以 Swift 语言为载体,介绍了 Functor 和 Applicative 的基本知识,讲述的方法借鉴了函数式编程领域教学中比较经典的“盒模型”,没有复杂的数学概念,算是比较不错的入门教材。最后还找到了一个 Applicative 的应用场景作为例子,对函数式编程感兴趣的同学可以仔细阅读,虽然 Applicative 的应用范围比较狭窄,但对于一些细分领域的问题,的确可以构造出非常优雅的解决方案。

🐎 『译』Hacking Hit Tests

35 期周报我们曾向大家推荐了它的原文,而这周 SwiftGG 则为大家做了翻译,再次温习 iOS 系统基于 Hit Test 的触摸事件处理机制。

🐕 How to test iOS networking code the easy way

测试网络层代码总是很困难,因为代码运行地飞快,并且不好重现。文中给出的方案便是 URLProtocol,一个用于处理特定协议数据的抽象类。你可以编写一个 URLProtocol 的子类来注入你需要的数据,而无需改变你原有的代码,不妨一试。

🚧 🐢 Building an Interactive Voice App Using Custom Siri Shortcuts in iOS 12

Siri Shortcut 是 Apple 在 iOS 12 中基于 SiriKit 框架引入的新 API。它为开发人员提供了自定义用户在应用程序中经常使用的活动创建快捷方式的方法。用户通过向 Siri 发出语音命令来调用快捷方式,可以通过记录与快捷方式关联的自定义短语来自定义实际短语。你可以实现例如:

  • 订购一些东西(例如披萨,咖啡,早餐😋)
  • 信息搜索
  • 连接到任何 API
  • 做我们想要的任何自定义动作
  • 执行 Siri
  • 还有更多...

本文还提供了一系列实现上述功能的参考代码,希望能给感兴趣的朋友提供帮助。

🐎 GitHub Actions: Continuous Delivery of Swift Packages

GitHub Actions 是 GitHub 在 GitHub Universe 2018 开发者大会上发布的新功能,它能够让开发者直接在 GitHub 上根据特定的事件自动执行预设的任务。

本文记录了通过构建 Swift Packages 来使用这个功能的整个流程,也总结了使用过程中发现的一些问题。虽然 GitHub Actions 还处于公测阶段,但大家对这个功能都表示很看好。因为它能让每个开源项目都有自己统一开放的自动化工作流程,它使得 GitHub 服务从代码托管延伸到整个软件开发周期,它很有可能会改变大家使用 GitHub 甚至维护开源项目的方式,所以就让我们拭目以待吧。

🐢 深入浅出 iOS 编译

在日常开发中,并不会常用到编译原理相关的知识,但不代表我们不需要了解它。本文系统的讲了 iOS 编译的各个环节,连签名环节都有涉及,深入浅出,也比较容易看懂。在编译原理层面,分为前端和后端,在众多概念中比较重要的是 Parser 和 CodeGen,了解一定的编译原理相关知识,对我们做更深层次的架构、语法设计会很有帮助。

工具

SwiftRewriter - Swift code formatter using SwiftSyntax

基于 SwiftSyntax 的 Swift 代码格式化工具,要求 Swift 4.2 和 Xcode 10。可以方便灵活的定义和组合自己想要的代码格式。

Shapeshift

快速让一组 Swift 文件兼容 iPad 上的 Playground,甚至可以将转换后的文件放置在 iCloud Drive 中的 Swift Playground documents 文件夹内,以便立即拿起 iPad 开始编程!🚀

Woodpecker

我们曾在 18 年初的 第 5 期周报 推荐过 Woodpecker 这款工具,它可以在 Mac 上查看 App 信息,提高开发测试效率。但现在这款工具 Mac 商店已提供免费下载,免费版本可使用绝大多数功能。

目前功能:

  • 只需一步,即可查看、修改沙盒文件;
  • 监控 App 网络 http(s) 请求,无需设置代理;
  • 查看,修改 UserDefaults;
  • 在线调试 WebView;
  • 简单强大的插件支持。

@张小刚哟 自荐

Code Friend

使用提供的 JavaScript 接口,可以简单快捷地开发出 Xcode 插件的 Xcode 插件。

USB Keyboard

通过 USB 连接 iPhone 到 Mac 后,可以实现在 Mac 端打字,iPhone 上输入的输入法应用。

woza

越狱 iOS 的砸壳工具,类似 clutch、dump-decrypted,是 AloneMonkey 开发的 frida-ios-dump 的 node 版本。另外,woza-desktop 是 woza 的桌面版本,实现了“点点鼠标就能砸壳”的目的。

代码

🌟 Stinger

知名 iOS AOP 库 Aspect 的另一种实现思路。使用 libffi 及解析方法签名构建壳函数,替换原方法实现以感知方法调用和捕获参数;使用同一 cif 模板及函数指针直接执行原实现和所有切面 block;不使用消息转发指针替换原实现,hook 兼容性更好;调用方法不经过消息转发过程,执行原实现及切面代码过程中无手动构建 invocation 等,效率更高。

正在实现 hook 单个实例对象。

🌟 LeetCodeAnimation

现在无论是准备参加校招还是社招,怎么能不去刷刷 LeetCode 呢?但是刷题的过程是枯燥乏味的,而现在广大程序员同胞的福音来了, LeetCodeAnimation 的作者立志将 LeetCode 上所有的题目都用动画的形式演示出来,相对枯燥的算法,使用动画演示将更容易理解铭记。目前已实现了部分算法,并将持续更新。

音视频

ggtalk | 创业那点事:听莲叔和羊叔回忆峥嵘岁月

这一期内容,对于大多数程序员都挺有指导意义,羊叔和莲叔分享了自己曾经创业的经历,同时引出了关于程序员职业发展话题的讨论。面对可能高回报但同样高风险的创业机会,作为工程师应该如何判断,如何抉择,创业公司的股份和期权能不能拿,意味着什么,这些问题,你都能在节目中找到答案。

内推

Read more

老司机 iOS 周报 #49 | 2018-12-24

24 Dec 03:29

Choose a tag to compare

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

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

福利

🌟 我们发福利啦~

周报已经快陪伴大家走过一年的时间,非常感谢各位朋友的支持和厚爱。为了在 2019 年能更好地为大家服务,我们举办了一个问卷调查活动。在 12 月 27 日,我们会在参与问卷的朋友中选取合适的几个人赠与学习大礼包和现金奖。至于奖品是什么,大家可以在这条微博中了解,转发还有额外的抽奖~我们渴望听到你们的声音!

新闻

🌟 周报支持邮件订阅啦!

在接下来的周报发布中,我们将会采用 GitHub 最新的 GitHub Release 特性进行,读者朋友们可以到我们 GitHub 主页 点击 watch -> 选择 Release only 订阅。之后每期周报发布,你 GitHub 账号关联的邮箱就会收到我们的发布邮件。

除新增的邮件模式之外,我们还提供了以下三种方式,大家可以按照自己的需求进行选择:

Cydia 商店宣布关闭

对 iOS 越狱有这些影响:

  • Saurik 决定关闭的仅仅只是 Cydia Store,也就是其中的支付系统,不会影响原有的安装/卸载/管理应用程序的功能,免费或已经付费的应用,依旧可以进行下载。如果希望继续购买付费应用,需要去其他存储库(如 Packix,Chariz 或 Dynastic Repo)进行下载
  • Saurik 决定关闭商店跟一个 BUG 有关,其可以通过用户的 PayPal 帐户启用任意 Cydia Store 软件包购买
  • Sileo 是 Cydia 的计划替代品,但是其还在开发阶段

文章

🌟 🐕 我从写技术博客中收获到了什么

相信不少程序员都有写博客/文章的习惯,或者正计划写,因为一方面可以总结和加深对技术的理解,另一方面也可以一定程度上增加一些知名度,这也有助于拿到更多的面试机会。但是,由于多数人工作毕竟已经很忙,真正能坚持写下来的人却不多。本文作者作为一个工作刚满 3 年的开发者,但写博客却有两年半的时间了。笔者大概看了下,大概写了有 50 多篇,可以说是很高产了。

本文分为三个部分

  • 写技术博客的历程
  • 写技术博客的收获
  • 回答一些朋友(粉丝)的一些关于写博客的几个问题

在技术道路的探索上,每个人有每个人不同的方式,但对于任何一个人,坚持都是很重要也难得的品质。相信这篇文章能够解答你心中的一些疑问。

🌟 🐢 从零开始学基于 ARKit 的 Unity3d 游戏开发系列

作者王寒,国内首批 iOS 应⽤开发者,首批 VR 应⽤开发者,知乎专栏 笨猫学编程 作者。《Cocos2D权威指南》《虚拟现实-引领未来的人机交互革命》《Unity AR/VR开发:从新手到专家》的作者。

在本系列的教程中,作者带大家一起学习,如何从零开始学习基于 ARKit 的 Unity3d 移动游戏开发。全系列的教程都是基于实战项目的,而且尽可能考虑到初学者可能会遇到的种种困难和障碍,可谓是手把手教学。

虽然名称是零基础,这个课程有个前提是本身对 Unity 及 3D 图形有一定的了解,不是完全零基础。当然也不必灰心,作者还贴心地为初学者准备了 iOS 入门课程系列AR-VR 入门课程系列

🐕 TikTok(抖音国际版)逆向,全球的小姐姐们,我来啦!

在 iOS 日常的开发过程中我们通常会做一些竞品分析或者研究竞品某些功能点的实现方案,其中就需要使用到逆向技术。

本文作者以逆向抖音国际版为例,通过 Frida 砸壳,Hopper 静态分析,配合 Reveal 动态分析,以及 Charles 抓包等一系列分析,编写 Hook 代码完成逆向功能,最后实现突破地区限制、移除水印、日区视频分享下载。文章思路清晰明了,带我们理清了 iOS 逆向工程的整个分析过程。

🐕 Mocking With Protocols in Swift

单元测试可以覆盖我们的很多场景提高代码健壮性,但同时也有很多的代码其实是很难单元测试的,比如和数据相关的删除操作,逻辑迟早都是会跑到的,不在开发阶段就在上线后用户使用阶段,所以这类 “untestable code” 越多,软件的质量就会越有问题。本文作者通过使用 Swift 的 Protocol 的相关特性,来巧妙的构造一些测试机制来测试一些没那么好写单元测试的代码,并给出了一个具体的例子。值得借鉴!

🐕 Data-Driven Table Views

UITableView 称为所有 iOS 开发者最熟悉的控件并不为过,但 UITableView 存在代码重复、控制流过于复杂、违反依赖性倒置原则等痛点。文章前半部分指出了以上痛点,以及相对于 UITableView 来说 UITableViewController 所拥有的特性;后半部分针对上述痛点,基于 UITableViewController 逐步实现了一个基础版的数据驱动业务的模型,设计轻量,用法简洁,且方便扩展。

🐢 Optimizing Images

图片一直是 App 内存消耗大户,本文从图片的加载解压呈现开始,特别介绍了列表型应用应该如何优化图片内存问题。

🐢 🚧 How to convert your Xcode plugins to Xcode extensions

Xcode 插件和扩展,是我们日常开发中工具,作者针对它的发展做了以下几点的总结:

  1. 什么是插件:只是一个类型的包,Xcode 启动时的同时,会去加载指定的 Info.plist 文件
  2. 优秀的插件推荐:Alcatraz(包管理工具)、Xvim( vim 编辑器)、SCXcodeMiniMap(代码地图面板)、FuzzyAutocompletePlugin(函数模糊搜索)、KSImageNamed(图像名称列表)、ColorSense(颜色转换)、LinkedConsole(控制台打印跳转代码文件)
  3. 插件的制作:作者以 XmasXcodeColorSenseXcodeWay 的制作为例向我们展示了如何 Hook Xcode 的方法,以及如何与 Xcode 中 UI 元素进行交互
  4. 插件的禁止:由于 2015 年末,XcodeGhost 事件,苹果从 Xcode8 开始禁止加载插件。当然,你可以通过 Xcode 重签名这种方式去绕过苹果的检查,重新加载插件
  5. 扩展的崛起:苹果爸爸关上了一扇门,肯定会开一扇窗。从此 Xcode8 中的扩展进入了人们的视线当中。利用现有的 XcodeKit,去获取文档信息,修改当前文档内容,但是跟以前优秀的插件相比,这个方式能实现的东西是在太少了。作者以 XcodeColorSense2 为例,向我们介绍了,如何去实现/调试/安装扩展。另外作者以 XcodeWay 向我们介绍了如何使用去用新的扩展去调用 Apple Script

🐕 美团开源 Graver 框架:用“雕刻”诠释 iOS 端 UI 界面的高效渲染

美团开源了一款高性能的图文混排渲染框架,其特点是整个页面不使用 UIKit 的界面层级与布局渲染,而是采用自己的图文排版引擎,将所有元素绘制在一张 bitmap 上,然后辅助轻量级的交互控制。在这一整套自研的图文排班引擎的支持下,可以做到网络下载/排版算法/图形渲染都通过异步来进行控制,从而实现复杂界面的高性能渲染效果。

🐎 Image Analysis Solutions for Mobile Apps

本文介绍了几种移动端图片分析的解决方案。其中包括:

  • 云解决方案
  • Apple Vision API
  • OpenCV
  • BoofCV

我们希望,通过这篇文章,我们可以让您更轻松找到最佳解决方案。

🐕 Improving code testability with Swift protocols

Swift 是一门建议面向协议编程的语言,测试驱动是时下比较热门的工作方式。因此,提升 Swift 的 protocol 可测试性就非常重要了。本文介绍了一些接地气的方法

  • 用工厂模式来封装 init 的细节
  • 通过 mock 的方式来只关注行为是否符合预期
  • 协议的设计要符合依赖倒置原则

工具

How to Add a Recent Items Folder to Your Mac's Dock

如何将最近打开的项目文件夹添加到 Mac 的 Dock 中?相信工作中很多同学都有这个需求。本文作者就图文并茂的给我们演示了整个过程,过程并不复杂,重要的是一劳永逸,可以有效提升我们日常的工作效率。

代码

iWeChat - 通过逆向还原和探索微信

iWeChat 项目作者希望通过逆向还原微信来学习构建微信用到的技术架构和交互设计,同时也想借此教会大家如何分析一款第三方 App。

项目介绍中罗列的逆向技巧、步骤和工具等,都是不错的入门实战教程,对逆向以及微信的设计感兴趣的同学可以关注下。

音视频

ggtalk | 和 Cee 聊聊如何拿 Google Offer

想来有很多程序员对 Google 非常憧憬,也一直希望能有机会去 Google 工作。 这期 Swiftgg 的 ggtalk 节目就和最近拿到 Google Offer 的翻译组同学 Cee 聊了这个话题。主要集中在 Google 的面试流程,怎么准备上。

有兴趣的同学可以听听看,虽然北美的面试准备这些会和国内的有一些区别,但是依然值得了解一波。

如果对北美面试有兴趣的同学们,还可以配合我们之前发的小专栏:北美软件工程师面试简单介绍 一起“食用”,效果更佳。

内推

关注我们

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

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

本期编辑

@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@Parsifal@aaaron7@kyo@tom510230@anotheren@水水@looping@老老老老老老老驴@小非86@邦ben@红纸@含笑饮砒霜@JimQXanderXu老峰

说明

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

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

老司机 iOS 周报 #9 | 2018-03-05

22 Dec 09:41

Choose a tag to compare

ios-weekly

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

文章

[译]奔跑吧!RunLoop!

揭示了 RunLoop 的本质和 RunLoop 的执行过程。翻译有一些瑕疵,喜欢阅读英文的朋友可以直接看原文。

[译] 揭秘 iOS 布局

详细全面介绍了界面布局的相关函数的执行顺序和作用。

[译]为什么你的 APP 在 Sketch 上看起来更好: 探索 Sketch 和 iOS 的渲染差异

如果你非常严格的比对 Sketch 的效果图和真机上的效果会发现,即使参数一致文字排版、阴影、渐变还是会有微小的不同。文章结合实例展示了这些效果有何不同。坏消息是阴影和渐变的不同并没有解决方案,只能自主调节参数。

Hook Objective-C Block with Libffi

Objective-C 的方法 hook 可以通过 Method Swizzling 实现,但 block 的 hook 并不一样。该文分析了 block 的 hook 原理,参照 MABlockClosure 的实现和 Aspects 的 API 设计,基于 libffi 实现了对 Objective-C Block 的 hook —— BlockHook

More Interface Builder Tips And Tricks

一些 Interface Builder 的使用小技巧,便捷快捷键,小 Tips,如果你的项目中也在使用 IB,这篇文章能给你带来帮助。

Ruby 对于 iOS 开发发展的影响

今年是 Ruby 这门语言诞生的 25 周年,作者特别写了一篇文章介绍了 iOS 开发工具链发展史里 Ruby 发挥的作用,讲述 CocoaPods、Fastlane 等等这些工具当时选择 Ruby 的理由。

小程序支持打开移动应用到底是怎么回事?

文章详细讲解了什么场景下小程序可以打开 App 以及 App 端代码应该怎么写。

iOS 编译器

本文是 objc.io 第六期文章,还有姊妹篇 Build 过程、Mach-O 可执行文件。文主要探讨编译器主要做些什么,以及如何有效的利用编译器。

Synchronous Unit Tests

Swifting.io 的新文章,作者在文中一步一步地实现了一套可读性和执行效率都很不错的单元测试方案,让开发者能以同步的方式编写单元测试。如果你没有足够的时间阅读文章,也可以直接在 Github 查看这套方案的源码。

XCTKVOExpectation for native Swift key paths

文章介绍了 XCTest 测试框架新增 API XCTKVOExpectation 的一种使用方式,作者封装了 KVOException 并对 XCTestCase 进行扩展,以方便开发人员完成测试用例的编写。另外,作者已经把所有相关代码都开源在了 Github 上。

iOS 微信内存监控

本文非常详细的从数据收集、数据存储、数据上报,页面展现、降低误判几个方向,讲解如何实现线上内存监控及 FOOM 导致的系统强杀上报。

FOOM 是指 APP 在前台因消耗内存过多引起系统强杀,微信每天 FOOM 次数与登录用户数比例接近 3%,同期 crash 率 1% 不到。为此,微信开发此线上内存监控工具,FOOM 率由 17 年年初 3%,降到目前 0.67%,效果显著。

awesome-blockchain

他们说 2016 是 VR 元年,他们说 2017 是人工智能元年,他们说 2018 是区块链元年。可能是新时代的开端,也可能只是昙花一现的潮流。

弄潮儿,如果你做好准备,这里有所有区块链(BlockChain)技术开发相关资料,包括 Fabric 和 Ethereum 开发资料。

工具

Sketch 49 更新:迈向交互设计领域的第一步

Sketch 在最新的 49 版本中增加了制作交互设计的新功能,可以使用连线和热点图层来连接 Artboard,并且可以在 Sketch,Sketch Cloud 和 Sketch Mirror on iOS 进行预览。设计和交互在一个软件中统一已经是目前的发展趋势,Sketch 这次的更新可以说是极其重要的一步。

An iOS Runtime Headers Search Tool

通常我们查看系统类的 Undocumented API 或者 Private API 的时候,需要借助 Class Dump 来进行,又或者去直接去寻找业内已经 dump 后开源的文档,而这个工具是实时在线查询平台,支持查询 『iOS8 ~ iOS11』的 iOS Framework,并会列出该类或者方法在哪些系统版本中使用。

代码

腾讯开源了一个高性能图片框架

去年 Swift 大会上腾讯的工程师介绍过如何构建一个高性能的图片框架,现在这个框架终于开源出来了,合理的架构和线程模型,并特别针对不同场景进行优化,让它能充分发挥硬件的性能。据悉这个项目已经三年了,这个框架在腾讯内部有很多项目都在使用,已经经过了生产环境的考验。

FlyoverKit

FlyoverKit 可以让你 360° 俯瞰 MKMapView,效果令人惊叹,无需额外的操作、所有的配置都保留可用。

FluxCapacitor -- This is what makes the Flux design pattern possible

FluxReact 开发中很重要的一种编程思想。它在 JavaScript 有很多种实现,比如 官方的 Facebook Flux很多人熟悉的 Redux 等。但这种单向数据流的设计思想在 iOS 开发中使用的并不多,现在相对知名的有 ReSwift,FluxCapacitor 使用 Swift 的 protocols 和 typealias 完成了另一种实现。另外该作者在学习 Flux 这一思维的时候,用多种方式实现了同样功能的 SimplestCounterSample 以辅助自己理解,也十分推荐。

Swift-Kuery-ORM

IBM 新开源了 Swift-Kuery-ORM,构建于 Swift-Kuery 之上,可以通过插件连接 PostgreSQLSQLiteMySQL

XHLaunchAd

功能丰富的开屏广告、启动广告解决方案,主要优势如下:

  • 支持静态/动态图片及 MP4 视频广告;
  • 支持全屏/半屏广告,兼容 iPhone 和 iPad;
  • 支持广告点击事件,支持自定义跳过按钮、添加子视图、设置完成动画;
  • 支持网络及本地资源,自带图片/视频下载、缓存功能;
  • 支持设置数据等待时间等;
  • 作者长期维护,项目文档较完善,且有技术交流群。

只需简单配置即可实现复杂业务需求,有需要的同学可以尝试使用。

MessageViewController

MessageViewController 是 Swift 版本的 SlackTextViewController,是 slack 聊天界面的一个可交互的基础UI控件。MessageViewController 的功能完成度和代码质量都特别高。如果有类似 slack 聊天界面的需求或者想学习 slack 聊天界面的实现效果,不妨看一下 MessageViewController。

Swift-NIO

苹果官方在try! Swift上发布了Swift-NIO,它是一个事件驱动的非阻塞的网络框架,用来写高性能网络应用。
苹果在 Server-Side 方面努力,看得出对 Swift 的重视和对它的期望都很高。

音视频

iOS 组件化 / 构建优化 / 持续化集成

本视频介绍了在滴滴出行业务的不断拓展、客户端开发团队人数激增、代码量急剧膨胀、开发人员物理地域不同、人员间的协同开发成本、代码维护成本成指数型增加的背景下,如何实现稳定高效的协同开发、高效地进行代码复用与持续集成以及避免代码量巨大导致的单次构建耗时长的问题。其中包含了滴滴的一系列自研工具和对现有开源工具的一些魔改,思路值得借鉴。

随着集团业务的不断发展,研发团队规模增大(100+),App 活跃持续增长(千万级),客户端单一的工程已经不能够满足当前业务需求。因此多工程集成的客户端项目应用而生,工程组件化势在必行。本视频对京东金融移动端的组件化做了详细的介绍,正在做组件化或者有类似需要的同学值得一看。

本期编辑

@没故事的卓同学@四娘@mmoaay@享耳先森@EyreFree@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal

说明

🚧 表示需翻墙

老司机 iOS 周报 #8 | 2018-02-26

22 Dec 09:39

Choose a tag to compare

ios-weekly

新的一年,欢迎第十位编辑 @Parsifal 的加入。

新闻

App Store 描述截图从 5 张增加到 10 张

苹果再次对 App Store 更新了上架规则,新的规则宣布,开发者对于其开发的 App,在截图介绍部分可以添加 10 张屏幕截图,而之前是 5 张。

四月起,所有提交审核的 APP 都要基于 iOS 11 的 SDK 开发

苹果发出最新通知,从 2018 年 4 月开始,所有提交审核的 APP 都要基于 iOS 11 的 SDK 开发,且支持 iPhoneX 的 Super Retina 显示屏

这也意味着,开发者至少需要使用 Xcode 9 来开发 App ,并确保他们的 APP,在 iPhoneX 上根据安全区域进行了适配。

文章

🌟 探索 iOS 内存分配

介绍了 iOS(OS X)系统中 VM 的相关原理,以及如何使用 VM Track 模板来分析 VM Regions,通过深入了解 iOS 的内存分配,可以有针对性的对内存进行优化。

🌟 移动场景下通信协议 FlatBuffers、ProtocolBuffers、MessagePack 选优

JSON 有可读性高、易于使用的优点。但是也有解析费时、解析内存耗费高、及数据量大的缺点。除了 JSON,现在主流的还有 MessagePack、FlatBuffer、ProtocolBuffers 通信协议。文章综合不同场景对比了这几种通信协议的优劣。

Just Controllers

iOS 上的 MVC 模式最后会导致 VC 中有大量代码在业界已经达成了共识。优化的一种方式是把 VC 中的代码拆分到 child view controller。实践中你会发现 child view controller 的使用起来并不像 UIView 一样简单,要注意它和 parent view controller 的生命周期控制。View controller 中的 view 使用起来和一个单纯的 UIView 实例也有不同。有的场景自定义一个 controller 类包含 UIView 也许会是一个更好的主意。

UIVisualEffectView Tutorial: Getting Started

利用 UIKit 中提供的 UIVisualEffectView 来实现常见的模糊背景的效果简单又好用。文章介绍了模糊的算法原理和 UIVisualEffectView 的使用方式。

Unit testing asynchronous Swift code

介绍了单元测试中处理异步代码的几个小技巧:通过设置 XCTestExpectationinverted 属性来验证任务是否完成;将异步闭包添加到同步线程中,接着在同步线程中执行一个空的闭包来判断异步操作是否执行完成;在代码中通过 mock 将异步的操作封装为同步的操作方式来避免处理异步的情况。

🚧 iOS Developer Roadmap

国外开发者维护的 iOS 开发技能导图,作者将 iOS 开发中所涉及到的技能总结为一个个 topic,并提供对应 topic 的学习资源。无论你是还未入门的小白,还是想继续提升的开发者,亦或是正在准备面试的求职者,都可以利用这份图谱进行知识学习和梳理。

iOS IP 直连原理剖析

移动互联网的网络状况十分复杂,三大运营商、3G、4G、Wi-Fi、地点等任何一个状态的改变都会导致网络状况的变化,IP 直连可以跨过运营商 LocalDNS 服务器解析过程,从而达到降低延迟、避免劫持的效果。本文对 iOS IP 直连原理进行了剖析,高度概括,通俗易懂,值得一看。

iOS Code Signing Tutorial Series

由 Shashikant Jagtap 发布的 iOS Code Signing 相关系列博客,总共五篇。众所周知,iOS Code Signing 对于大部分 iOS 开发者来说,一直都是最神秘的存在,尽管有所谓的官方文档。显然作者也发现了这个问题,所以他采用了亲身实践的方式,力求更简单的为读者解读 iOS Code Signing 的一些细节,小编大体看了下,确实通俗易懂很多。(PS:有在做技术文章翻译的童鞋可以考虑把这个系列翻译成中文,造福更多开发者~)

我是怎么慢慢变懒的(2) : Jenkins 全自动化

作者根据自己的实际项目经验,写了一篇总结。大概讲了「我搭建了一个怎么样的 Jenkins 环境」以及在搭建过程中遇到了哪些问题。

工具

Snipaste for Mac 公测版推出

具体介绍可以看少数派的文章:Snipaste for Mac 公测版推出,改变你在 Mac 上的截图体验

代码

ZHStatusVolume

设置音量时隐藏系统的 hud,将音量变化展示在状态栏上。用 OC 写的,兼容 Swift,刚刚发布第一个版本,如果使用中有问题欢迎联系我@没故事的卓同学

ReactiveLists

ReactiveLists 基于 React 编程思想,封装 UITableView 和 UICollectionView 的 API,使用该 API 可以编写 无状态函数 来生成列表页面。作者认为,在向 UIKit 组件提供数据上,这些无状态函数相比 DataSourceDelegate 更易于阅读和迭代,而且还易于测试。

作者关于 ReactiveLists 的介绍:Open Sourcing ReactiveLists for iOS

Uber 的 App 开发架构 RIBs

Uber 的跨平台开发框架 RIBs,架构名由 Router, InteractorBuilder 的首字母组合而成,表示了该架构的构成。优势如下:

  • 在 iOS 和 Android 间共享同一套架构;
  • 可测性和隔离性,便于进行单元测试同时各个独立的 RIB 类间高度解耦;
  • 提供代码生成、内存泄漏检测、静态分析和运行时集成等一系列开发工具;
  • 一种可伸缩的架构,已被证明可适用于几千人基于统一代码库开发的场景。

一种适合响应式编程和大项目的架构,对架构有兴趣的同学一定不要错过。

SwifterSwift

SwifterSwift 是一个用 Swift 编写的 Extension 的集合,涵盖了开发过程中大部分会用到的方法和函数,是一个不错的工具库。同时 SwifterSwift 大概有 SwiftStdlib Extensions、Foundation Extensions、UIKit Extensions、AppKit Extensions、CoreGraphics Extensions、CoreLocation Extensions、Misc. Extensions 等一系列分类。

音视频

🚧 🌟 Swift’s Reflective Underpinnings

Swift 核心开发团队成员在 Swift Summit 上的演讲视频。介绍了 Swift 的动态能力的构建基础,提及了未来 Swift 版本中可能引入的动态特性。其实在 Swift 中已经有一些反射的能力,每个类型在内部都有 metadata ,可以查到这个类型的字段、方法,只是没有暴露出来。强烈推荐 Swift 爱好者观看,干货很多。

另外 Swift Summit 的其他视频也都分享在了 Skilled 网站上,大家可以关注一下。

本期编辑

@没故事的卓同学@mmoaay@EyreFree@Damonwong@张嘉夫@AidenRao@Parsifal

说明

🚧 表示需翻墙,🌟 表示店长推荐

老司机 iOS 周报 #7 | 2018-02-12

22 Dec 09:39

Choose a tag to compare

ios-weekly

这周就是春节了,周报在春节期间不会更新,祝大家过个好年。

新闻

Swift 4.1 新增 -Osize 优化模式降低代码尺寸

Swift 4.1 将随 iOS 11.3、Xcode 9.3 一起发布。Optimization Level 新增 -Osize 模式,降低编译后代码尺寸。按官方描述,启用 -Osize 后代码尺寸将降低 5%-30%,而性能影响可以忽略不计(小于 5%)。

另外,还从 Optimization Level 独立出 Compilation Mode,可选 Single FileWhole Module

iOS 关键组件 iBoot 源代码泄露

有匿名开发者在 GitHub 上传了 iOS 核心组件 iBoot 的源代码,iBoot 是 iOS 关键的源代码之一,它确保了操作系统的可信任启动,换句话说,它是加载 iOS 的程序,是开启 iPhone 运行的第一个进程,它加载并验证内核是否被苹果正确签名,然后执行,就像 iPhone 的 BIOS 一样。

Apple 已确认这一事件并表示泄漏的是 iOS 9 的代码。

苹果公司与内蒙古签订协议,将在中国国内建设第二个数据中心

苹果公司将在内蒙古乌兰察布市,建设中国第二个数据中心,于 2020 年开始投入运营,继而形成“南贵北乌”两个数据中心的格局。

文章

iOS KVO crash 自修复技术实现与原理解析

一年前网易杭研的博客《大白健康系统--iOS APP 运行时 Crash 自动修复系统》引发了很多讨论。利用 runtime 动态特性,对一些常见 crash 进行保护:

博客介绍了实现原理,未公布代码。现在根据小道消息,网易的这个库内部并未全面使用,开源计划已经搁置。社区有热心群众出于学习心态,按照文章思路写了一个类似的代码库:BayMaxProtector

本文则针对如何防护 KVO crash 提出新的方案:通过建立哈希表保存观察者、keyPath 的信息,在对象 dealloc 时进行状态的更新。

[译] Swift 算法学院 - 查找数组中第 K 大值

介绍了查找数组中第 K 大值的算法。更多的基于 Swift 的算法例子可以看 raywenderlich/swift-algorithm-club

数据结构 & 算法 in Swift (二):算法概述和排序算法

本篇是《数据结构 & 算法 in Swift》系列连载的第二篇,首先简单地讲解了算法基础,包括算法的概念、时间复杂度与空间复杂度以及递归。然后结合 Swift 代码实现讲解了排序算法,包括选择排序、插入排序、归并排序和快速排序。

iOS 架构之 View 层的架构方案

在前两年 Casa 分享的 iOS 应用架构谈 view 层的组织和调用方案 之后,这是圈内现在新鲜出炉的又一篇 view 层架构分析文章。Casa 的文章最后站在更宏观的角度去提出 view 层架构模式需要遵循的"拆分三大心法"和"设计四大心法"。

这篇篇幅相对要少一些,该作者从「如何评价一个架构方案」-> 「MVC / MVVM / MVP / VIPER 等几种主流的架构模式简析」-> 「团队内最终的方案」,循序渐进地分享了适合自己团队的架构方案实践过程,对于初入架构设计的同学会相对更加友好一些。笔者建议先读懂这篇文章后,再细细咀嚼 Casa 的文章。

Crash 符号化

作者一共写了三篇文章,从 基本流程与相关命令symbolicatecrash 源码浅析与优化 以及最后的 Mach-O 与 atos,由浅入深的解释了 iOS Crash 从产生到符号化的整个过程。

Swift 中关于操作符的那些事儿

这篇文章主要是介绍了一个处理 Error 的技巧,通过自定义操作符来简化错误处理的代码,没有复杂的逻辑和抽象,简单实用,强烈推荐👍

WebAssembly 能干什么?8 个 WebAssembly 应用案例

WebAssembly 的特点是在浏览器里面他运行的比 js 快,虽然还是一个提案中的技术,但是各大浏览器厂商都已经跟进,因此有了很多 WebAssembly 实际应用案例,这篇文章就介绍了 8 个案例,从这里面的介绍可以看到 WebAssembly 普遍被应用到了这几个方向

  • 将其他语言编译成 WebAssembly 做到可以在浏览器里运行;
  • WebAssembly 在游戏引擎与图形渲染方面的运用;
  • 是加速原本的 js 代码的运行。

[译]在 Git 中保护 iOS 项目的敏感信息

如果要开源的代码涉及敏感信息,比如 API Key,HMAC secrets 或密码,那么比较好的方式是把它们放在新建的 xcconfig 文件里,Git 再忽略这些文件。
最后新建不把值包含进去的示例配置 xcconfig 文件。

其它开发者此时只需要将示例配置文件填值,再重命名一下即可轻松运行不包含敏感信息的项目。

Swift 4.1 improves Codable with keyDecodingStrategy

Swift 4.0 中增加了 Codable 来方便的解析 Json,然而 Json 作为一个通用的数据格式通常用于和其他平台交互,其他平台的命名规范如果不是驼峰式就需要声明 json key 映射。4.1 中增加了 keyEncodingStrategy 配置两种常见命名规范的自动转换:

let jsonString = """
[{
    "name": "MacBook Pro",
    "screen_size": 15,
    "cpu_count": 4
    }]
"""

struct Mac: Codable {
    var name: String
    var screenSize: Int
    var cpuCount: Int
}

let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let encoded = try encoder.encode(macs)

Parallel programming with Swift 1. Basics 2. Operation

第一篇介绍了使用 Swift 进行并行编程时的多种方式,从 Process 到更高级的抽象 Operation,如何控制并发的顺序,锁和信号的使用。

第二篇主要是讲 Operation,包括 API,生命周期,依赖以及封装的介绍。

这一系列由浅入深,配图清晰,顺便推荐一下他们团队 Flawless 的博客,里面有很多技术分享,质量都很高。

漫画:Git 二分 Debug,火速定位出错代码!

详细介绍了 Git 提供的二分法调试工具:git bisect。它可以按照我们选定的 commit 列表,进行二分分割,快速定位出出错的 commit。来帮我们缩小最小改动的代码,从而快速定位问题。作者还采用了漫画的形式,帮助读者加深印象。

工具

PodsUpdater--A macOS app which helps you manage dependency releases in your Podfile

一款协助你管理项目中 CocoaPods 依赖的小工具,能够清晰展示你项目内的依赖版本以及该依赖的最新版本,并提供自动适配兼容版本的功能。

分享笔者在使用过程中遇到一个坑,原因是某个比较旧的私有源配置的是 http 的 url,导致出现了fatal: could not read Username for 'http://git.privatesource.com': Device not configured,即该工具执行 pod repo update 的时候并没有权限去拉取你的私有源。解决方式也很简单,把旧的源里 url 修改成 ssh 的 url 即可,配置文件路径为 /Users/your_username/.cocoapods/repos/-private-podrepo/.git/config

CoreML 模型仓库

iOS11 所推出的 CoreML 让 App 开发者可以不用学习了解 Deep Learning ,不用亲自训练模型,拿训练好的模型就可以在 App 里快速使用。并且搭配开放了几个视频识别物体的模型 Object Detect,那么除了苹果开放的识别物体模型,现在还有哪些地方可以找到更多的训练好的 CoreML 模型呢?这里面介绍 3 个 Link,里面有很多训练好的有趣的模型,比如照片转油画 / 面部情绪识别 / 人物年龄猜测 / 文章分类 / 文字情绪识别等等,iOS 开发者的福音,可以拿来做一些有趣的个人 idea App

Carbon

Carbon 是一个可以在线将代码生成高逼格图片的工具,它具有以下特点:

  • 可从 GitHub gist 直接导入;
  • 高度自定义,可调整语法主题、窗体样式等参数;
  • 分享便捷,一键发布 / 保存图片。

GitHub 地址:https://github.com/dawnlabs/carbon

CTF Wiki

CTF(Capture The Flag,夺旗赛)起源于 1996 年 DEFCON 全球黑客大会,是网络安全技术人员之间的竞技比赛。

CTF Wiki 是一个自由的站点,主要包含了 CTF 中的基础知识、常见题型、解题思路以及常用工具等,可以帮助你更快地了解 CTF 竞赛以及网络安全相关知识,对安全领域相关知识感兴趣的同学千万不要错过。

GitHub 地址:https://github.com/ctf-wiki/ctf-wiki

本期编辑

@没故事的卓同学@四娘@mmoaay@享耳先森@EyreFree@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal

说明

🚧 表示需翻墙

老司机 iOS 周报 #6 | 2018-02-05

22 Dec 09:38

Choose a tag to compare

ios-weekly

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

新闻

从 iOS 11.3 开始 App Store 的评价终于可以排序了

从 iOS 11.3 开始,用户可以根据四个分类来给 App Store 评价排序,分别是“最有帮助”、“最高评价”、“最低评价”和“最新发表”。由于 iOS 11 之前的版本没法给 App Store 评价排序,所以这个改动会很受欢迎,特别是考虑到目前 App Store 会给一部分用户显示最早来自 2008 年的过时的、不相关的评价。

Apple Reports First Quarter Results

苹果公司发布 2018 财年第一季度财报,财报显示,苹果第一财季营收 883 亿美元,较上年同期的 784 亿美元增长 13%,净利润为 201 亿美元,较上年同期的 179 亿美元增长 12%。

相比 2017 年,iPhone 的销量从 7829 万,下降至 7732 万。但平均销售价格从 695 美元增至 796 美元,营收 615 亿美元,较上年同期的 544 亿美元增长 13%。

Apple 宣布因信号问题召回部分 iPhone 7

Apple 已经确认,由于主板上的某个组件发生故障,一小部分 iPhone 7 可能会在状态栏中显示「无服务」。这些受影响的设备生产日期在 2016 年 9 月至 2018 年 2 月之间,售出地为中国内地、中国香港、日本、中国澳门和美国,Apple 将免费维修。

Transporter 支持上传 App 预览信息了

Apple 官方提供的分发工具 Transporter 现在支持上传 App 预览信息了,具体细节请参考 Transporter 用户指南App 元数据规范,注意这两个文档都有中文版。

文章

数据结构 & 算法 in Swift (一):Swift基础和数据结构

学习通用性知识,突破技能瓶颈,@J_Knight_ 开始《数据结构与算法分析 -- Swift 语言描述》的连载.

此文作为开篇,将从 Swift 基础、数据结构开始。讲解一下后续连载中所涉及到的 Swift 语法知识,以及用 Swift 来实现几个简单的数据结构。

🚧 Learn iOS Programming from Top Swift Articles of 2017

MyBridge AI 从 15000 篇文章根据关键词 Swift 挑选出的最受欢迎的 45 篇文章。

Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?

Protocol Buffer 是由谷歌开发并开源。通过两端约定好报文格式,数据传输过程中直接编码成二进制包。因为数据不再自描述,所以数据就小了很多,因此传输效率比 XML、Json 都高很多。本文详细介绍了 Protocol Buffer 提高序列化性能采取的策略和编码规则。

Swift Tip: OpaquePointer vs. UnsafePointer

objc.io 新文章,介绍了为什么将 C 类型导入到 Swift 时有些指针是 OpaquePointer,有些又是 UnsafePointer<struct_type>。如果你在开发中 Swift 需要与 C 交互的话,建议结合 Unsafe Swift: Using Pointers And Interacting With C 一起看。

最近很火的 Safe Area 到底是什么

iOS 11 出来很久了,适配的文章也很多,第一眼看到的时候我会觉得这个时候来写已经挺晚了,但看完之后觉得总结得是最好的,配图跟代码示例都有,重点的地方有加粗展示出来,这篇绝对值得 Mark 下来。

Pragmatic iOS Development: In defence of MVC

社区里广为流传着MVC 意味着非常臃肿的视图控制器,但其实这只是 5 年前 Twitter 上的一个玩笑。

在开发中,大量的元素都需要一个外部委托,如果它们都委托给视图控制器,控制器将迅速的膨胀起来。但我们可以尝试另一种做法,控制器将任务委托给单独的第三方对象,自身不包含任何业务逻辑,只负责根据数据提供 UI 逻辑交互。如此便能使控制器保持小巧灵活。

Writing declarative code using Result Extensions

Result 类型写 Extension 来编写声明式代码,创建高度灵活的代码和声明式 API,易于维护、阅读和测试。

Model-View-Controller without the Controller

觉得 MVC 不好用,想找点新思路?本文详细介绍了作者对传统 MVC 模式进行改造从而构建一种全新 ModelAdapter-ViewBinder (MAVB) 设计模式的历程,并提供了相应示例代码,对架构有兴趣的同学绝对不要错过。

Swift Algorithm Club: Hash Tables

英文的 swift 算法文章,介绍 Hash Table 的基本原理,A hash table is nothing more than an array,文章从数组出发,介绍哈希值算法,数组 Index 计算,处理 index 冲突,值检索等方面,从0用 swift 教你一步步实现一个 hash table

工具

Transformer:EASY iOS NSAttributedString!

一个在线的富文本编辑器,实时编辑富文本,然后转换生成 Swift 或 Objective-C 代码,目前支持 文字粗细划线样式文字大小前景色/背景色文字对齐 等功能,方便好用。

SwiftAI - Generate Model class from JSON

一个 Xcode 插件(也有独立 App),可将 JSON 转换成 Model,支持 CodableHandyJSON

代码

谷歌开源了一个 Promise 框架

标准的 Promise 库,谷歌出品,质量肯定是有保证的,具有轻量,高性能,安全,测试完备的优点。核心是使用 Objective-C 编写的,Swift 的版本是在 Objective-C 的基础上封装了一层(需要注意的是 Swift 版本暂时还无法用 Cocoapods 集成)。

Swift Design Patterns

Hacking with Swift 刚刚发布的 Swift 设计模式书籍 -《Swift Design Patterns》。售价 40 刀,目前包含了 24 个常见的设计模式。附源码,而且会随着 Swift 版本的更新免费升级。属于最佳实践类型的书籍,价格在英文原版书籍中也不算贵,有钱的童鞋可以买了看看。

本期编辑

@没故事的卓同学@四娘@mmoaay@享耳先森@EyreFree@Damonwong@折腾范儿_味精@张嘉夫@AidenRao

说明

🚧 表示需翻墙

老司机 iOS 周报 #5 | 2018-01-29

22 Dec 09:38

Choose a tag to compare

ios-weekly

欢迎 @张嘉夫@AidenRao 一起参与日后周报的编辑工作。

新闻

iOS 11.3 要来了,这是 iOS 11 目前为止最大的一次更新

苹果近期发布了 11.3 的开发者预览版,也一起发布了 Xcode 9.3 Beta,预计在春季正式发布(3 月)。这是 iOS 11 目前为止最大的一次更新,主要增加了电池健康状况查看,ARKit 升级至 1.5 版本,Safari 支持 service worker,以及其他很多小改进。

iOS 11.2.5 推送,Homepod 开始预购

苹果公司正式推送了 iOS 11.2.5 正式版更新,该版本加入了对 HomePod 智能音箱的支持,让其可以通过Siri朗读新闻(仅限美国、英国和澳大利亚)。此次更新的版本依然以修复 Bug 和安全漏洞为主。

同时 HomePod 也公布了上市时间,宣布在 2 月 9 日发售,1 月 26 日开始预购,首发国家只有美国、英国、澳大利亚。今年春季在法国和德国推出。但何时登陆中国市场目前尚未得知。

Apple’s augmented reality tool kit can now detect walls and 2D images in beta

ARKit 发布了一个重要的小版本更新:支持了垂直面检测,可以检测墙壁;同时也改善了对不规则水平面的识别;整体的追踪速度和精确性都得到了提高;呈现给用户的视频流也从 720p 提升到了 1080p,让 AR 体验更加真实。此外还有一个不显眼、但很有想象空间的更新是基于计算机视觉的内置 2D 图像识别,能够识别墙上的海报或画作等,可以用于判断场景中的位置,增加 AR 体验的连续性。 这一系列更新给 ARKit 应用带来了更多的想象空间,虽然 ARKit 目前的表现有些言过于实,但随着 Apple 更多这样令人惊喜的迭代,相信 AR 应用真正改变人们生活的那一天终会到来。

Swift 官方论坛迁移完成啦!!!

这周 Swift 论坛终于完成了迁移,对于 Swift 开发或者是细节决策感兴趣的人,可以去看看之前那些功能的讨论,例如 Swift 4.1 里新引入的“旧“成员 compactMap,或者是新的几个提案。

漏洞预警 | iOS WebView 跨域访问漏洞

早先被证实发生在安卓上的 File 协议跨域访问漏洞被确认 iOS 也存在,allowFileAccessFromFileURLsWebKitAllowUniversalAccessFromFileURLs 2 个开关控制用于允许 File:// 协议打开本地页面时任意访问本地路径文件与其他网络资源,这两个开关在UIWebView默认为开启状态,因此存在漏洞问题,WKWebView 默认关闭,无风险,但自行打开 allowFileAccessFromFileURLs 的一样存在风险(很多加载离线网页的博客文章教人打开这开关),解决办法:迁移至 WKWebView 并且确保不自行打开开关。

小程序支持跳转 App 了

对于开发人员来说,相比新闻本身,更需要关注的是打开 App 以及 App 链接分享到微信打开小程序的代码怎么写?有兴趣或者已经有需求的童鞋可以参考这两个链接进行实践。

文章

YYCache 源码解析

YYCache 是知名的 key-value 线程安全、高性能缓存组件。@J_Knight_ 从使用方法、架构设计、代码讲解三个角度详细的分析了 YYCache 的实现。

函数式编程圣经

知名公众号“码农翻身”老刘继《面向对象圣经》之后的又一力作《函数式编程圣经》,在这篇文章里,神五天创造不变量、纯函数、递归、高阶函数,让上帝为你解释函数式编程发展的来龙去脉,以及为什么函数式世界的程序员每周能休息两天。

Weex + Ui - Weex Conf 2018

介绍了 weex 在飞猪的实践经验,在飞猪使用 weex 后:首屏可用时间降级 68、Bundle大小直接减少了 73%,由于体验变好变快、让我们页面转化率居然提升了 14.5%。也分享了 Weex 页面在飞猪、手淘、支付宝进行多端投放的思路。

最后介绍了 weex 业务在阿里集团使用过程中产生 weex-ui 开源库的过程。

JS 在微信、微博、QQ、Safari 唤起 App 的解决方案

经过长时间的实验,总结微博、微信、QQ、Safari 在 iOS 及安卓平台,唤起 APP 成功及失败的解决方案。

实现用户点击 H5 页面的打开 App 或者下载按钮,如果用户已经安装了 App,则根据业务跳转到相应的 Native 页面,如果用户没有安装该应用,则跳转 AppStore 或者应用市场去下载 App。

2018 iOS 社招面试经验

Offer 收割机手拿阿里、滴滴、美团等六家 offer,来分享自己的复习资料、面试遇到的知识点、以及面试准备方式,并介绍面试的各公司的流程和风格,本文需要付费才能阅读完整文章

面向对象的 JavaScript 编程:原理与实践

如果你是一个刚接触 JS 的其他语言开发者(比如作为一个客户端对现在的大前端方向有浓厚兴趣),看到 JS 的面向对象编程一定觉得诡异无比无法理解,那么看看这篇有助于帮你解惑。

实现一个 JavaScriptCore 的 debugger —— iOS 篇

这篇文章里教你如何在 iOS App 里亲自实现一个 JS 的 debugger,首先教你如何用 JavaScriptCore 的源码在项目中 build 起来,然后继承 JSC:Debugger 重新实现一个 MyDebugger,这样就可以自行定义 debug 能力了,可以在 debugger 触发的时候由 App 自行开发相关的功能,自己在 App 里写一个 devTool 也未尝不可。

🚧 Getting started with Bluetooth Low Energy on iOS

介绍了和蓝牙外设通讯需要了解的一些概念,并且用一个实例演示了如何使用 iOS 的 CoreBluetooth 框架进行开发。CoreBluetooth 的入门使用 Raywenderlich 上的 Core Bluetooth Tutorial for iOS: Heart Rate Monitor 介绍的也很清晰。

软件工程师需要了解的网络知识:从铜线到HTTP(一)—— 前言

这是一系列文章,其目标是让软件工程师了解网络各层的本质。系列文章从网线开始讲起,一路带你了解 以太网TCP/IPHTTP/HTTPS,建议精读。

Recreating the Apple Music Now Playing Transition

从零开始实现一个 Apple Music 的 Now Playing 动画,主要基于 StoryBoardAuto Layout constraints Animating

Simplifying Swift framework development

介绍了两个简化 Swift Framework 开发的小技巧:

  • 使用 @_exported 声明引用,从而不用在每个 Swift 文件中都进行声明,类似 Objective-C 中的 Prefix Header;
  • 通过 class 的方式生成 Bundle,并定义成 Constant,从而更方便地获取 Framework 中的资源文件。

How to create a complex loading animation in Swift

raywenderlich 的教程一直以通俗易懂闻名,这次推荐的是一篇一步一步教你实现复杂动画的教程,使用的核心技术点是 CAAnimationGroup。如果你没有时间一步一步跟着实现,也可以通过这个地址直接下载,查看完整的 Demo 工程。

Creating Flows

流程是用户交互设计的一个重点,例如说注册,我们不会给用户展示一个长长的列表去填写信息,而是会切分成多个页面去让用户逐步完成。那么我们该如何使用代码去组织这样的流程呢?在这篇文章里作者就深入地探讨了如何使用低耦合的组件来完成这样一套流程。

中文文案排版指北

在我们的日常工作中,经常需要编写一些文案、材料、报告之类的文本,大家应该已经非常熟练了。不过,大家是否有认真考虑过自己的标点、空格等的使用是否妥当呢?这篇文章给大家进行了较详细的分析,希望大家阅读后结合自己的思考,统一中文文案、排版的相关用法,形成自己(或团队)的排版规范。

为什么要缓存 NSDateFormatter ?

创建一个 NSDateFormatter 对象并不像我们想象的那样轻巧,如果你需要频繁使用某个 formatter 的话,对它进行缓存可能是一种更高效的方式。本小结阐述了问题的原因和推荐的缓存方式,值得一看。

🚧 A better way to update UICollectionView data in Swift with diff framework

借助 Diff 算法,以更高效的方式去刷新 UICollectionView。文章简单的介绍了一下 DeepDiff 这个库的原理及如何通过两个数组的差异对一个 UICollectionView 进行局部刷新。

工具

WoodPecker

app 运行在真机时如何实时查看沙盒中的文件状态?@张小刚哟 开发的 WoodPecker 通过 app 创建和 mac 客户端 socket 连接来解决这个问题。除了进行基本的沙盒文件查看修改外,还可以自定义通信报文创建扩展插件,对于某些场景中调试非常实用。

目前缺点是提供的 framework 需要手动集成到应用中,还未支持 cocoapod 导入。售价 30 元,感兴趣的朋友可以体验一下。

Fastlane: Boarding

原来添加一个 testflight 测试用户需要登录到 ITC ,手动添加邮箱。使用 boarding 可以简化这一过程。

iOS 爆内存问题解决方案 - OOMDetector 组件

本文将介绍一款 iOS 爆内存分析利器,它可以以极其微小的代价让藏匿极深的爆内存罪魁祸首无处遁形 —— OOMDetector。OOMDetector 是手 Q 团队自研的 iOS 内存监控组件,腾讯内部目前已有多个 App 接入了 OOMDetector,它主要有以下两个功能:

  • 爆内存堆栈统计:负责记录进程内存分配堆栈和内存块大小,在爆内存时 Dump 堆栈数据到磁盘;
  • 内存泄漏检测:检测内存泄漏,目前支持 Malloc 内存块和 OC 对象的泄漏检测。

OOMDetector 可以快速帮助开发者发现和定位 App 爆内存问题和内存泄漏,组件目前已在 Github 开源,感兴趣的同学可以尝试使用。

代码

AppFolder

AppFolder 是一个轻量级框架,用于友好的展示 App 文件夹内的目录,而且是强类型的。系统目录如 “Caches” 和 “Application Support” 已经存在,开发者也可以用几行代码添加自己的目录。AppFolder 充分利用了 Swift 的继承优势,接口简洁而又美观。有了它,你再也不需要用到 NSSearchPathForDirectoriesInDomains,再也不会。

刷新:重新发现商业与未来

微软第三任 CEO Satya Nadella 写的书。书里介绍了他接任后对微软的改造,强调企业文化,重拾微软灵魂的过程。书中也介绍了微软业务转型过程中的一些决策过程,比如拥抱云计算、Office 在全平台的推广、Windows 10 的免费升级策略,收购 LinkedIn 等。最后一部分还谈了他对未来科技发展三个大方向的思考:虚拟现实、AI、量子计算。

音视频

比特币原理

视频通过一个虚构的例子,一步一步由浅入深地介绍比特币是什么,以及比特币的基本工作原理。

本期编辑

@没故事的卓同学@四娘@mmoaay@享耳先森@EyreFree@Damonwong@折腾范儿_味精@张嘉夫@AidenRao

说明

🚧 表示需翻墙

老司机 iOS 周报 #48 | 2018-12-17

22 Dec 09:57

Choose a tag to compare

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

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

福利

🌟 我们发福利啦~

周报已经快陪伴大家走过一年的时间,非常感谢各位朋友的支持和厚爱。为了在 2019 年能更好地为大家服务,我们举办了一个问卷调查活动。在 12 月 27 日,我们会在参与问卷的朋友中选取合适的几个人赠与学习大礼包和现金奖。至于奖品是什么,大家可以在这条微博中了解,转发还有额外的抽奖~我们渴望听到你们的声音!

新闻

2018 App Store 年度颁奖典礼

Apple 的年度 app 精选又出炉了,为了介绍和表彰获选 app,这是 App Store 和 Apple 官方微信联合呈献的 2018 App Store 年度颁奖典礼,欢迎围观下载。

Perfect 4 将会使用 SwiftNIO

SwiftNIO 是一个跨平台、异步、事件驱动的网络应用框架,可用于快速开发和维护高性能的网络协议服务器和客户端。对比同样是 Swift 服务端的框架的 Vapor,已在今天 5 月发布的 Vapor 3 中全面使用了该框架。当然作为一个底层框架,你一般不会直接和它打交道。

文章

🌟 🐕 解密 Runloop

很显然,Runloop 是一个很熟悉的名词,熟悉到每次面试都会碰到有人问你,请说说你对 Runloop 的理解。Runloop 是开源的,因此本文作者通过精简后的源码示例来解释 Runloop 的基本执行顺序。

  • 基本流程:循环执行(执行任务->通知外部->休眠)。
  • Runloop 依赖 mach_msg 进行进程间通信,也就是消息接收发送。
  • Runloop 里面会执行 source0(可调用 CFRunLoopAddSource 创建),source1(仅系统调用)。
  • Runloop 会执行5类任务 timer, mainQueue, source0, source1, block
  • Runloop 通过注册 observer 的方式来通知外部当前的任务执行状态,而5类任务中 mainQueue,source1,block 不支持注册 observer,也就是你无法通过 obsever 来得到准确的执行时间。
  • RunloopActivity 也是通过 observer 来通知外部当前处于哪个 Activity,当 source0 被执行的情况下,kCFRunLoopBeforeWaitingkCFRunLoopAfterWaiting 会被跳过,意味着单纯通过对 Activity 的回调进行分析业务代码的执行状态是不可靠的。
  • Runloop mode 分为 common modeprivate mode,作者通过捕获 mode 得到了很多陌生的 private mode,分别用来处理不同的场景,例如 _kCFStreamBlockingOpenMode 用来调度网络任务。因此,NSTimer 在设置 kCFRunLoopCommonModes 的时候,也有可能因为 private mode 的调用从而导致延时。
  • Runloop mode 可以中途切换,有以下几种切换位置:
    • sleep 之前
    • 执行 mainqueue 任务前
    • exit 之后
  • Runloop 的运用场景:
    • 执行自己的任务,如 timer
    • 用于观测主线程的运行状态

延展阅读

🌟 🐢 一个 Demo 入门 Flutter

最近,已经有许多的公司开场尝试使用 Flutter 进行开发。就在前两天,Google 刚刚在北京举办了 Flutter Live 大会,可以说,Flutter 的生态已经越来越庞大。今年,如果对 Flutter 还是一无所知的话,是不是有点 out 了呢?没关系,这不,就有一篇教大家入门的文章。文章不仅讲了 Flutter 的基本结构,还用实际的代码编写了一个 Demo,想学 Flutter 的同学不妨跟着做一遍,相信比单单看文章更有效果哦。

🐕 A modular analytics layer in Swift

在公司里撸业务的开发同学对数据打点应该都不陌生,很多需求甚至一半的时间会花在实现打点逻辑上面,本文提出了一种抽象打点层的设计,用很 Swifty 的方式实现了可扩展(无痛添加新的 event),和后端解耦(切换打点 backend 不需要重构客户端打点代码)以及易配置(不同的打点携带不同的参数)。本文所体现的设计方面的思考对打点之外的一些公共组件的设计也能起到一定的指导作用,值得学习。

🐢 Seemingly Impossible Swift Programs

本文借助 “Swift 中判断函数相等性” 的命题极力使用简单的描述和循序渐进的过程来讲解复杂的拓扑数学。

在建设性数学中,任何命题都可以转化为类型,任何证据都可以转化为这种类型的值。这使得我们能够将函数抽象成计算过程和返回值。在拓扑数学中,无限多数据的行为也会表现得像有限集合。 这使得我们可以证明这些计算过程的相等性。

虽然论证的过程和结果对于日常的 Swift 开发并没有用,但希望它们可以让你对数学燃起兴趣并感到敬畏。要知道数学已经能够产生这样一个违反直觉的结果,并对其原因进行极其简洁的解释。你甚至可以相信数学是指导你如何更好完成编程的灯塔。这些简单的数学结构(Functions, Monoids)构成了抽象的强大基础,而不像项目中的那些设计模式,过于复杂且只解决特定问题。

🐕 使用 Metal 和 Core ML 评价照片质量

文章展示了常规算法+机器学习来评价照片质量的方法,常规算法使用 Metal 处理图片,根据饱和度、亮度、模糊度和颜色分布得出客观评分,机器学习则使用 Core ML 加载 NIMA 模型预测主观评分。得到照片评分后,再检测相似照片,最终挑选最优的照片推荐给用户。

demo 中给出了 Metal 版边缘检测滤镜与图片特征向量提取的代码,可供学习参考。文章还总结了开源模型转化为 mlmodel 过程踩的坑。

🐢 Why should we use Swift over Objective-C?

Swift vs Objective-C,到底该怎么选?如果你正在纠结这个问题,请细读此文。

Objective-C 有着几十年的历史,更稳定;Swift,更现代化的语言,有许多先进特性,文章从多个角度对比了两种语言的优势和劣势。

🐕 Strategy pattern in Swift

文章作者提出了一种用 Strategy pattern 思路来统一代码接口的做法。如果你对 Strategy pattern 不是很熟悉的话,可以看一下 Wiki 中这里的介绍。

这种模式在现实场景中有时候还是能起到一定的作用的,有兴趣的同学不妨读一读文章,说不定以后就用上了呢?

🐕 Using errors as control flow in Swift

本文重点集中在使用 errors 上,主要介绍了一些用 errors 来进行处理能有明显优势的场景,而这些场景主要包括了函数输出结果的错误的处理,输入参数验证和测试中错误的抛出等。

由于 Objective-C 或多或少的影响,很多同学在写 Swift 的时候依然没有习惯用 errors 来进行错误处理。如果存在这样的情况的话,不妨可以从下一次小 refactor 中出发去寻找有没有可以使用的场景,多尝试,逐渐就能习惯使用。

🐕 Xcode UI Testing Cheat Sheet

文章列出了 UI Testing 常用的代码片段,除了对 API 的梳理,还有对各种常见问题的解决方案,可以作为 UI Testing 的快速入门,也可以作为知识库以备日后查阅。

🐢 质量监控-图片减包

本文作者提供了三种方法,通过对图片资源的处理以达到减小包大小的目的。这三种方法分别是:

  • 使用工具压缩图片
  • 查找删除重复图片
  • 查找复用相似图片

作者不仅详细讲解了具体的实现原理,还提供了相关实现代码。有兴趣的同学可以参考作者提供的方法,对自己的项目进行改造优化。

🐢 Metal 专辑

Metal 官方文档的中文翻译和 Metal 相关技术博客,适合英文不太好的同学。

🐎 【AR 开发】ARKit 和 ARCore 功能对照表与定位场景总结

ARKit 和 ARCore 功能对照表与定位场景总结,如果您同时开发 ARKit 和 ARCore,可能会用得上。

设计

🐎 Animations in iOS: 30 beautiful examples

有一些 iOS 动画真的很神奇,顺滑和友好的过渡动画能够指引流程,让用户理解下一步操作,即使盯着进度条也能感觉愉悦。下面请欣赏文中列出的 30 个动画杰作。

代码

Kingfisher 5.0 发布

喵大的 Kingfisher 迎来了5.0的大版本更新,更新日志中的 Reborn 一词意味着重大更新。

Kingfisher 是一个轻量级的、纯 swift 网络图片加载库。虽然是大版本更新,但是 API 的变化不大,如果你从4.0升级到5.0或许只需要几分钟处理一下警告和错误。其中最大的变化就是提供了更好的缓存策略。因此,同学们可以考虑升级一番。

  • 加入 Result 类型取代原来的 tuples 回调
  • 为了方便调试追查错误,返回错误信息增加了错误原因和必要的关联信息
  • ImageCache 重写,提供内存和硬盘缓存策略,API 兼容旧版本,同时提供了控制缓存最大值,是否预缓存等等配置
  • 缓存策略:先搜索内存,没命中则搜索硬盘
  • 支持 ImageDataProvider 协议加载本地图片

更新详情请参考:

Swift 官方 Docker 镜像

苹果维护的 Swift 镜像,现在已经被 Docker 官方收纳。因此只需要执行 docker pull swift 即可方便搭建 Swift 的各个版本环境。目前来看苹果对于此镜像的维护程度还是蛮高的,最新支持到 Swift4.2.1 版本,与开发版本同步。

音视频

🌟 Functional Swift Conference 2018

Swift 从诞生之日起,就具备了海量的函数式编程特性,无论是 enum 和 optional 的实现,或者是函数被当做一类公民,整个语言能看到不少 Haskell 的影子。自然,Swift 在实现一些函数式的思想和特性也非常的得心应手。Swift 的函数式编程,目前最经典的应用场景主要还是构建响应式的 viewmodel。如今,越来越多的人开始探索其他场景。Functional Swift Conf 是一个在纽约举行的,专门探讨函数式 Swift 的技术大会,如今已经放出所有的 presentation,其中除了一些 reactive view model 这样耳熟能详的话题之外,还有关于 state 管理、可组合 UI 等很有趣的内容。对函数式编程感兴趣的同学不容错过。

ggtalk | 要不要买 HHKB?我问了七位用户,听听他们怎么说

键盘,尤其是机械键盘,一直是程序员们居家旅行最重要的单品。甚至对于大多数程序员来说,键盘可能是极少数不多的可以让自己愿意一直花钱的东西,这就牵涉出一个话题:对于大多数程序员而言,什么键盘才是自己的最后一把键盘呢?本期 ggtalk,几个程序员针对这个话题,聊了聊自己使用 hhkb 的感受,有兴趣的同学可以听听。

PS:节目里没有严谨客观的评测。主观感受居多,比较轻松。

🚧 MVC is Not Your Problem - Joachim Kurz - UIKonf18

近年来,MVC 开发模式饱受争议,还经常被人抱怨说在这种模式下写出来的代码太多,耦合太重。于是就有很多人力图通过不断分解和改良 MVC 模式来解决它带来的问题。

UIKonf 上的这场分享就是从 MVC 切入来讲架构设计的。一开始先是介绍 MVC 模式,随后指出了很多人都误解以及用错了 MVC(分享中引用了很多参考资料,调研很充分),继而引出了大家容易忽视的点:有问题的不是架构模式,而是使用方式。即使是其他的架构也会带来其他的问题,如何通过 MVC 以及其他架构来达到开发目的才是重点。

本场分享者 Joachim Kurz,他的观点很明确,做架构设计,不需要刻板的遵循和套用规范,可以通过寻找合适的分解维度(分享的最后有介绍,27 分钟之后),让架构变得合理易懂即可。架构设计适可而止这个度是比较难把握的,需要深入具体需求场景(分享中举了几个例子,其中有介绍一个页面用到 10 个 ViewController 的),在平时的开发过程中不断实践和总结。

内推

关注我们

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

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

本期编辑

@四娘@享耳先森@Damonwong@张嘉夫@AidenRao@Parsifal@aaaron7@tom510230@anotheren,[@水水](https://www.xuyanlan...

Read more