Skip to content

Releases: SwiftOldDriver/iOS-Weekly

老司机 iOS 周报 #42 | 2018-11-05

22 Dec 09:54
Compare
Choose a tag to compare

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

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

小专栏

北美软件工程师面试简单介绍

好多同学都比较好奇北美的软件工程的面试和国内的有什么不同,具体情况又是如何的,这篇小专栏就简单的给大家介绍了一下北美的 Software Engineer 的面试情况,有兴趣的不妨读一读了解一下。

新闻

App Store Connect API Now Available

WWDC 2018 中苹果提及了 App Store Connect 将迎来一次比较大的更新,其中有两个内容比较受国内开发者关注 - TestFlight Public Links 和 App Store Connect API。前者已经在前一段时间发布了,而后者这周也正式发布。

相关功能介绍可以在 What’s New in App Store ConnectAutomating App Store Connect 中进一步了解。

文章

🌟 🐕 支付宝客户端架构解析:iOS 容器化框架初探

你是否好奇一款航母级 App 他的内部客户端架构是怎样实现的?到底什么样的架构设计才能满足几十上百人共同开发迭代一款 App ?这篇文章会带大家深入到支付宝的 mPaaS 框架之中,了解一下支付宝客户端业务容器化的实践 -- 将业务隔离成相对独立的模块,而整个框架作为容器管理着众多子业务子模块,并着力追求模块与模块之间高内聚、低耦合,灵活的插件式开发。

mPaaS iOS 框架源自于支付宝客户端,为了实现这种上千个工程之间的低耦合和相关依赖调用,mPaaS 框架直接接管了 App 的生命周期,负责整个 App 启动托管、App 生命周期管理、处理与分发 UIApplication 的代理事件。mPaaS 框架提供了容器化环境,业务开发人员在这个容器化环境中使用 微应用微服务 进行具体的业务需求开发。

🌟 🐎 The power of key paths in Swift

由于 Swift 是一门追求编译时安全和静态类型的语言,它缺少其它更注重运行时的语言(Objective-C、Ruby 和 JavaScript 等)所拥有的动态特征。例如在 Objective-C 里,我们可以在运行时动态访问对象的任意方法和属性,甚至可以替换其实现。虽然动态性的缺失是 Swift 的一大优势之一,有助于写出容易预测、正确率更高的代码,但在某些时候,如果能用更动态的方式来使用代码,会很有帮助。幸运的是,Swift 正在不断推出更多更动态的功能,同时仍然保持类型安全的原则,key path 就是其中之一。在这篇文章里,会为你展示 key path 在 Swift 中的使用方式,以及利用它实现的一些强大功能。此外,还可以参考这篇文章 Swift Tip: Auto Layout with Key Paths

🌟 🐢 Protocol Oriented Programming(POP) in Swift: Is it better than Object Oriented Programming(OPP)?

自从 Swift 2.0 引入面向协议编程(POP)这一概念以来,已经有成百上千篇关于这一概念的讨论文章,本次作者以专注编码 30 年老司机的身份,在实际开发中大量运用 POP 模式之后,写出了他心目中的 POP。本文将由以下几点展开讨论:

  • 为什么 Swift 被认为是一门面向协议的语言;
  • 比较 POP 与 OOP 的异同,指出他们主要区别在于能否实现多继承;
  • 对比值语义与引用语义的区别;
  • 分析了苹果在 WWDC 2016 提出的 “局部推断(Local reasoning)”;
  • 举了 Protocol 的几个使用场景:如实现委托模式、作为类型和实现多态;
  • Review 作者在 Swift 项目中的实践代码;

至于作者对 POP 最终的态度,点进来看看吧,另外有兴趣的话不妨看看作者的前一篇关于 POP 的入门文章

🐕 React Native 重构路线图发布!

Facebook 6月中旬发布了他们即将“大规模重构 RN” 的消息,时隔四个月,近期终于公布了他们的一些计划细节,不过大部分都是工具链,流程上的增强。颇有一种裤子都脱了就给我看这个的感觉,不知道是不是对“大规模重构”有什么误解。这些增强虽然普通开发者可能感触不深,但对于一个团队做技术选型时候肯定是有帮助的,但是不是真能抵挡住 Flutter 的冲击呢?我表示不乐观。

🐎 Speeding Up Custom Script Phases

文章主要介绍了三种方案来加速 Xcode 自定义脚本的执行。

  • 第一种:勾选配置项中的 when installing,标识 APP 只在 Archive 模式下才执行脚本。
  • 第二种:添加你自己的逻辑代码来标识脚本的执行程度。
  • 第三种:利用两个可选项 Input Files 和 Output Files,这两个列表中填写为文件路径或文件夹路径,它们就是 Xcode 来判断脚本是否需要执行的依据。

对于最后一种方案,文中表达不是很明确,我花了点时间做了一个实践,最后归结如下,Xcode 会重新执行脚本的条件如下:1. 两者中任一文件修改。 2:两者中任一文件夹内有文件添加/删除/替换

在 Xcode 10 之后脚本增加为4个可选项,除上面表述的两个外,还有 Input File List 和 Output File List。如有兴趣可以参考 [New Feature] Generate xcfilelist for Script Build Phases 文中对于 File List 的看法。

🐎 Running Other Apps' Siri Shortcuts Through Deep Links in Swift

文中作者展示了使用 Deep Link 来打开捷径的案例。通过 shortcuts// 这个 URL Scheme 来跳转捷径应用。若 URL 中的 Path 为 run-shortcut 则可以去执行捷径,当然我们可以通过参数 name 来指定执行对应的捷径,input 参数来为你的捷径增加入参,x-success/x-cancel/x-error 参数来为你的捷径提供执行状态的回调处理。此外,作者还介绍了具有导入功能的捷径 URL 和 一些捷径 APP 的配置页面。

🐕 Let's Set Up Your iOS Environments

本文介绍了一些对于新手来说非常实用的 Xcode Project 设置的小知识:使用 .xcconfig 文件来合理设置工程。这东西可能在工程体量还不是很大的时候,显得不是那么的重要,但是当工程逐渐变大,结构也变的越来越复杂的时候,有一个清晰合理的结构,容易配置的工程对整个团队来说都是一个福音。

🐕 Text Kit Tutorial: Getting Started

TextKit 是 iOS 7 开始推出的图文混排框架,其基于底层的 CoreTextUIKit 中的 UILabelUITextViewUITextField 都构建在 TextKit 之上。本文介绍介绍了两部分内容:如何适配 Dynamic Type 特性;如何实现图文混排及文字环绕图片布局。

🐕 【基本功】深入剖析Swift性能优化

这篇文章的核心内容出自 Understanding Swift Performance,主要讲了 Swift 的一些优势以及苹果做了哪些方面的优化。所以推荐每个 Swift 的开发者都要仔细看一下这个 Session 的内容。

当然,因为 Swift 在不断的优化,视频内容的部分东西已经有点点过时了。我稍微补充一下:

  • Existential Container 目前虽然是用 3 个 word 存储数据,但是在 ABI 稳定之前,这个大小一直还没有确认。同时,文中所说的 Existential Container 是 5 个 word 也不太恰当,更合理的是大于 4 个 word。比如 Any 的 Existential Container 只有 4 个 word,而 Codeble 的 Existential Container 大小为 6 个 word。
  • 其次,对于 Indirect Storage With Copy-On-Write 的说法,在 Understanding Swift Performance 指的是 Swift 3 的时候,类似于 Array 这类基础库的大数 struct 如何解决 Copy 问题。而不是对于所有 struct 实现了这个 COW。但是 Swift 4 的时候,苹果改变了策略,在编译器这边做了一定的优化,实现了“自动”实现 COW。

🐕 One Quick Way to Drastically Reduce your iOS App’s Download Size

大家都知道,app 的下载体积越小,用户需要等待的时间就越短,尤其是对于用 Swift 开发的 app,体积动辄几十兆,令人头疼。本文作者分析了影响 app 体积的几个方面和一些优化的方法,包括 bitcode、使用 xcrun 命令分析各部分所占空间等等。

🐕 深入理解 Autolayout 与列表性能 -- 背锅的 Cassowary 和偷懒的 CPU

Autolayout 的性能一直为人所诟病,也是列表卡顿的原因之一。本文作者从 Autolayout 的算法角度进行分析,介绍了 Cassowary 的基本原理,并根据文字渲染结果做了一些详细的测试,判断性能问题是苹果实现不当所致,而不完全是算法的原因。最后也介绍了作者自己实现的 Panda 框架,基于 Autolayout 算法的概念进行优化,感兴趣的朋友可以试一下。

🐎 Class written in Swift

纯 Swift 类的函数调用跟 OC 中的运行时消息发送机制是不同的,是在编译阶段就确定了调用哪一个函数。虽然 Runtime 的接口可以使用,但是却并不能保证返回结果的正确性。作者在自己写的某个开源库上的一个 issue,由于和 Swift 类有关,研究了下 Swift 编写的类。对于在使用 Swfit 过程中,在 Debug 或者其他情况有疑问的同学,可以看一下本文的分析。

🐕 Specializing protocols in Swift

这周的 Swift by Sundell 介绍了一个很有趣的泛型功能 —— 泛型协议特例化。这是 Swift 4 时引入的功能,让我们在继承泛型协议的同时约束 associatedType 的类型,听起来很拗口难懂,目前在标准库里有一个非常标准的示例 SubSequence,大家一看就能理解:

protocol Sequence {
    associatedtype SubSequence : Sequence
    ...
}

protocol Collection: Sequence where SubSequence: Collection { ... }

Collection 通过 where 从句对子序列的类型进行约束,让 Collection 的子序列必须也遵循 Collection(而不只是 Sequence)。

如果你觉得这个例子离业务太远的话,那就可以看看 Sundell 在文章里介绍的一些离业务更近的用例。

工具

iOS Project Template

这是一个可进行代码签名、持续集成、项目分发的项目模版。它为新项目提供了一个起点,可以方便的进行项目构建。这个模版中提供了一个 Core 框架,要想用于自己的项目,还需要修改一些文件的某些配置和内容。感兴趣的朋友可以试试看,或许它能够帮到你。

Eliminate Unused Swift Code

这是一个可以移除 Swift 项目中所有没用到的代码的工具,帮助你把项目变得更加干净。注意目前版本的 CocoaPods(1.5.3) 会导致它不能正常工作,升级到 1.6.0.beta.2 即可。这个工具免费即可使用,但是充钱可以变得更强。

代码

CodyFire

CodyFire 是基于 Alamofire 的 Codable 协议 API 请求管理库,使你庞大的网络请求代码,变的更简洁,易于维护。Swift 由于类型安全的特性,对于像 JSON 这类弱类型的数据处理一直是一个比较头疼的问题。Swift 4 中新增的 Codable 协议解决了字典与模型之间转换的问题,Codable 协议也让 API controller 的构建代码变的十分优雅。 CodyFire 能自动根据所运用的环境,切换 baseURL,能方便的添加公共头、对异常状态统一处理、对请求进行取消、设置超时,或者预防请求返回过快,添加交互式延时(不用再担心,网络太快,等待动画没有很好的执行。小编和 CodyFire 作者都非常喜欢这个功能)。还能串行或并行,使用链式调用进行多个请求,并对结果进行统一处理。

内推

关注我们

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

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

本期编辑

@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal@aaaron7kyotom510230anotheren水水looping@JasonYuh,[@老老老老老老老驴](https://weibo.com...

Read more

老司机 iOS 周报 #41 | 2018-10-29

22 Dec 09:53
Compare
Choose a tag to compare

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

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

小专栏

[译] Swift 标准库源码阅读指南

对于 Swift 开发者来说,Swift 标准库的开源可以说是很值得高兴的事情,因为我们可以在标准库中学到很多优秀的设计以及了解具体的实现逻辑。当然,很多人可能和我一样,不知道如何在本地搭建一个可编译的 Swift 标准库。这篇文章就提供了一个很通俗易懂的教程,如果你对阅读源码感兴趣,可以借助这篇文章,在自己的电脑搭建一个 Swift 标准库项目,然后在闲暇之余看一看里面的代码。

文章

🌟 🐕 iOS 内存管理研究

来自周报编辑 Jason Yu 同学的大作。

虽然现在 iOS 设备的内存容量越来越大,很多时候开发者也不再需要去考虑内存占用的问题。但是,当产品越来越大,功能越来越复杂的时候,内存优化依然会成为一个避不开的问题。

本文介绍了 iOS 内存管理的一些基本知识,同时也涵盖了在解决 OOM 问题时候的一些小技巧。若是你对 iOS 的内存优化依然存在一些问题,相信读完文章能让你有更加清晰的了解。

🌟 🐢 iOS 系统中导航栏的转场解决方案与最佳实践

在 App 开发阶段,涉及到导航栏样式改变的需求时,经常会遇到转场效果不佳或者与预期样式不符的“小问题”。本文由美团技术团队出品,详细讲解了 UINavigationBar 的生命周期、导航栏样式转换的时机,同时给出了相关最佳实践,建议仔细阅读。

🌟 🐢 iOS UI Automation Tests at Babylon

UI 自动化测试是非常不好做的,如果拿捏不准很容易导致它变成投入产出比低、维护成本高、稳定性差的一个失败项目。所以在使用自动化测试验证产品功能的同时,也要投入人力在解决技术本身的问题上做深入研究。本文就描述了他们在使用自动化测试时遇到的问题,以及如何解决的。可以看出他们在处理测试场景失败率高和测试效能低这些问题上有自己的最佳实践,特别是对网络请求这块问题的处理思路,非常值得借鉴。要想把自动化测试做好或者正打算做自动化测试的团队可以仔细研读参考下。

🐎 【QCon2018】Flutter & Dart三端一体化开发

Flutter 可以说是 2018 年移动开发领域最热的技术, 不论是跨平台+独立渲染的工作机制,还是 Google 积极推广的下一代移动 OS:fuchsia 的核心开发框架,都为 Flutter 赚足了眼球。而闲鱼作为国内第一个认真使用 Flutter 的团队, 为 Flutter 社区带来了非常多有价值的内容。本文介绍了闲鱼目前正在践行的“三端一体化开发”概念。什么意思?就是不仅通过Flutter 实现 iOS,Android 端都用Dart 来开发,而且还使用 Dart 来构建微服务的胶水层,由客户端开发同学自己构建需要用到的服务与接口,并且通过一系列工具链的完善提升开发效率。当然,任何听起来过于优雅的方案都免不了会踩坑,不过可以预见的是这套架构在绝大多数场景下能够显著提升整个业务迭代的效率。(麻麻再也不用担心客户端和后台 debug 时互相甩锅了)。

当然,这样“胶水层”要 work 的前提是,有一套很优雅鲁棒稳定的底层服务与接口,能够让胶水层中各种组合与调用,这一点对于目前国内很多野蛮生长的互联网公司来说还是挺难的。

🐎 Flutter瘦身大作战

这篇文章依然是闲鱼团队带来的 Flutter 使用经验,从 iOS 的编译产物构成角度,深度探讨了如何对 Flutter 项目进行瘦身优化。从文章中可以看出,除了一些常规的编译指令优化,符号文件移除,资源精简等方面,显示的进行类型转换也会导致包大小的增加,看起来主要是编译系统自动增加的一些异常处理导致的。

🐎 从爬虫攻击者角度谈客户端 API 安全设计

本文介绍了基本的 API 被逆向的实例,提醒开发者需要多注意安全防护。
常规的 API 安全,需要做好安全保护,见招拆招,加大逆向难度:

  • Android 必须混淆加固,防止源码简单被逆(iOS混淆作为可选项)
  • 请求使用 HTTPS,防止内容被抓包,安全要求高的,可以开启双向校验,需要注意证书的过期问题,做好证书更新功能。证书内容最好以字符串的方式写入到程序内,以防止文件容易被解压得到
  • 请求携带签名签名算法通常使用 token + params + 盐值 进行算法计算,算法最好使用 C/C++ 编写,并且混淆加固,防止被轻易破解进行篡改或者伪造请求
  • 异常请求进行限制,如:ip 在短时间内大量访问,请求重复提交
  • 通过 Cookie Session/OAuth/JWT 等方式进行鉴权校验,进行权限管理(可阅读下方链接深入了解)

延展阅读:

🐕 Best strategies for configuring multiple environments in Xcode projects

在 Xcode 项目中配置不同环境,很多人会选择添加 Target,但这并不是一个很好的方法,太重了,你需要维护多个 Target 及它们的 Info.plist。最好的策略是添加新的 Configurations,然后给其设置该环境下的 xcconfig 配置文件。还能在 Build Settings 里为 Configuration 设置不同的 bundle identifier、产品名称,应用图标,使它们能同时运行在一个手机上,并得到很好的区分。

🐕 将 75000 行原生 iOS 应用程序移植到 Flutter 后,结果太惊讶!

原文:Porting a 75,000 line native iOS app to Flutter

吐槽一下翻译文的标题,浓浓的国内枪文的感觉。但是,讲回来这篇文章本身的质量还是非常不错的。

文章作者是澳大利亚的 Easy Diet Diary App 的作者。他们之前有 iOS 版本,也一直计划出一个 Android 版本,鉴于两个代码库的复杂度一直没有施行。

在进行了 Flutter 重构之后,作者发现代码量相对于之前 Objective-C 和 Swift 混编有了很明显的下降。大部分少掉的代码量来自于 Storyboard 被 Widget 替换,这也是 Flutter 从一开始就在设计上的一个优势。

文章对还没尝试过 Flutter 的开发者来说,是个可以借鉴的参考。

🚧 🐕 Building an iOS App Without Xcode’s Build System

本文主要介绍了一个简易 App 的构建流程。

其并非一个纯理论的构建描述,而是将整个过程分解成多个步骤,主要分为编译源文件、编译&拷贝资源文件、拷贝 Info.plist、拷贝 Swift 运行库、签名和安装。文中作者有心地附注了相应脚本以及相关原理,读者可以跟着作者,完整实验作者的每一个步骤,更加深刻地了解到一个 App 整体的构建流程。另外,在文末作者留了几个可继续实验钻研的方向,可供读者继续深入探究。

文章对于未了解过 App 构建流程的开发者来说,是个不错的参考。

🐕 从汇编代码探究 NSClassFromString 实现

虽然在 iOS 中,Foundation 库是不开源的,但是可以通过一定的方法,取得其编译后的汇编指令,对于有一定汇编知识的人来说,可以大致推断出某些接口的大体实现细节。本文作者通过开发中遇到的一个问题,刨根问底,对于 NSClassFromString 这个方法的具体实现进行了细致的分析。

诚然,iOS 的各种官方闭源框架里,我们不可能一个一个接口去推断其实现。但当遇到具体困扰我们的问题时候,我觉得我们正需要本文作者那样,可以深入研究的精神。通过阅读本文,相比于知道 NSClassFromString 的实现细节,了解如何通过汇编来推敲接口的实现细节更加重要一些。

🐕 Swift​Syntax

libSyntax 是 Swift 项目的工具库,目前被用于 Swift 项目的迁移工作。通过直接操作 AST 的方式,生成结构化的代码。而 SwiftSyntax 则是 libSyntax 的封装,为我们提供了 Swift 类型安全的方式,来操作和生成代码。

Mattt 在文章前半部分主要讲了什么是 AST 以及 Swift​Syntax 如何通过 AST 生成代码,在文章后半部分描述了如何通过 Swift​Syntax 生成 Swift 代码、如何通过 Swift​Syntax 替换 Swift 代码以及如何通过 Swift​Syntax 实现 Swift 代码高亮的功能。

🐎 Dealing with Swift toolchain

文章重点介绍了各系统下如何安装 Swift toolchain、不同版本的 Swift 如何共存?以及各执行文件之间的关系,如 swift-build, swift-packageswift-run

🐕 Using PromiseKit

当你需要连续地执行多个异步过程时,总会无可避免的出现地狱回调。为此,PromiseKit 是一个不错的解决方案。本文从实际的案例出发,为你深入浅出的讲解了如何优雅的使用它,建议阅读。

🐎 通过 internal 隐藏内部属性

这篇文章介绍了作者在封装数据库时遇到的问题——如何处理 public 类型的 internal 属性,让外部调用者可以在无法得知 internal 属性的同时生成这个 public 类型的实例。在暴露必要接口的同时隐藏实现细节,是一件不容易做对的事情,文章很简短,希望大家看完之后可以更好地处理类似的接口设计问题。

🐢 从Xcode10不再支持libstdc++说起

Xcode10起,苹果摒弃了对 libstdc++ 库的支持转而支持 libc++ 库。本文对 Xcode 中的 C++ 标准库进行了深入的研究。值得对编译器话题和 C++ 有兴趣的读者阅读。

🐕 Prefetching images size without downloading them [entirely] in Swift

如果在处理自定义布局时遇到需要远程加载的图片,很容易出现先有鸡还是先有蛋的问题——需要为图片预留出合适的空间,但不下载图片就无法知道它的尺寸。如果一边下载一边调整布局,这些元素就会出现和 web 一样胡蹦乱跳的滑稽效果,直到下载结束才能停下来,从而导致糟糕的 UX/UI 体验,让用户大感失望。在这篇文章里,作者会教你如何在显示图片之前预加载图片的尺寸信息,以便用在 UICollectionView/UITableView 的 pre-fetching 方法中。

工具

iOSLocalizationEditor

通常 iPhone 上的一些应用需要支持多国语言,这要确保所有内容都已翻译,任何语言都不能丢失任何字符串,这是一件比较痛苦的事情。而 iOSLocalizationEditor 是一款在 macOS 上帮助用户编辑和管理 app localizations 的图形化工具,它会显示每种语言的所有本地化版本,并能方便快捷的找出你缺失的 key 。如果想要试试看的朋友,也可以参考下这篇文章:Checking for missing translations in iOS projects

代码

MVCTodo

我们曾在 17 期周报中推荐过 - A Better MVC 的文章和视频,现在时隔半年,作者为这篇文章提供了一个简单的 demo,帮助读者去理解和实践他推荐的 MVC 架构。强烈建议阅读下这个 repo 的 readme,作者很有心地列出了这个 demo 你应该重点看哪些,略过哪些东西。

内推

关注我们

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

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

本期编辑

@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal@aaaron7@方秋枋kyotom510230anotheren水水looping@JasonYuh@老老老老老老老驴@小非86@邦ben@红纸@含笑饮砒霜

说明

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

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

Read more

老司机 iOS 周报 #40 | 2018-10-22

22 Dec 09:53
Compare
Choose a tag to compare

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

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

新闻

New LSP language service supporting Swift and C-family languages for any editor and platform

这应该是过去一周 Swift 社区最大的新闻,Apple 将主导一个新的开源项目,来为其在 Xcode 生态中的 Swift 和 C family 的语言添加 LSP 的支持,这意味着之后在 VS Code 上写 Swift 也能享受自动完成,定义跳转等功能。目前来看,Swift 已经成为全域通用型程序设计语言,但目前对于非 Apple 生态下的 Swift 开发的工具体验并不友好,Apple 此举无疑对于 Swift 社区是重大福音。

Photoshop for iPad hands-on: an exclusive look

Adobe 在近期的 Max 大会上发布了 Photoshop iPad 版本的预览版,正式版将在 2019 年发布。The verge 进行了评测,结合月底苹果的发布会,随着全面屏 iPad Pro 的更新,可能会有一系列生产力 app 随之发布。

文章

🐕 SwiftOldDriver 精选: Diff 算法在 iOS 中的应用(一)

文章来自 SwiftOldDriver 精选,将是一个系列,本文是开篇:讲 Diff 算法的一些基本概念。

在计算机领域中,Diff 是一个很重要的概念,被广泛的运用于各式各样的场景。比如说,React 利用 Diff 优化 Dom 刷新导致的性能问题;Git 借助 Diff 算法实现了版本之间的差异化对比;腾讯 Tinker 热修复借助 Diff 算法生成 patch 包等。

🐎 Xcode 10 Library Tips

相信不少人已经更新到了 Xcode 10。Xcode 10 的 UI 控件窗口从右下角挪到了右上角。默认的使用逻辑是点开后,拖拽一个控件到界面上控件窗口会自动消失。如果一个页面需要连续拖几个控件就会很痛苦。所以分享一个重要的 tip:按住 option 建点击弹出控件窗口的按钮,窗口就会常驻

🐎 拍照聚焦和曝光,AVFoundation 简明教程

这是利用 AVFoundation 实现拍照、聚焦和曝光等功能后的一篇总结文章,包含代码和示例,对有这方面应用需求的朋友可以花点时间看看。

🐕 Unleashing the power of asset catalogs and bundles on iOS

对于 iOS 开发者来说,BundlesAsset catalogs 应该是再熟悉不过了。文章介绍了一些高级用法,特别是利用 Asset Catalogs 存储一些配置文件,可以给不同的设备配置不同的值,打开了另一个世界。文末还结合 BundlesAsset catalogs 介绍了一个实际 App 中的使用场景。

🐕 Tricky UIViewController transition animations

目前有很多为初学者准备的简单过渡动画教程,但鲜有为高级开发者准备的。在这篇文章里,作者图文并茂地分享了他最近实现的几个复杂过渡动画,以及几个他在实现过渡动画时的小技巧。

🐕 揭秘Flutter Hot Reload(原理篇)

本文介绍了 Flutter 的热重载(HotReload)的实现原理,如果有兴趣自行实现热重载(HotReload)特性的同学可以关注一下。

  • Flutter 热重载的关键代码位于/flutter/packages/flutter_tools/lib/src/run_hot.dart
  • 在需要重新加载时,扫描有修改的文件,通知 UI 线程重绘 View 树
  • 在 Flutter 中,因为 Dart 代码是工作在自己的 VM 下,所以 UI 层的 reload 是通过服务注册的方式来跟外界进行打交道的

🐕 Time​Interval, Date, and Date​Interval

作者讲述了 Time​Interval、 Date、 Date​Interval 的历史由来。使用这些 API 的同时了解这些有趣的历史,不失为一个愉快的过程。

代码

Panda - 基于 Swift 的 Autolayout 实现

使用 Swift 重新实现 Cassowary 算法、不依赖 UIView 的 Autolayout 机制,使得 Layout 和渲染都可以在后台进行。抛去多线程的影响,算法本身的效率也是略高于 Apple 的实现,即使不用的话,也可以通过源码了解 Autolayout 内部的运作原理。

内推

关注我们

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

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

本期编辑

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

说明

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

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

老司机 iOS 周报 #4 | 2018-01-22

22 Dec 09:35
Compare
Choose a tag to compare

ios-weekly

进行了四期的周报编辑后,目前参与编辑稳定在 7 个人。看到挺多人表示希望我们能够坚持下去,现在我们每人平均花几个小时就足够维护周报的内容,继续做下去应该问题不大。

欢迎来自百度的@折腾范儿_味精加入我们的编辑团队。

感谢来自饿了么的@mmoaay为老司机画的 logo,真是 666。

新闻

库克:将允许 iPhone 6 / 6s / 7 手动解除降速

持续发酵的苹果电池降频门,苹果再退一步。库克接受采访时表示会在系统中增加一项设置,用户可以禁用苹果为了保护电池而设的降频策略。最新的 11.2.5 测试版中已经可以查看电池状况。

微信打赏功能将在 iOS 上回归

在「微信公开课 Pro」的主题演讲中,张小龙表示打赏功能将回归,并将修改打赏机制,打赏金额将直接支付给内容创作者。

Apple 更新 App Store 网页预览界面

Apple 在 iOS 11 中对 App Store 进行重新设计,现在终于对网页版动刀,跟上 iOS 上的简洁和卡片式风格。

苹果预计下周修正文字讯息漏洞「ChaiOS」

跟之前的 iMessage 漏洞类似,收到一个特殊链接的短信之后,设备就会重启,主要是因为 iMessage 会自动加载网页信息生成预览界面,在这一个网页里嵌入几十万个不必要的字符就可以系统崩溃,据悉这个 bug 已经在 iOS 11.2.5 beta 6 里修复了。

文章

蜂鸟商家版 iOS 组件化 / 模块化实践总结

文章详实介绍了饿了么物流移动 iOS 开发组的 Swift / OC 混编项目「蜂鸟商家版」进行组件化 / 模块化改造的实践历程,有类似需要的同学可以参考一下。

iPhone X home button

iPhone X 用来替换物理 home 键的虚拟 home indicator,可能展示在任何一个 view 上,也展示在锁屏界面上,home indicator 背景颜色会根据背后展示的 view 而改变。这是怎么实现的呢?Sash Zats 深入底层来揭示秘密。

从 Aspects 源码中我学到了什么

作者分享了自己阅读 Aspects 代码之后的收获,另外博客里还有几篇 YYKit 的源码阅读分享,质量都很高。

iOS 如何进行网络测速

@Joy_xx 大佬的文章,主要分享了两种常见的网络测速方案。文章内容简短,只谈思路,不涉及技术细节。想做网络测速又没有思路的童鞋可以看看。

Useful Optional Extensions

文章分享了各种 Optional 的实用扩展。通过这些扩展,可以用更少的代码来实现判断非空、设置默认值、设置默认行为、处理异常、定义多个可选值之间的关系、判断执行以及条件过滤等功能。文章末尾还给了一个例子,通过代码对比的方式,鼓励大家使用扩展 Optional 的方式来实现业务逻辑。

WebAssembly 的那些事

文章介绍了 WebAssembly 这门在浏览器里跑编译后的字节码的神奇技术,可以把 C++ / Rust 编译成字节码下发给浏览器,进行高效的字节码运行,而非传统 JS 解释执行。文章还手把手教你亲自写一个 C,先编译成 asm.js,在生成 wasm 文件执行,也教你把Rust,编译成 wasm 执行。

objc - 编译 Runtime 源码 objc4-680 objc - 编译 Runtime 源码 objc4-706

从苹果开源网站上,我们可以找到很多有意思的开源项目。objc4 是其中一个,也即我们通常说的 Runtime 源码,我们遇到的 libobjc.A.dylib 就是用它编译出来的。

这两篇文章就是介绍如何将从苹果网站上下载的 Runtime 源码,创建工程进行编译,运行,调试,从而更深刻的学习和理解 Runtime 源代码的,并且文章中留有作者的 GitHub 可以直接下载可编译版的 2 套源码。

WKWebView 强大的新特性

越来越多的项目逐渐开始使用 WKWebView 进行网页展示,是否苦恼于 WKWebView 对于操作 Cookie 的天坑以及不支持 NSURLProtocol 的弊端?这篇文章介绍了 iOS11 的新 API 为你解决了这些问题,不仅包括操作 Cookie 的 WKHTTPCookieStore,处理自定义协议的 WKURLSchemeHandler,还有用于广告屏蔽的新 API WKContentRuleList

Building for the Blockchain(面向区块链开发)

在区块链上,你不需要部署任何中心化的服务器,这就意味着单点失败的风险为零。如果你的整个技术栈都是去中心化的,那么就不需要引入“可信”的第三方,而没有第三方则意味着可以 100% 对抗审查。区块链技术带来了数据开放的新机会,基于区块链的去中心化数据库未来可期。

YC 是著名的科技企业孵化机构。发布在 YC 官博上的这篇文章介绍了区块链技术对开发者的意义。

给 Bool 扩展一个 Toggle 方法

objc.io 介绍的小技巧,给 Bool 扩展一个 toggle 方法之后就可以避免 myVar.prop1.prop2.enabled = !myVar.prop1.prop2.enabled 这种丑陋的写法了,可以直接写为 myVar.prop1.prop2.enabled.toggle()

并且已经起草提案给 Swift Evolution 了,这个方法有可能在以后会加入标准库。

今日头条算法原理(全)

今日头条公开了他们推荐算法的原理。介绍了如何做到内容、用户、环境(工作场合、通勤、旅游等不同的场景)的匹配预估。

工具

CocoaPods 发布 1.4.0

CocoaPods 发布了 1.4.0,带来了很多强大的功能。如下:

  • Test specs 支持配置 App host
  • 脚本配置 支持 Podfile 和 Podspec 配置脚本,CocoaPods 会根据你在Podfile 和 Podspec 的关联脚本描述,自动添加相关脚本到不同的Target;
  • 支持静态库 使用 use_frameworks! 同时支持 static framework 和 dynamic framework。只要开源库的作者在 podspec 文件中添加 s.static_framework = true,CocoaPods 就会把这个库配置成static framework。同时支持 Swift 和 Objective-C;
  • Podspec 文件可以配置 Swift 的版本号
  • 过渡到https 当你发布一个 Pod 不支持 https 的时候,会有一个警告。在未来的某个版本,将不再支持不支持 https 的 Pod。

Design+Code

Design+Code 是一个教你从零开始设计、开发一款 App 直到在 App Store 上架的 iOS App,不需要任何编程基础。其中包括 iOS 11 的设计理论例如颜色、动画以及为 iPhone X 进行适配等,少见的设计和开发兼具的交互式教学工具,值得一试。

cocoapods-packager

CocoaPods 官方工具,可以根据现有的 podspec 生成 framework 或 static library,给我们的 Pods 库发布工作带来了更多选择和想象空间。

代码

SwiftyUserDefaults

利用 NSUserDefaults 存储一些数据在开发中是常用的事。但是每次存取都依赖于字符串类型的 key、类型也不校验,在实际开发中也带来了不小困扰。这个库利用 Swift 的枚举和泛型优化了 NSUserDefaults 的使用体验,思路值得借鉴。

Turi Create

「Turi Create」是 Apple 的机器学习框架,目前已经开源在 Github 上。它简化了定制机器学习模型的开发。就算你不是一个机器学习专家,也可以在你的应用中添加建议、对象检测、图像分类、图像相似性或活动分类。让开发者更容易的构建机器学习模型。

objc.io 新书「App Architecture」

本书预计四月完成,但提供「早鸟」版购买,每周可以收到新内容。

音视频

Swift Unwrapped #42 Conditional Conformance

这期很简短,只是简单地聊了一下,之前 Ole 大神发过一篇文章讲了如何查看 Swift 源码,里面讲到了一个代码生成工具 gyb,主要是为了解决 Swift 泛型能力不足的问题,现在实现了 Conditional Conformance 之后就可以重构掉之前很大一部分 gyb 代码。并且单单只是重构掉 Slice 类型,就已经让 Swift 标准库的二进制文件缩小了 5% 😱,真是越来越期待 Swift 4.1 的发布了!!!

另外 Swift 的博客还发布了一篇文章专门讲解这个功能,有兴趣的人可以去看看。

内推

淘宝 - Weex 内核研发技术专家 - 基础平台部

Weex 的价值在阿里集团已经得到高度认可。weex 下一步计划是利用 C++ 重写内核。

简历可发送至 [email protected]

阿里巴巴 - 国际技术事业部 - ICBU 技术部 - iOS 高级开发工程

国际事业部在杭州滨江,发展迅速非常缺人。

感兴趣的可以简历发送到曾宪华的邮箱:[email protected]

CSDN 亟需前端开发和后端好手加盟,一起打造程序员新社区

@蒋涛: 老社区的技术债负担不轻,亟需技术开发前端和后端好手加盟 CSDN,一起打造程序员新社区。

本期编辑

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

说明

🚧 表示需翻墙

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

22 Dec 09:52
Compare
Choose a tag to compare

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

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

新闻

Swift in 2018

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

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

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

文章

🐎 质量监控 - 卡顿检测

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

🐎 It’s wrappers all the way down

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

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

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

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

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

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

🐕 [译] 揭秘 iOS 布局

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

🐢 iOS Memory Deep Dive

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

🐕 Access Control Management with Swift

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

🐢 How to Write Clean Code

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

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

🐕 🚧 On Learning to Code (for 2019)

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

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

工具

JSDebugger 一款iOS的动态调试器

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

Sizes

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

代码

smoke-framework

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

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

还等什么呢,学就 vans 了。

推荐人:LeeCenY

Logan

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

音视频

NSSpain

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

🚧 SwiftConf '18

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

内推

关注我们

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

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

本期编辑

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

说明

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

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

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

22 Dec 09:52
Compare
Choose a tag to compare

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

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

新闻

TestFlight 开始支持邀请链接

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

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

Apple’s use of Swift in iOS 12

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

Swift 5.0 Release Process

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

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

专栏

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

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

文章

🐢 Mirror 的工作原理

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

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

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

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

🐢 AR Face Tracking Tutorial for iOS: Getting Started

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

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

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

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

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

🐢 [译] Metal 渲染管线教程

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

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

推荐人:史前图腾

🐢 beeshell:开源的 React Native 组件库

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

🐕 从 FE 视角看大前端

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

🐕 UIField​Behavior

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

推荐人:WXGBridgeQ

🐕 巧妙实现 debugOnly 函数

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

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

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

🐢 Bloom Filters and Swift 4.2

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

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

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

🐕 INSIDE AUDIOKIT SYNTH ONE: A BRIEF TOUR FOR DEVELOPERS

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

🐎 代码评审的不可能三角

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

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

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

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

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

推荐人:matthew

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

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

🐕 Migrating to Unified Logging, Swift Edition

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

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

代码

andreamazz/SubtleVolume

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

设计

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

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

内推

关注我们

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

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

本期编辑

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

说明

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

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

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

22 Dec 09:52
Compare
Choose a tag to compare

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

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

新闻

Swift 4.2 正式发布

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

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

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

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

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

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

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

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

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

专栏

🐢 Swift for TensorFlow, First Class Machine Learning in Swift

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

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

Swift for TensorFlow

🐢 [译]SE-0206 Hashable 加强

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

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

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

文章

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

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

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

🐎 Facebook 工作体验之绩效考核

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

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

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

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

🐢 深入浅出 Swift Numerics

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

🐕 FastImageCache 原理

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

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

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

🐎 Capturing Self with Swift 4.2

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

guard let self = self else { return }

🐕 Adding Padding To A Stack View

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

🐎 Async/await in Swift unit tests

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

🐕 What I Learned Making 5 ARKit Prototypes

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

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

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

🐕 What’s new in Swift 5.0

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

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

🐢 i​OS 12

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

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

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

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

工具

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

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

代码

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

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

Awesome README

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

设计

Designing and Developing for Siri Shortcuts

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

内推

关注我们

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

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

本期编辑

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

说明

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

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

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

22 Dec 09:51
Compare
Choose a tag to compare

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

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

新闻

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

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

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

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

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

文章

🌟 🐎 老司机推荐书单

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

🐎 你的标签是什么?

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

🐢 Swift for TensorFlow 官方教程

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

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

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

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

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

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

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

🐕 JSPatch 的 dealloc 忧伤

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

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

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

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

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

🐕 关于 iOS 私有 API 扫描

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

推荐人:balloonsys

🐕 Preparing Your App For iOS 12 Notifications

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

推荐人:RocZhang9673

🐢 一次高效的依赖注入

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

🐎 DRIVING CARS WITH ARKIT

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

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

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

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

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

🐢 JSPatch VS Aspects

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

工具

pointfreeco/swift-html

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

代码

VideoFlint/Cabbage

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

推荐人:vitoziv

专栏

🌟 WWDC18 内参

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

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

音视频

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

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

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

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

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

内推

关注我们

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

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

本期编辑

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

说明

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

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

Read more

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

22 Dec 09:51
Compare
Choose a tag to compare

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

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

新闻

Swift Server 工作组

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

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

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

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

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

文章

🐕 Early returning functions in Swift

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

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

🐎 TODO FIXME And Compiler Directives

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

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

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

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

spirit-jsb 推荐

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

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

🐎 Why you’re not supposed to call description

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

🐎 Practical Dynamic Type

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

🐎 iOS App 后台任务的坑

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

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

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

🐎 打造高可拓展的 iOS KeyValueStore

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

🐢 MacOS 的安全和隐私指南

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

🐎 Swift Knowledge Base updates for Swift 4.2

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

🐎 Hacking Hit Tests

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

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

🐢 CLI: improved

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

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

设计

Lessons Learned From the RWDevCon 2018 Design Lab

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

Mac 高效开发指南

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

音视频

泊学技术视频

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

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

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

内推

关注我们

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

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

本期编辑

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

说明

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

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

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

22 Dec 09:51
Compare
Choose a tag to compare

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

新闻

iPhone 8 主板更换计划

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

文章

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

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

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

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

🐢 🚧 🌟 Why Monads?

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

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

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

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

🐢 🌟 Google Swift Style Guide 浓缩版

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

🐕 Improving Your Build Time in Xcode 10

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

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

🐢 Dynamic Features in Swift

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

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

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

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

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

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

🐢 Life of a Pixel 2018

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

🐎 When You Refactor, Are You Using Small Steps ?

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

🐎 闲聊 Flutter

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

🐕 Enum iterations in Swift 4.2

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

🐢 dyld_link & loaddyld_startup 解析

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

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

🐕 TCP 没那么难吧?

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

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

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

🐎 NSDataAsset

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

🐎 Xcode 10 Storyboard Changes

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

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

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

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

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

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

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

工具

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

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

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

代码

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

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

《iOS 面试之道》电子版

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

内推

关注我们

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

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

本期编辑

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

Read more