Skip to content

Releases: SwiftOldDriver/iOS-Weekly

老司机 iOS 周报 #55 | 2019-02-18

18 Feb 06:58

Choose a tag to compare

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

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

新闻

TLS 1.3 in iOS

在 iOS 12.2 中,iOS 系统默认开启了对 TLS 1.3 的支持,使用 Network Framework 以及 NSURLSession 的开发者都可以使用 TLS 1.3 来建立更安全的网络连接了。

在这方面有兴趣的童鞋不妨了解一下。

iOS 12.2. beta PWA update

在 iOS 12.2 beta 上 PWA 的能力也得到了小部分更新,由PWA打开外部网站会通过 SFSafariViewController 打开,进入后台后 PWA 当前的状态会保持,PWA 应用可以被系统搜索到等

文章

🌟 🐢 了解和分析 iOS Crash Report

作为客户端的开发者,与各式各样的 Crash 打交道是家常便饭。关于 App Crash 的相关讨论,社区也总是比较活跃。我们曾在 27 期和 34 期分别推荐了 深入理解 iOS Crash Log手把手教你查看和分析 iOS 的 crash 崩溃异常 两篇好文章。而这次则是来自苹果官方文档的译文,官方则意味着权威,以及更多的细节。内容虽然还是围绕着 “符号化 - 看懂 - 解析” 三个部分进行,但非常系统和详细。作者也对这篇译文进行多次润色修改,并在文中多处添加了自己的注解,会对我们阅读这类偏底层文章有所助益。

文中会涉及许多底层概念,读起来难免不如一些应用类文章顺畅,但小编还是建议大家无论如何都坚持至少过一遍,并再安排时间分块细读,会大有裨益。

🌟 🐕 iOS 原生级别后台下载详解

本文记录了作者实现支持原生后台下载 Tiercel 库的整个历程,并详细的列出后台下载的所有特性和注意事项,并附上了具体实现。让读者能够更深刻的了解到后台下载。目前 Tiercel 2 已经发布,完美地支持后台下载,还加入了文件校验等功能,对后台下载有兴趣的朋友可以借此机会深入了解下。

🐕 ABI Stability and More

Swift.org 二月初发文介绍了 Swift ABI Stability 当前状态及后续计划。Swift 5 在 macOS, iOS, watchOS, and tvOS 几个平台将实现 ABI Stability,预计很快就能发布,Linux 及 Windows 平台还需评估。文章还介绍了 Module StabilityLibrary Evolution 的后续计划 。

ABI Stability 能带给我们什么:上述系统以后将自带 Swift runtime and standard library,而不需嵌入到 App 中,能大大减小 Swift App 的打包大小。

🐎 浅谈团队管理最佳实践

作者从以下几点谈了一下团队管理的实践:

  • 每个人都需要关怀:领导者应确认团队中每个成员的职业发展规划,并适时地给予“人文上的关怀”
  • 公平公正公开的价值评判标准:一个成员的价值增值包含两个层面:随着熟练度的提升所带来的价值增值和解决特殊领域问题的经验价值
  • 团队沉淀:可以通过文档和流程标准化的方式有效降低做重复性工作的成员的替备成本
  • 具象化团队这台机器的样貌:领导者定义团队的责任与目标、架构设计、合理组成、团队的演进等,方便成员参考辅助自己的实践

🐕 制作一个 Mac APP:XcodeExtension

Xcode 8 提供了 Xcode Source Editor Extension方式来开发 Xcode 插件。本文以 XcodeExtension 为例,介绍了该插件的使用方法与制作思路。

XcodeExtension 主要有以下功能:

  • ConvertFromCase 把选择的下划线内容变为驼峰
  • DeleteEmptyLines 删除选中的空行
  • SortLines 排列选中的行
  • JsonToModel 把Json数据转成Swift模型,会把下划线命名变为驼峰

在往期周报中我们也有过相关推荐如: How to convert your Xcode plugins to Xcode extensions 以及 Code Friend 开源工具等,感兴趣的读者可以拓展阅读。

🐎 使用 OCLint 自定义 MVVM 规则

本文总结了通过自定义 OCLint 的扫描规则,对 MVVM 开发模式的 ViewModel 运行静态检查,并把规则集成到 Xcode 上所踩的一些坑。由于官方 OCLint 很久没有维护了,所以本文作者就基于 LLVM 7 进行了修改,对这块有需要或感兴趣的同学可以直接安装试用。

🐕 如何看待软件开发?

当年移动互联网大潮来的时候,软件开发再次成为炙手可热的岗位,高工资吸引了很多人投身其中。当大潮退去,互联网也迎来寒冬的时候,对于已经在其中的各位,又或者未来想要当开发者的同学们,软件开发到底是什么样的,究竟需要掌握多少知识,职业规划应该如何做,会成为大家再次思考的问题。本文作者以自己多年的工作经验,总结了如何看待软件开发这一问题,值得如果尚有迷茫的同学看一看。

🐕 Objective-C 单向数据流方案

在 JS 领域,得益于 JS 弱类型语言的特性,单向数据流被广泛的使用。单向数据流可以避免许多因为线程等造成的各种问题。本文介绍了 OC 下的一个单向数据流的方案 Reflow 库。Reflow 库架构设计实现了单向数据流的几个特征:

  • model对象不可变
  • 整个app的数据存于store层
  • 更新和通知也收拢于store层

Reflow 是开源的,有兴趣的同学可以一看。

🐕 移动开发的罗曼蒂克消亡史

本文是 InfoQ 总编辑徐川的一篇文章,介绍了移动开发领域的插件化和热更新两个方向的发展史,覆盖了 iOS 和 Android 。徐老师文章结尾的一句话很有意思,『插件化热潮注定成为技术发展的一段小插曲,也许再过几年,不会有人记得了。那段激情飞扬的岁月,终将成为 The Wasted Times。』

最近跟 Bang 哥吃饭,也聊起了热修复的一些事情,实际上在大厂一直都还有发展各种移动开发领域的黑科技。包括最近大热的 Flutter 技术,在 Google 的 RoadMap 上面,也明确表示了动态更新会是一个重点考虑的方向。总的来说,2019年,移动开发的插件化和热更新方向,应该会在基于各种虚拟机技术的基础上,继续往前发展,满足业务需求。

工具

ios-developer-tools

本文中总结了 iOS 开发者应该了解的工具合集。其涉猎了多个方面的工具推荐,例如 DEBUG 调试、项目分析、持续集成、逆向工程等。在这份列表当中,能够找到耳熟能详的项目,也有大家平时没有涉及到的方面,不妨来看看那些你没有接触过的开发工具。

DoraemonKit

滴滴开源的一款功能齐全的客户端研发助手,同时支持 iOS 和 Android 两端,类似的前辈有 FLEX、Dotzu,但仅限于 iOS 平台。

  • 内置了很多常用的工具,包括一些辅助开发工具、测试效率工具、视觉辅助工具等。
  • 接入方便,便于扩展,让你的业务测试代码在这里快速接入,统一管理,统一收口;

代码

Path.swift

一个文件系统路径库,专注于开发人员体验和强大的最终结果。保证了安全性和正确性的前提下提供了非常简洁的 API ,为管理文件路径而头疼的开发朋友们可以尝试使用这个开源库哦!

Facebook 开源图像处理库 Spectrum,优化移动端图像生成

Facebook 开源了其图像处理库 Spectrum,内核使用 C++ 编写,并提供了 Objctive-C 及 Java 的简单封装,简化移动端开发。统一的核心使得在 iOS 和 Android 上的图像输出更加统一。

效果丰富的分类切换组件:JXSegmentedView (Swift版)

SegmentedControl + PaggingView 组合实现的分类切换视图是资讯、电商类应用常用的基本组件。具体实现起来,动效细节和特殊交互场景要考虑的问题并不少。
JXSegmentedView 胜在实现了大量主流应用分类切换组件的交互效果,如果你碰到对应需求,相信这会是个不错的参考。

如果你不幸还停留在 Objc,也可以看看同一作者实现的 Objc 版本 JXCategoryView(已有 2k+ stars)。

暴走的鑫鑫 自荐

The Architecture of Open Source Applications

这是一本开源的电子书,主要介绍了最近几十年来一些经典开源项目(包括 Git、LLVM、nginx、PyPy 等知名项目)的架构思想和设计哲学,文章作者都是业界大牛甚至是项目作者本人,比如 LLVM 之父 Chris Lattner。相比自己去阅读源代码百思不得其解,原作者自己分享的思考和感受就像指明灯一样,给我们打开了更大的世界,站在巨人的肩膀上才能看得更高更远。

内推

关注我们

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

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

本期编辑

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

说明

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

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

老司机 iOS 周报 #54 | 2019-01-28

28 Jan 03:31

Choose a tag to compare

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

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

通知

各位读者大家好!首先欢迎我们的新编辑 - 热爱分享的爱奇艺 iOS 开发 @J_Knight_ 加入周报团队~另外春节临近,本期周报也将是我们年前的最后一期,年后我们再见!祝大家春节快乐!

新闻

🌟 老司机翻车现场:一个业余程序员组织如何收到滴滴的侵权通知

2019 年 1 月 23 日,这是一个值得所有老司机编辑铭记的日子,我们收到了来自滴滴法务团队的侵权通知。虽然我们完全不是一个实体组织,也毫无商业性质可言,和滴滴更不在一个行业,Logo 的颜色也完全不同。但是滴滴认为我们从 18 年 1 月开始使用的 Logo 和他们在 18 年 3 月登记的街兔 Logo “高度相似”,可能导致 APP 应用程序员的开发人员认为是街兔商标。对于这方面纠纷,我们也是大姑娘坐轿子头一遭,真谈不上老司机。于是我们选择按照对方要求第一时间替换掉所有可疑图片。在此期间,我们收到了很多读者和朋友的建议和帮助,非常感谢大家对老司机周报的关心和支持,我们全新的 Logo 也即将完成设计,很快会与大家见面。

我们愿称此次严肃而又哭笑不得的事件为『123 老司机翻车门』,为了其他同在技术社区做分享的朋友避免受此类事件的影响,『知识小集』特地整理了一份指南给大家 - 老司机翻车现场 续:技术之外,程序员如何自我保护

🌟 Swift 5 Release Notes for Xcode 10.2 beta

万众期待中,Swift 5.0 终于和 Xcode 10.2 Beta 以及 iOS 12.2 Beta,macOS 10.14.4 Beta 一起降临。虽然距离正式版还有大概一个月多一点的时间,但是各位 iOS Swift 开发者已经可以开始着手准备进行适配了。

Swift 5.0 应该能算是 Swift 从 1.0 以来的最大变革。不是因为语法变化多,而是因为从 5.0 开始,Swift 终于进入了 ABI 稳定时代,系统将自带 Swift 动态库,老版本 Swift 编译的库也将可以轻松的用到更新版本的 Swift 项目中。

除了上面苹果官方给出的链接,也可以参考知识小集团队的翻译版本

Upcoming Changes for Organization Teams

从 2019-02-12 开始,苹果开发者网站(developer.apple.com)和 App Store Connect 将会共用一套成员管理系统,有些角色权限将合并。这是个期待已久的改动,简化我们的维护成本。

文章

🌟 🐎 Server-provided animations in iOS apps

这篇来自 Badoo 团队的文章用一个例子介绍了如何将 Adobe After Effects(AAE)的动画导出为 iOS app 可以读取的格式(借助 Lottie 库),然后创建一种动画云存储服务,将动画存储在服务器上,然后按需传递给客户端 app。这种方法最显著的优点就是可以对动画更新流程进行解耦,也就是说如果要发布一个漂亮的新动画,设计师只要给服务器团队提供 JSON 就可以了,效率非常高!还有一个优点是不同的客户端平台(iOS、Android、Web)可以实现完全相同的功能而不需要调整现存的服务器端功能或原生动画。

🌟 🐎 A RunLoop for your Swift script

上一期推荐里面有一篇关于 swift-sh 的介绍,如若未读,可以先跳转过去一看。
这一文章主要是给出一下 Tips,当你需要执行一个异步任务的时候会发现,脚本跑完就结束,异步任务自然也得不到调用了,这是不符合需求的。iOS App 启动后会进入 Runloop 当中不停的在休眠和执行状态循环,保证 APP 在没任务的状态也不会退出。同理,在脚本中,执行 RunLoop.main.run() 或者 dispatchMain() 会让脚本进入启动 Runloop,不会结束。当你异步任务 callback 后,调用 exit(EXIT_SUCCESS)exit(EXIT_FAILURE) 退出当前 Runloop,并且结束脚本。

🌟 🐕 2018,我们的组件化实施之路

本篇文章是诸葛找房 iOS 技术团队近半年组件化实施之路的经验积累与沉淀,文章主要有 2 大部分。

第一部分主要讲了组件化可选用的方案、组件化的分层、业务组件的拆分步骤:

  1. 组件预处理
  2. 组件抽离、编译、运行
  3. 组件引入

第二部分分享了在实施组件化过程中遇到的一些问题:

  • 主工程中业务组件的引用方式问题
  • 业务组件的开发时机问题
  • 业务组件如何测试
  • 组件后续的开发与维护和组件回滚
  • 业务组件的粒度
  • 关于业务组件中文件的命名规则
  • 关于不同项目下同一业务组件的个性化差异解决方案
  • 其他细节问题如如何处理组件之间的相互跳转、业务组件之间如何进行复用等
  • 关于业务组件的评价标准

组件化是一个漫长、繁琐、复杂但有意义的过程,是一项团队性的工作,不管是正在打算实施,还是已经进行过组件化实践,都可以阅读本文,相信读者朋友阅读本文都会有一定收获。

🐎 React Native vs Kotlin Multiplatform. How the Future of Multiplatform Development Will Look Like?

作者对比了 React Native 和 Kotlin 在跨平台上各自的优劣,同时也谈了自己对跨平台的未来的思考,虽然不是针对 iOS 的,但是也值得阅读参考。

🐎 Flutter vs React Native: A Developer’s Perspective

老生常谈的话题,作者从十个方面去比较了 Flutter 和 React Native 的优劣,可供还在选型的同学们参考。

🐕 How to use the coordinator pattern in iOS apps

本文介绍了如何使用 Coordinator Pattern 这一设计模式来分离出本不属于 View Controller 的一些职责 ,避免导致 Massive View Controller 的形成。Coordinator Pattern 可以翻译为协作者模式,该设计模式并不在 GOF 的 23 个设计模式之中。

作者结合代码,从 Coordinator 的创建到应用,讲解了一个如何将跳转功能分离出 View Controller 的例子。读者通过阅读本文,可以了解到何为协作者模式,以及如何将该模式应用到我们自己的 APP 开发中。

相关阅读:The Coordinator

🐎 Xcode tips and tricks – part two

文接上回,Xcode tips and tricks 系列的第二个合辑来了!作者更新的速度很快,本期仍然是 10 个快捷使用 Xcode 的文本 + 小视频,你肯定能发现一些“原来还能这样操作”的点。作者也在搜集大家的建议,如果你有什么清奇的手法,也不妨分享出来吧!

🐕 WKWebView 实现浏览历史恢复

在使用 WKWebView 的时候,我们会发现,WKWebView 无法实现浏览历史的持久化。WKWebView 中 backForwardList 属性用来记录浏览历史,但这个属性是只读的,且在下次冷启动 App 的时候,backForwardList 是全新的,故而会有这个问题。

如何实现 WKWebView 浏览历史的持久化?本文作者通对 Firefox 的相关源码进行分析,借鉴了 Firefox 浏览器的实现方式。总结一下:

  1. 当 App 启动需要恢复浏览历史的时候,启动一个本地的 Web server 并且加载一个特定的本地页面

  2. 提取之前保存的所有 url 信息,构造本地 url 越过同源策略限制,传递到�特定本地页面中,该页面通过调用 pushState 来达到修改 �backForwradList 的目的

  3. 当本地加载这些特殊 url 的时候,之前启动的本地 server 可以将其重定向到正确的url

🐢 细说 iOS 代码签名

iOS 签名机制其实挺复杂,我们可以跟随作者的脚步,一点点的去了解 iOS 签名机制中每一步的含义,此外作者还贴心的帮助我们将文章拆分,有助于我们分步阅读。

因作者篇幅比较长,讲解的比较深入,有兴趣的同学可以通篇读完收益更大。若时间有限,推荐缩略版的 iOS App 签名的原理 供大家参考。

推荐人:xelzmm

🐎 Clear and searchable logging in Swift with OSLog

苹果在 WWDC 2016 (Unified Logging and Activity Tracing) 推出了新的统一日志系统(the new Unified Logging system)—— OSLog,它比以前的 print 或者 NSLog 功能要强大的多,苹果也是强力推荐使用新的统一日志系统。

本文主要介绍了新日志系统的三大特性:

  1. 新日志系统能够按子系统 (subsystem) 和分类 (category) 进行筛选搜索

    let ui = OSLog(subsystem: "com.lordcodes.chat.ChatApp", category: "UI")
    os_log("Contact selected", log: ui)
    
  2. 同时也支持指定日志级别 (Default, Info, Debug, Error, Fault)

    os_log("Contact selected", log: .ui, type: .info)
    
  3. 默认不收集动态字符串 (dynamic strings) 和复杂对象 (complex dynamic objects) 的打印信息,确保用户敏感信息不会持久化到日志文件,需要收集的话要在格式化输出时指定为 public

    os_log("Contact %{private}ld selected", 2)
    os_log("HTTP response: %{public}@", responseCode)
    

注:CocoaLumberjack 封装的日志系统是支持 os_log(DDOSLogger) 的。

🐎 以流的形式执行 Multipart 请求

Foundation 框架中的 URL 类提供了非常全面的功能,此后还在 iOS 7 中新增了 URLSession 类。尽管如此,基础库中仍然缺少 multipart 文件上传的功能。
本文介绍了怎样发起 multipart 请求,并为解决多文件传输的性能问题,通过 AFNetworking 和 Alamofire 的方式,将硬盘中数据以流的形式读取来执行 Multipart 请求解决此问题。

🐕 Using protocols as composable extensions

面向协议是 Swift 推崇的一种编程范式,标准库里的基础类型也都是基于协议搭建起来的,利用 protocol extensions 的特性去达成复用和组合,但这些范式如何落实到业务上呢?这篇文章的作者就介绍了如何通过 protocol extension 去完成一个加载动画,并且对比了继承和协议的两种实现方式。

🐎 使用 Flutter 一年后,这是我得到的经验

过去一年开发者们对 Flutter 的热情有多高相信已经无需多言。Google 出品、跨平台、性能高等种种标签让越来越多的人加入其中。本文总结了作者一年来开发 Flutter 的一些心得,作者在 Flutter 上丰富的开发经验所进行的总结相信对于接下来想要尝试 Flutter 的同学是很实用的,这对我们做技术选型以及更多的考虑会很有帮助。

代码

🌟 UIKitSwiftDSL

迫于 StoryBoard 写布局带来各种协作上的问题,大型项目的布局一般都用纯代码来实现。纯代码布局最大的问题是可读性太低,有没有办法改善?
UIKitSwiftDSL 作者提供一个新思路:用区区 200 行代码实现一套布局 DSL(Domain Specific Language),通过提供声明式的写法提升布局代码的可读性。

建议通读源码,实现不复杂带来的使用体验却很有趣。或许我们也可以尝试设计一些 DSL 来优化特定问题。

🌟 flutter-go

阿里出品,Flutter 组件演示 demo 和中文文档,同时包括了 iOS 与 Android,快上手试一试。

habbit

个人 Flutter 作品,演示了一个完整的习惯跟踪 App 。从完成度上看还可以,复杂度不够,主要是演示了 RxDart 的用法。

swift-algorithm-club-cn

swift-algorithm-club 主要是 Swift 来实现算法和数据结构的源码和文章,对应文章都有对该算法的讲解,如果在学习或者复习算法的同学,不妨一看。

音视频

ggtalk | 广义跳槽论:简洁明了的方法论

这一期的 ggtalk 延续了上一次程序员比较关心的话题:跳槽。邀请来了老牌程序员、产品经理:Easy。相信经常刷微博的同学应该都知道他,Easy 之前在微博做过程序员和产品经理,也经历过独立开发。对于程序员的职场方法论有一套独特的心得,我听完之后感触颇深。比如作为程序员,不要只关注公司是否能出得起自己希望的薪水,更重要是要关注自己所能给公司带来的价值,不要被短期的供需不平蒙蔽了双眼。还有程序员如何提升自己的影响力? 最重要是能给别人创造价值。除此之外,还有不少有趣的视角。推荐大家收听。

内推

Read more

老司机 iOS 周报 #53 | 2019-01-21

21 Jan 05:06

Choose a tag to compare

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

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

新闻

热修复、生态、混合工程 | Flutter 2019 产品路线图正式公布

Flutter 的 2019 产品线路图已正式公布,热修复、生态、混合工程,可谓精确打击现有的痛处。特别是热更新,不过更多细节要等到今年的 Google I/O 大会。

文章

🌟 🐕 Functional networking in Swift

一篇非常不错的、手把手教学的 Swift 函数式编程教程。通过使用 Swift 的函数式特性以及 Future 和 Promise 的思想,一步步的把一个常见的网络请求模型改造得非常优雅,并且整个改造的过程,一步步的减少类型,一步步的减少副作用,使用无状态的函数组合来实现逻辑。从这篇文章也可以看到,函数式编程最重要的是思想,而不是某个具体的库。当我们学会了思想,即便不依赖任何第三方库,我们也可以快速搭建出很 pure,很优雅的架构。

🌟 🐎 关于 Flutter Layout 你应该知道的

本文介绍了 Flutter 的几种布局方式以及需要注意的问题,介绍了 Unbounded ConstraintsFlexStack 等。了解文中所提到的这些,基本日常使用 Flutter 关于布局方面的也就够用了。

🐎 Xcode tips and tricks – part one

本文是 Xcode tips and tricks 系列的第一个合辑,包含了 10 个使用 Xcode 的小技巧。每个小技巧都配有简洁的文本和一个小视频,小视频长度都不超过 20 秒。用这种形式学习小技巧,效果非常不错,简洁直观,一目了然,希望作者一直更新下去。本篇文章不需要翻墙,但观看视频需要翻墙。

🐎 swift-sh

Swift 有一个活跃的社区,现在带来了 swift-sh 以供实现脚本功能,同时提供了包管理,且在 GitHub 中开源,见 mxcl/swift-sh

  • 通过注释 import DeckOfPlayingCards // @NSHipster ~> 4.0.0 引入 Github 中 NSHipster 中的 DeckOfPlayingCards 包。
  • 可以指定依赖的 remote 地址,import Remote // https://example.com/Remote.git
  • #!/usr/bin/swift sh 脚本中声明运行方式,swift sh,系统在运行的时候,会去寻找 swift-sh 的执行。
  • swift-sh 使用内置 eject 命令简化从脚本到包的转换,$ swift sh eject ./bridge

当前的限制:

  • 缺乏从外部模块导入单个声明。

🐢 High Performance Numeric Programming with Swift: Explorations and Reflections

利用 Swift 进行数学编程并不是一个很热门的领域,例如训练机器学习模型,但作者经过几周的研究与实验构建了几个数学库,可以达到与精心优化过的矢量化 C 语言相同的速度,同时还能够保持简洁易用。在这篇文章里,作者会为你展示如何使用 Swift 进行有效的数学编程,其中的例子主要都来自 BaseMath 库,这个库为 Float 和 Double 型提供了通用的数学函数。

🐎 客户端单周发版下的多分支自动化管理与实践

过去,大多数 App 的发版时间一般为 3 到 4 周,但如今,为了快速验证产品策略,又或者赶固定时间的运营活动,许多产品的发版节奏较过去变得更快。但快速的发版节奏带来的必然是并行开发与工程代码版本管理的一系列问题。本文介绍了美团团队是如何来解决这一问题的,并且基于文中提到的流程已经稳定进行了 10 个小版本的开发。

🐎 【译】Language Server Protocol

这篇文章是 Language Server Protocol 的译文版。Matt 大神解释了什么是 LSP,LSP 是怎么工作的,以及潜在的可能带来的好处,我们可以一起重温下。

相关阅读:Swift Development with Visual Studio Code

🐢 iOS 拾遗——为什么必须在主线程操作 UI

我们都知道 UI 相关方法必须在主线程调用,究其原因的或许不多。

本文由浅入深,从多方面阐述为什么不能在主线程操作 UI。包含 UIKit 非线程线程安全的设计、UIApplication 事件响应、底层 Core Animation Pipeline。另外,还介绍了 TextureComponentKit 的实现来,希望能够带给大家一点思考。

推荐人:杜玮-Dywane

🐢 React Native 工程中 TSLint 静态检查工具的探索之路

代码的静态检查,可以在代码的规范性、安全性、可靠性、可维护性等方面起到重要作用。 iOS 可以使用 Clang Static Analyzer 、 OCLint 等工具, Android 可以使用 CheckStyle、Lint、Findbugs、PMD 等工具,而对使用 TypeScript 的 React Native 工程,TSLint 则成为了主要代码静态检查的工具。

本文阐述了使用 TSLint 的原因,并对 TSLint 的使用做了详细的介绍,既可以直接使用 TSLint 的规则,也可以自定义编写 TSLint 规则。使用 TSLint 后可以有效规避一些低级错误,同时可以快速定位问题代码,将开发状态从“亡羊补牢”进化到“防患未然”。

🚧 🐎 Generate & Host your iOS Documentation

代码注释和说明文档对于我们维护和使用类库来讲,都是很有用的。很多时候我们也都是通过导出代码注释作为文档,因为这样能减少重复编写文档带来的额外工作量,也能避免代码和文档描述不一致带来的坑。

本文就介绍了一款能够从 Swift 和 Objective-C 代码中提取注释来生成 HTML 格式文档的命令行工具 —— Jazzy;同时也介绍了如何通过 Travis CI 来自动生成和部署文档到 GitHub Pages,保证了代码和文档的及时同步。这个思路完全可以用到公司内部的私有工作流程当中,通过工具和自动化提高工作效率。

🐎 不同 WKWebView 之间实现浏览状态隔离

很多时候面对 webView 相关的登录状态,大家都是习惯一旦在一个 webView 进行了登录,在创建新的 webView 打开新的页面应该也能做到自动登录同步,这是一个比较常见的用户场景。但本文的作者所面对的场景恰恰是登陆隔离,即一个 webView 保持了登录,其他 webView 不会自动登录,面对这个需求,大家可以看看作者在这里面的研究与探索。

🐢 OBJECT SERIALIZATION IN IOS

在这篇文章中,作者尝试将关于 iOS 开发中主要格式和数据序列化类型的知识系统化。还将 ObjC(NSCoding)与 Swift 4(Codable)的方法进行比较,并列出一些特定的用例,例如它们之间的互操作以及使用复杂对象图的能力。

  • 序列化作为一个单独的过程
  • NSCoding
  • NSCoder 和 NSKeyedArchiver
  • JSON
  • PLIST
  • 其他格式
  • Codable
  • 一些基准和比较
  • NSKeyedArchiver 编码可编码
  • 编码复杂的对象图
  • Codable 作为 NSCoding 的替代品(作为结论)

设计

「Keep 设计开发语言」实践与思考

其实这篇文章并不是说编程的,但是依然值得程序员们读一读。为什么呢?因为:

  1. 你有多少次和 UX 发生了争执,原因是 UX 不停的改设计?
  2. 你有多少次搞不清楚 UI 中元件的布局,大小,对话框的设计要怎么样,然后只能不停的去问 UX 或者 PM?
  3. 你有多少次因为代码没有很好的模块化不得写别人写过的重复 UI 元件而加班?

那就是时候在公司内部和 UX 团队一起建立起一套完整的属于你们的设计语言了。这不仅是为了你们的产品质量,更是减少重复劳动,解放程序员的最佳方案。

什么?你问我怎么开始搞?那还不快看看这篇来自 Keep 团队的文章参考参考?赶紧的。

工具

Bagel

Bagel 是一个轻量级的原生 iOS 网络调试器。它的方便之处在于不需要使用证书和设置代理。只要将 iOS 设备和 Mac 电脑连接到同一个网络,就可以在 Bagel 的 Mac 客户端查看当前在 iOS 设备上运行的 APP 的网络通信情况。

awesome-mac

无论你是 macOS 小白,还是 macOS 的高阶玩家,你总能从 awesome-mac 的软件列表中找到一些你没有见到过的实用软件工具推荐。这份列表来自广大开发者的多年积累和精品推荐。它涵盖了日常生活至开发软件推荐一应俱全。

音视频

ggtalk | 狭义跳槽论:面试官,大厂新人和准备起跳的某 C

本期 ggtalk 聊了程序员非常喜闻乐见的话题,采访了翻译组最近刚跳槽或者准备跳槽的三位同学,聊聊为什么跳槽,跳槽的主要考虑是什么,收益和风险如何权衡。听下来感觉很有共鸣,三位同学遇到的绝大多数情况其实其他程序员也会遇到。最近有跳槽想法的同学不妨可以参考。

Swift Community Podcast #1

两个社区大 V John SundellGarric Nahapetian 加上 Swift 创始人之一 Chris Lattner,他们开始了一档全新的博客节目,主讲 Swift 相关的各种内容。

第一期主要讲了这个节目开始的缘由和各自开始钟情于 Swift 的一些小故事。第二期的话题正在征集中,目前评论区里已经有人提出了 TensorFlow / Scripting / Concurrency 等热门话题,大家有感兴趣的话题也可以去贡献一下。

一起来开发泊学 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 举例,以一个独立开发者的视角,尽可能在代码的可维护性、可测试性、可重用性以及可协作性,达成让自己满意的实践。

内推

关注我们

我们开通了公众号,每期发布时公众号(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 周报 #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

说明

🚧 表示需翻墙