Skip to content

Releases: SwiftOldDriver/iOS-Weekly

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

01 Jul 06:38
Compare
Choose a tag to compare

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

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

福利

🌟 免费领取小专栏 -- WWDC2019 内参

WWDC2019 内参现已更新到 42 篇,以下是上周更新的文章,欢迎大家订阅学习~

必看

SwiftUI

推荐

可直接点击标题链接,或者复制 https://xiaozhuanlan.com/wwdc19/present/380ad33db882a12ae9c0b2402d386ef10ecafa51 至浏览器打开领取。

Design+Code 的 SwiftUI 教程限时优惠

扫码购买在五折基础上输入 iOSWeekly 优惠码再优惠 20 元,限时购买!!!

新闻

2019 年 Swift 和 Objective-C 开发者调查报告(JetBrains版)

@xiaofei86:最近知名 IDE 厂商 JetBrains 发布了 2019 年开发者调查报告。本文汇总了与
Swift 和 Objective-C 相关的 11 项调查数据和结果。数据显示,仅使用 Swift 的开发者占比已经过半,仅使用 Objective-C 的开发占比已经仅剩 15%。

文章

🐕 0.3s 完成渲染!UC 信息流正文“闪开”优化实践

@aaaron7:目前,App 通过集成 webview 的方式来将一部分信息展示的任务交给 h5 来实现已经成为行业相对通用与标准的做法。但这样的场景不可避免的会遇到打开速度的问题,相比直接 push 一个 native 的 view,打开一个基于 webview 的页面往往会重很多,比如 webview/jsengine 的初始化,h5 文件的解析与渲染,js 的执行,ajax 的数据拉取,冗长的流程造成的结果就是打开 webview 的页面往往很慢,而且用户会看到白屏。

本篇文章的作者从整个链路的分析出发,提出了一整套优化的技术,比如离线宝、native 渲染、数据预请求等等,并且从截图上看实现了直出的效果。有相关类似优化场景需求的同学可以好好研究下。

🐎 揭秘苹果应用审核内幕

@老峰:苹果应用审核过程一直以来是个黑盒,我们经常会遇到让人抓狂却无可奈何的被拒邮件,那么审核到底是怎样的过程呢?

本文根据最近发表在 CNBC 的一篇文章揭秘了 Apple 应用审核执行审核委员会组成结构及工作内容、应用审核过程、应用拒审处理细节等等,对审核过程好奇的读者可以看一下。

参考链接:

🐎 App Store 审核极限操作(2019.6 最新)

@极速男孩007:本篇文章主要介绍了苹果审核中遇到的一些问题,然后提供了一些针对性的解决方案。并且推荐了一些关于审核的文章做参考。

参考链接:

🐕 系列文章深度解读|SwiftUI 背后那些事儿

@zvving:继上篇新晋网红SwiftUI——淘宝带你初体验后,淘宝技术团队又带来 SwiftUI 更详细的介绍。

本文汇总阐述了 WWDC19 中大量关于 SwiftUI 的内容:从 DSL 所需要的新语法,到 API 设计指南,从 DataFlow 到布局算法,从混合布局到多设备适配……

文章涉及技术细节点到为止,而又对 SwiftUI 知识轮廓面面俱到。如果你还没接触过 SwiftUI,想花二十分钟对其知识图谱有个整体认知,这篇文章会是最好的入门指南。

🐕 GMTC2019 演讲实录|闲鱼基于 Flutter 的架构演进与创新

@Parsifal:GMTC2019 已于上周圆满结束。闲鱼作为国内率先大规模尝试 Flutter 的团队,也在这次 GMTC 上做了关于闲鱼是如何使用 Flutter 做混合式开发以及业务落地上的分享。Flutter 作为一个跨端解决方案,与原生混编的问题是其必然会遇到而且接受考验的。本次演讲,闲鱼团队围绕着以下两个问题,分享了闲鱼团队是如何演进和创新 Flutter 架构的。

  • 如果在一个已经存在的 App 中加入 Flutter,如何让 Native 与 Flutter 进行无缝的衔接,同时保证相互开发之间的隔离性
  • 如果在 Flutter 的容器中,使用已有的 Native UI 组件,在 Flutter 与 Native 渲染机制不同的情况下,怎么保证两者的无缝衔接以及高性能。

🐎 监控所有的 OC 方法耗时

含笑饮砒霜:App 卡顿,绝大部分都是因为主线程卡顿造成,所以可以通过监控主线程运行的 OC 方法来优化代码质量和性能问题。

@Damonwong: 作者在学习完《戴铭的iOS开发高手课》 之后,了解到了如何 hook objc_msgSend 写了一个如何监控所有 OC 方法耗时的小工具。并详细说明了代码实现的原理,是一个值得学习的文章。

然而,hook objc_msgSend 涉及到汇编的知识,如果对汇编不太熟悉的朋友,可以看一下作者的另外一篇文章 arm64程序调用规则

🐎 BlockHook with Private Data

@Parsifal:Block 作为 Objective-C 上的闭包实现,为我们编写回调代码带来了极大的便利。享受这样的便利之余,我们也会有场景想 Hook 某些 Block 来做一下特定的业务,但事实上 Block 的 hook 并不像 Method Swizzling 那么简单。而杨萧玉的 BlockHook 就解决了这样的问题。

本文从介绍 BlockHook 是如何解决带有“私货”而不能被正常 Hook 的 Block 的问题出发,揭秘了这些特殊 Block 是如何被实现的。由于此类文章资源很少,对于我们想深入了解 Block 同学十分值得细读。文章很短,但干货很足。

🐎 [译]我第一次体验Kotlin Native

@邦Ben:Kotlin 1.3 的发布,带来了跨平台的能力(仿佛不会跨平台的都不是好语言),Kotlin 可以生成多个平台的代码(iOS,MacOS,Android,Windows,Linux,WebAssembly),本文中经过编译器处理后会生成对应平台的代码,部分平台能力还需要手动进行桥接(跨平台迈不过的坎)。初看,Kotlin 跨平台能力还未完备,还需一段发力期,还是让我们拭目以待吧。

🐕 How I negotiated a $300,000 job offer in Silicon Valley

@老驴:这篇文章其实对国内的程序员参考价值不大。文章讲的是一个美国程序员在跳槽过程中如何利用自己有的多个不错 offer 来进行相互竞价的过程。因为国内的面试情况和北美的不太一样,所以也不能拿来套用,仅供参考吧。

顺便,如果你对北美软件工程师面试相关信息感兴趣的话,也可以看看之前我写的一篇文章

🐢 WWDC session videos recap

@红纸:今年 WWDC 有超过 100+ 的视频总量,我们很难跟进每个视频的内容,但是本文作者为我们罗列了一个视频摘要清单。我们可以通过摘要,快速把握住此 Session 的重要内容。当然我们也可以通过摘要来辨别视频内容的价值,是否值得我们继续细化深入细节。

🐕 Dart | 什么是Mixin

@CrazyCoderShi:Dart 是一门取众长的编程语言,语法简介明了,Mixin 更是其相当亮眼的设计,很多人把他理解为 Java 之于 interface ,Swift 之于 extension,小编觉得这么理解都可以,但是 Mixin 更强大,本文详细的带你了解 Dart 的 Mixin 究竟为何物。

代码

About-SwiftUI

[@水水]:自从苹果公司宣布了 SwiftUI 的主题演讲之后,大量的文档、示例、视频和教程就出现了。此存储库的目标是收集所有这些信息,让你方便的查找有关 SwiftUI 的信息。

设计

选一个好的背景让你的设计更出彩!

@邦Ben:如果你有兴趣或者正在做独立 App 的话,你一定会绕不开设计,因为不是所有人都那么幸运有一个专属的设计师搭档,该文章介绍了一些可以获取到好背景的一些资源网站,有兴趣的可以看下~

内推

字节跳动 2020 届提前批内推

字节跳动面向 2020 届毕业生的【秋招提前批】限时开启,iOS/Android 客户端、前端,后端、测试开发等岗位均开放名额,直走内推通道,提前拿 offer。

  • 简历发送至:[email protected] (推荐标题:校招提前批-岗位-姓名-城市),如:校招提前批-iOS客户端-王富贵-北京
  • 不影响后续秋招再次投递,欢迎转发~
  • 有效时间截止 2019.07.17

PS:王富贵表示:这是个很好的机会哟,走过路过不要错过 (~o ̄3 ̄)~

常规内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

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

说明

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

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

老司机 iOS 周报 #72 | 2019-06-24

24 Jun 03:01
Compare
Choose a tag to compare

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

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

福利

🌟 免费领取小专栏 -- WWDC2019 内参

WWDC2019 专栏由「iOS 周报」、「SwiftGG 翻译组」和「知识小集」共同发起,我们招集了30多位优秀的同学,共同把 WWDC2019 上优质的内容进行解读。目前已解读了包含必看 14 篇,SwiftUI 5 篇文章以及推荐 17 篇文章,以下是部分目录,欢迎大家订阅学习~

必看

SwiftUI

推荐

可直接点击标题链接,或者复制 https://xiaozhuanlan.com/wwdc19/present/380ad33db882a12ae9c0b2402d386ef10ecafa51 至浏览器打开领取。

新闻

CocoaPods 1.7.2 - Master Repo CDN is Finalized!

@享耳先森CocoaPods 近期发布了 1.7.2 版,支持 CDN,意味着我们不需要将整个 Podspecs 仓库 clone 并保存在本地,节省几 G 的硬盘空间。最新的版本中,需要在 Podfile 里将修改 source 'https://cdn.cocoapods.org/',CDN 将会在未来版本变为默认设置。

文章

🌟 🐕 Flutter 最新进展与未来展望

@CrazyCoderShi:Flutter 自打发布以来一直都是跨平台方向的关注焦点, 本文的作者是 Google Flutter 团队的高级研究员董韬, 文章从多个方面分析了 Flutter 的现状, 以及对其未来的展望, 小编读完本文都觉得未来可期呢😄:

  • Flutter 及其在中国的发展状况
  • 多平台愿景: Flutter for Web
  • 生态建设: 与社区共建的状态管理解决方案
  • 开发体验: "UI as Code"
  • Flutter/Dart 近期展望

🌟 🐕 SwiftUI or Flutter ?

@邦Ben:本文作者通过一些同功能代码例子对比了 SwiftUI 和 Flutter 的代码复杂度,以此说明 Apple 在 SwiftUI 上更为简洁。在 SwiftUI 跨平台方面也进行了介绍,不同系统下的不同表现,这些都视为 Apple 方面对多设备进行了许多的特性处理。

在小编看来,SwiftUI 算是自家多设备兼容,而不算真正的跨平台,和 Flutter 抹平平台间差异的画布做法来说,还是有很大差别,或许暂不应该相比较,两者目标暂不一致。让我们继续期待 SwiftUI 的进展,希望 Apple 爸爸进度能持续加快!

🐕 iOS Code Review - Health check of your Swift code

@莲叔:我们接手一个工程的时候,往往总是习惯性吐槽上一个做这个项目的人做得很垃圾,工程各种有问题。但抛去个人的代码风格不管的话,理性的来看,我们如何衡量一个项目到底是好还是不好呢?这篇博客提出了一个 Swift 工程健康度的概念,并给出了常规的 工程健康度的衡量方法。分别从目录和 git 主页的层面,到 codebase 层面,进一步看代码语言的构成,iOS 的版本,数据库的实现,UI 的方案以及设计模式的使用,最后到是否具备可测试性和 CI/CD 的相关能力,虽然具体每个点都不新鲜,但胜在覆盖全面。有相关需求的同学可以看一下。

🐎 【译】如何正确选型,React Native 还是 Native?

@looping:本文总结了 Native 跟 React Native 开发的优缺点,同时为开发移动应用的技术选型提出了自己的看法。如果觉得列的东西太多,不太好分析,文章结尾给出了非常简单的方法 —— “预算充裕,而且也不想在 App 的用户界面和功能上妥协”,即有钱且任性的话,就选择开发原生应用。当然,实际技术选型还得重点关注团队技术能力以及项目需求排期这些因素才能做好。不过从技术的利弊角度看,这篇文章罗列的内容是值得参考的。

代码

SwiftyGPIO

@四娘:一个适用于Linux / ARM 硬件项目的Swift库,支持 GPIOs / SPI / I2C / PWM / UART / 1Wire 等主流协议,有丰富周边教学和衍生项目。

音视频

🚧 SwiftUI Gestures, Blend Modes and 3D Transform

@张嘉夫:DesignCode 的视频教程,展示如何用 SwiftUI 制作交互动画,包括手势、Blend Mode 和 3D Transform 等。

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

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

说明

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

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

老司机 iOS 周报 #71 | 2019-06-17

17 Jun 05:34
Compare
Choose a tag to compare

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

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

新闻

🌟 🐎 iOS 13 Preview

极速男孩007:在 WWDC 2019 上苹果发布了全新的 iOS 13 版本:

主要带来了一下功能:

  • 大家期盼已久的黑暗模式。提升了夜晚的视觉效果。
  • 人像拍照更多的功能,并且可以通过日期去筛选照片。
  • 全新的苹果登录功能,使你的信息更加安全。
  • 全新的 map 带来更多的地图细节,和 360° 的全景街景。
  • siri 声音变得更加自然,并且能通过 homepod 识别各个家庭成员的声音。
  • App 启动速度会比以前快两倍,并且会有更小的包的大小。
  • ARKit 3 支持人的动作识别,并且支持人和虚拟景象的结合。

🚧 Why Did Apple Reject My App? Ex-Head of App Store Review Explains

@anotherene:App Store 审核团队的前负责人讨论了为什么应用程序被拒绝,Apple 和 开发人员之间的竞争以及 WWDC 的规划。

新手推荐

🌟 🚧 SWIFTUI BY EXAMPLE

@邦Ben:WWDC 最受瞩目的莫过于的 SwiftUI 了,虽然这可能三年后才有机会普及。

作者 Paul Hudson 非常速度的给出来大量的学习例子(涵盖了日常需要用到的内容,例如:文本图片,列表容器,弹窗,动画,视图形变,状态等等),并且还有录制了学习视频,可谓是干货满满。

其他参考:

文章

🌟 🐎 Thoughts on SwiftUI

@zvving:作者 Kuba 是一名资深的 macOS&iOS 开发,整理了对 SwiftUI 的一些思考:

上手所面临的困难:

  • 你可能需要把自己当成 macOS&iOS 开发新手,哪怕忽略开发范式的变化,熟悉新的 framework 也需要时间
  • 有很多细节问题需要进一步探索:如面对复杂布局不知道如何开始;属性的 $ 如何使用?修饰符的排列顺序有什么影响?等等
  • 工具现状:仍处于测试版状态,文档不完善,错误消息很神秘,自动提示在一半的时间里无效

看好未来的可能性:

  • 对 SwiftUI 提升 UI 开发效率充满信心,相信能节省开发时间,避免出错
  • 很好的是苹果没有简单地把 11 岁的 UIKit 抹平差异,迁移到所有平台。而是重新设计一个 UI 框架,承认并强调每个平台的独立性,把有共性的好的体验统一定义,不通用的部分为每个平台提供自定义的可能。就像他们所提倡的那样:『并不是:Write once, run anywhere,而是 Learn once, apply anywhere』
  • 期望保持 macOS Apps 优秀体验的同时,SwiftUI 为其带来更多的可能性

🌟 🐎 Will Combine kill RxSwift?

@Damonwong: 今年的 WWDC 不但出了 SwiftUI 这个重量级框架,还出了一个官方的 ReactiveX 库 Combine,作者也将 Combine 和目前社区较为流行的 RxSwift 做了以下对比:

  • Combine 支持 Backpressure 特性,而 RxSwift 不支持
  • Combine 和 RxSwift 在错误处理上有所不同,相比较而言 Combine 需要更明确的错误类型
  • Combine 不需要使用 DisposeBag 来管理内存问题
  • Combine 和 RxSwift 在 API 上还是有所差异的
  • Combine 在性能上有一点「碾压」的趋势
  • ...

综合比较起来 Combine 虽然还处于 beta 及 iOS 13+ 的阶段,但是各方面似乎都要比 RxSwift 都要稍微好一点。

最后谈一下我自己对 ReactiveX 的看法。在 Combine 这库出来之前,我对 RxSwift 的定义为「毒瘤」。什么意思呢?就是一旦一个项目中一个库引入了 RxSwift 你会发现渐渐的所有的库都会依赖它,以至于想去也去不掉。再加上不同水平的人对 ReactiveX 理解不同,行业中也没有一个很好的规范来约束,以至于项目中的 RxSwift 代码质量参差不齐,难以维护。所以虽然我们项目中引入了 RxSwift 但是我还是会有所克制的去使用 RxSwift。但是 Combine 的出现,彻底打消了我这些顾虑,Combine 的出现是苹果开发团队对 ReactiveX 的肯定,而且 SwiftUI 也依赖于 Combine,所以我觉得对 ReactiveX 充分理解,不再是一个考察开发者能力的可选项,而是一个必须要掌握的技能。如果你还没有开始了解 ReactiveX 那么 RxSwift 是一个不错的选择。

以至于 RxSwift 会不会被 Combine 替代?谁也不知道。把答案交给明天。

🌟 🐕 WWDC 2019

这是著名的 AFN 作者 Matt 大神写的博客,主要是针对WWDC 2019 keynote中的内容进行了一些解读和展望,如果你对于WWDC 2019 keynote已经比较了解了,那么看这篇文章可以帮助你更好地知道苹果新技术的一些思想,如果你不太了解,建议先到苹果官网了解一番,然后再阅读这篇文章。
这次 wwdc2019 对于开发者来说,最重要的莫过于推出了SwiftUI框架,重新定义了 UI 层的工作流程,因此 Matt 大神也着重提到了这点。具体来说就是苹果终于对于声明式编程方式提供了合理的支持途径,是可喜可贺的一步。
另外一个重大的变化就是 iPad 应用移植到 Mac 平台将会变得更加方便了,苹果称呼这个项目叫Project Catalyst,具体的内容,在 WWDC 的 session 上面都有提及,譬如 Session235Session205
作者在文章的最后再次强调了,今年 iOS 开发者要关注的重点,无疑就是 SwiftUI 和 Swift5 ,如果现在还没有对这两个方向给予足够的重视,那在技术上就很容易被拉开差距了。

🌟 🐕 First impressions of SwiftUI

@olddonkey:本文以一个类 SwiftUI 开源库的作者的角度出发,来介绍了一下自己对 SwiftUI 的第一印象。

作者在几个月前写了一个叫 CwlViews 的开源库,也是使用了声明式的设计思路,目标以简单的声明来快速构建 UI 组件。但是作者的设计思路与苹果的设计思路却并不完全相同。例如 SwiftUI 采用的是双向绑定,而作者采用的是单向绑定。再比如 SwiftUI 采用了 Value Type,而 CwlView 则因为 Binder 的原因,不得不选择引用类型。

以上这些比较最后让作者不得不做出一个“艰难”的决定:长远来看,作者将会放弃自己的开源库。但是在最低版本支持是 iOS 13 或 macOS 10.15 之前,SwiftUI 也会遇到很多的问题。而这些问题,都需要时间来完善。

🐎 一招教你解决 FlutterPlatformViews 内存泄露问题

@CrazyCoderShi:PlatformView 是 flutter 总一个非常酷炫的功能,使用 PlatformView 你可以贴一个 native 的控件到 flutter 的 render tree 中,这给了开发者无限的想想空间,但同时也带来一些坑点,比如内存问题,本文通过对 OpenGL 层面的探索发现并解决这一问题。

🐎 How To Adopt Dark Mode In Your iOS App

@J_Knight_:本文作者从使用条件,颜色,图片,代码层面上的 UIVisualEffectViews,NSAttributedString,以及调试方法几个方面讲解了如何使 APP 采用 Dark Mode。

🐢 Property wrappers to remove boilerplate code in Swift

@享耳先森Property wrappers 是在 WWDC 2019 随 Xcode 11 和 Swift 5.1 一起发布的,提案可以参考 SE-0258

本文举例使用 Property wrappers 实现一个 @UserDefault wrapper,用来解决 UserDefault 读取与存储包含大量模板代码的问题,另外,Swift UI 也利用了 Property wrappers 实现 View 与 Model 的动态绑定。

🐕 Swift Combine 入门导读

@老峰:Combine 是 WWDC19 Apple 官方推出的基于 Swift 的响应式编程框架。

本文浅显易懂的介绍了 Combine 中 Publisher 、Subscriber 、Subject 、Cancellable 等基本概念,作为作者 Combine 系列的第一篇很适合响应式入门级的读者阅读。

🐕 新晋网红 SwiftUI —— 淘宝带你初体验

在刚刚过去的 WWDC 2019,苹果为我们带来了很多惊喜,其中最引人注目的内容莫过于 SwiftUI 了。从学习 iOS 开发开始, UIKit 就一直伴随着我们。UIKit 是基于命令式的,而近年来,声名式和函数式方式来进行界面开发已经越来越普及,例如最近很红的 Flutter 。我想很多开发者都在期待苹果官方能够出一套类似的技术方案,这不,它就到来了。淘宝团队也在第一时间体验了 SwiftUI 并带了这篇文章,对于还没有去了解 SwiftUI 的同学,推荐看一看。不过,SwiftUI 虽然很棒,但是 Only iOS13 哦。

相关阅读:

WWDC 2019 - Session 722:Introducing Combine

🐎 Solving-ambiguous-constraints-without-rerunning-your-app

@jinmq: 本文介绍了使用 View Debugger + LLDB 的方式去定位并消除有歧义的 Auto Layout 约束,而不必每次尝试都重跑你的应用。

代码

🌟 RxCombine

@四娘:RxSwift 社区推出的一个用于与 Combine 进行交互的框架,提供了 Observable 与 Publisher 相互转化的功能,目前还是属于概念验证阶段。

🌟 RxSwift to Combine Cheatsheet

@Damonwong: 这是一个 RxSwift 和 Combine 库 API 的对照表,如果你对 RxSwift 的 API 已经很熟练了,那么这个仓库的对照表可以让你很快上手 Combine。

Swift-Docker Slim Images

@张嘉夫:Swift Docker 镜像的精简版本,适用于 Ubuntu 16.04 和 18.04,去掉了编译器只保留 runtime,镜像从 1.3GB 减小到了 200MB 左右,以便部署。

SwiftUI Hooks

@looping:这个项目是受到了 React Hooks 的启发,想证明下在 SwiftUI 上也能用 Hooks。目前作者已经实现了 useState、useEffect 和 useReducer 这几个 Hook,同时还写了一个 Todo List 作为演示。对 React Hooks 技术和理念感兴趣的同学可以持续关注。

MovieSwiftUI

@邦Ben:这是一个基于 SwiftUI 并且使用 Flux 架构完成的电影类 App,示例功能都比较完整。

参考链接:

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

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

说明

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

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

老司机 iOS 周报 #70 | 2019-06-03

03 Jun 03:24
Compare
Choose a tag to compare

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

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

新闻

iPhone 蜂窝网络下载限制提升到 200M

@JimQ iPhone 蜂窝网络下载限制从 150M 提升到了 200M,上次调整还是在 2017 年 9 月 从 100M 提升到 150M。值得一提的是,并非应用主页上显示超过 200M 就不能使用蜂窝网络下载了,只要经 App Store 压缩瘦身之后的应用大小不超过 200M 这个阈值都是可以下载的。

文章

🌟 🐎 开启 Cocoapods 新选项,加快项目索引速度

@红纸:来自编辑部@四娘关于 Cocoapods 1.7.0 的踩坑作品。其主要内容如下:

  1. 生成多个 Xcodeproj,在 Podfile 文件中可以加入 generate_multiple_pod_projects 选项,开启时,生成多个 Project 嵌套在 Pods 这个顶级 Project中,未开启的状态为一个 Project 对应多 Target。据@四娘考察这种方式所有的 Item 都会按照类别存放到各自的 section 里,最终在项目的结构树里会以引用的形式呈现,从而加快了索引速度。
  2. 在 Podfile 中 install! 函数只能调用一次,其函数是一个配置函数,仅保留最后一次的配置结果
  3. Swift 版本控制和生成多个 Xcodeproj 会有冲突,因为生成多个后,项目结构会发生改变 post_install 函数中 installer.pod_target 就没办法获取所有 pods 引入的 Target
  4. 在使用 Pod 时,我们可以去利用 pry 去调试 Pod 程序,简单易懂(如果想更好的去调试的话,建议直接调用 Pod::Command.run(%w(#{你要调试的命令,eg install})),可以一步步去断点调试到每一个函数的执行。)

🌟 🐢 Preparing a code base for WWDC

WWDC 马上就要到了,显然我们目前还并不知道会苹果具体会发布什么,但根据以往的经验,肯定会带来一些新的技术点,以及废弃一些老的 API 等等。所以我们依然可以提前为即将到来的 WWDC 做一些准备,如:

  • 去除一些老的 Warnings,它们可能存在很久了。
  • 让我们的工程结构更加的解耦,以避免像之前苹果废弃 UIWebView 时候替换 WKWebView 所带来的巨大的工作量。
  • 适当做一些单元测试和 UI 测试,这样能让我们更加从容面对新的 API 或者代码更改。
  • 大的项目基本都会或多或少有一些三方库在里面,所以在 WWDC 之前,可以做一些依赖项检查,了解它们内部工作的原理,这样在新版本升级时候遇到问题我们可以更好的去处理。
  • 使用一些最新的 API ,相信很多同学已经听说过今年可能会推出 Dark 模式,所以使用官方最新的 API 是减少以后适配成本的最好方式。

🐢 腾讯新闻前端团队:Flutter Web 初体验

@CrazyCoderShi:flutter_web 发布有一段时间了,业内对其褒贬不一,但不管如何 Goole 在持续的推动,在 flutter 1.5.4 以后的版本已经做到 Write once,Run everywhere , 同一份 flutter 代码可以在不做任何修改和适配的情况下同时运行在 iOS,Android,Web,Desktop。所以不管从哪个角度看,flutter_web 都是一门值得探索的技术。

本文由腾讯新闻前端团队推出,可以说是手摸手教你从零开始使用 flutter 来开发 web 前端应用。

🐎 Ordered Collection Diffing

@anotheren SE-0240 为 Collection 带来了新的一个新的方法 difference(from:)。就如同方法名本身,这个方法能够高效地处理集合之间的差异。本文以 UITableView 的数据更新为例,简明展示了这个新 API 的使用方法。目前这个提案的状态已经更新为 Implemented (Swift 5.1),相信本周的新 Xcode 就能使用了,不要忘了试一试。

🐕 🚧 Migrating to Codable from a third party parsing library

极速男孩007:在 Swift4 中,苹果引入了 Codable 协议。本文以 Argo 为例子,介绍了如何从第三方 JSON 解析库迁移到 Codable 协议中。本文主要通过实现 init(from decoder: Decoder) 和 decode(_ json: JSON) 这两个协议,并且让 JSON 对象遵循这个协议,使得对象即可以通过 Argo 也可以通过 Codable 去解析。

🐎 Understanding Compilers – featuring Swift!

@莲叔 本文以 Swift 为例,科普了编译器和解释器的区别以及编译器的主要组成部分,文中比较有价值的观点就是对于 Swift 这样一门比较新、语法也相对复杂的语音,对编译过程有所了解的确是可以对日常开发也有帮助。建议如果不了解相关知识的同学们可以看看,不过近些年编译器相关的文章并不少,横向比较下来看本文并没什么新东西,大佬可以略过。

🐕 Refactoring iOS app with Coordinator Pattern for Navigation

@老驴 这篇文章的作者从一个实际项目出发,介绍了如何使用 Coordinator Pattern 来对项目中的 View Controller 进行解耦,有兴趣的话也可以自己动手试一试。

前两年的有一段时间,这类库和这类设计思路盛行过一段时间,后来都逐渐没有了声音。倒不是这类库不好,而是在实际应用过程中,设计中的过度解耦会给项目编写带来不必要的麻烦,所以在应用过程中应该结合自己项目的情况进行考虑。解耦但不要过度解耦,才是应用的正确之道。

🐕 技术清谈【008期】【代号:超人】

@小T 这是著名 iOS 程序员 ChenYilong 整理的技术清谈话题,稍微看了一下 issue 列表,基本都属于要对底层实现或者 Swift 源码实现比较了解的话题。如果功利来说,属于面试不会问,工作中也很难遇到的场景,当然如果你是 sunny 组内的同学或者专业做 iOS 底层技术研究的同学除外。总体而言,issue 里面的问题都值得推敲一下,对于提升 iOS 技术都有很大的帮助。很多时候,解决方案不一定就是目标,可能在寻找解决方案的路上就已经学到了很多。

🐢 深入了解 Swift 中的初始化(Initialization)

@四娘:类型安全是 Swift 的一大特点,其中一个表现就是初始化的确定性,只要一个实例完成了初始化过程,它的属性就必然初始化完成,不会处在不确定的状态。

这篇文章的作者总结了自己对于初始化过程的了解,加上一些更加接地气的例子和练习,如果有同学对于这一部分知识还比较模糊的话,推荐一看。

工具

Stride - 跨平台的 Swift IDE

@含笑饮砒霜:Stride 是 Swift 开发的跨平台 IDE, 它是自托管的,您可以编辑、构建和运行。目前仅支持 macOS 和 Linux,但在目前的替代品有限的状态下,它是有用且可用的。尽管目前依然处于早期阶段,还有很多调试尚未实现,但如果您很感兴趣,可以在Twitter上关注作者,以获得 Stride 的进度更新,或者您也可以参与其中,贡献自己的一份力量。

launchaco

@张嘉夫:为创业项目快速生成产品宣传网站,包括快速构建自适应网站、利用 AI 设计图标、域名查询及注册的在线工具。

代码

🐎 XCTAssertAutolayout

@jimq:通过封装 XCTAssertAutolayout 断言为 autolayout 提供测试用例,仅支持 Swift。
原理是 hook UIViewAlertForUnsatisfiableConstraints 获取有歧义的约束,以此作为断言失败的依据。有 UI 测试需求的朋友推荐试用。

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

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

说明

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

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

老司机 iOS 周报 #69 | 2019-05-27

27 May 03:14
Compare
Choose a tag to compare

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

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

新闻

WWDC19 Schedule

@红纸:WWDC 2019 已临近,特此献上日程表以供各位进行提前查阅。
(另外推荐一款 macOS 下的观看应用 WWDC。)

新手推荐

🌟 🐕 给 iOS 开发者的 Flutter 指南

@邦Ben:作为一名 iOS 原生开发,如何更好的进入 Flutter?该文通过类比 iOS 开发中的概念来解释 Flutter 相关的内容,都是一些相当常见的基础内容,非常适合入门。Flutter 的热加载其实提供很好的入门试错体验,毕竟,你只需要保存一下就知道你写错了还是写对了,因此,入门的学习成本降低了不少。个人感觉,入门曲线要低于 ReactNative。

该文分为上下两篇:

🐕 UIButton: Padding Between Image and Text

@极速男孩007:本文介绍了如何通过修改 UIButton 的 contentEdgeInsets 和 titleEdgeInsets 还有 imageEdgeInsets的值,来改变 UIButton 中图片和文字的位置。

文章

🐕 Improving your Swift code using value objects

@含笑饮砒霜:值对象是自定义类型,它们是代表我们应用程序一部分的小型精确类型。与值类型一样,值对象应该是不可变的,值对象通过利用值类型的不变性以及添加自我验证的能力来帮助我们编写更易于理解,更容易测试,更安全的代码 。我希望您可以试一试。

🐎 @autoreleasepool uses in 2019 Swift

@xiaofei86:本文先是简单的介绍了 autoreleasepool 在 Objective-C 中的使用场景——在循环体中大量创建 autorelease 对象。而 ARC 对 Swift 的优化在过去几年中进步了很多,根据作者的测试,似乎 ARC for Swift 从不调用 autorelease,而是用多次调用 release 来替代。所以对于纯粹的 Swift 对象我们可能不再需要 autoreleasepool。但在 Swift 开发中 autoreleasepool 仍然有用,因为在 UIKit 和 Foundation 中仍然存在调用 autorelease 的遗留 Objective-C 类。以上便基本是本文的所有内容,如果你对 autorelease 的问题还不是很了解,可以去继续阅读原文。

🐢 Building a NFC Scanner App with CoreNFC in Swift

@享耳先森:在 2014 年 Apple 发布 Apple Pay ,iPhone 7 和 iPhone 7 Plus 是第一批支持 NFC 功能的设备。iOS 11 终于发布了 CoreNFC 框架,第三方 App 可以在前台读取 NFC tags,iOS 12 增强了 CoreNFC 的能力,允许在后台读取 tags 并通过 Universal Link 技术唤起 App。iOS 13 马上就要发布了,相信开发者们十分期待 Apple 开放 NFC 写入功能。

文章详尽的描述了如何从零开发一个读取 NFC tags 的应用,甚至十分贴心的介绍了如何制作 tags 供测试使用,建议对 NFC 有兴趣的开发者们读一读。

🐎 Using Codable to make enums with associated values even more powerful

@zvving:带有关联值的枚举被用在 Optional、Resutl<T, E> 等场景、为编码带来更丰富且严谨的语义。作者通过一处网络数据解析的案例,展现定义枚举相比类或结构体的优势。也详细介绍了在此基础上如何实现 Codable 协议,支持持久化。

🐎 Empty Strings in Swift

@JimQ 一个 string 是否 empty 可能有三种不同的含义:1. 长度为零;2. 只包含空白符;3. 可选值为空。针对这三种含义,文章分别给出了最优 & 最 Swift 化的判断方法。

🐕 OOM 与内存

@looping:本文作者从一起可疑的崩溃现象,即从崩溃日志上看,设备还有很多可用内存,但是排查发现,却是内存分配失败后对无效地址的访问错误;再结合内存分配方式,发现每种类型的内存分配地址都是有上限的,也就是说即便在设备依然有可用内存的情况下,如果某个类型的内存地址被分配完毕,同样会引发 OOM 问题。

本文不管是对问题排查过程的描述,还是对 malloc_zone 的分析介绍,都是一份很好的学习资料,感兴趣的同学可以深入学习下。

工具

🌟 i18ns.com

@张嘉夫:i18ns.com 是一个免费的多语言翻译搜索网站,致力于让软件国际化变得简单便捷。作者从长期的软件开发过程中发现,超过50%的软件文案都是可复用的,而在同类别软件中可复用的内容甚至超过80%以上,于是创建了这个网站。 期望能帮助广大小微开发者能更廉价更便捷地完成软件国际化翻译。

Fledge

@老峰:Fledge 是一个构建 Flutter 项目的 CI/CD(持续集成/持续部署)工作流工具,包括自动构建、测试、签名和发布 Apple Store 和 Google Store,支持 Travis、Jenkins、GitLab 等,感兴趣的同学还以点这里

代码

Flutter4GitLab

@CrazyCoderShiFlutter4GitLab纪阳同学用 Flutter 实现的一个 GitLab 客户端,只实现了一部分功能。对于正在学习 Flutter 的同学是一个不错的一手参考资料, 项目中的一些插件的使用很是值得学习, 比如:

  • xml 解析
  • html 标签展示
  • 通过 stetho 连接 Chrome 的 Network Inspector

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

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

说明

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

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

老司机 iOS 周报 #68 | 2019-05-20

20 May 03:13
Compare
Choose a tag to compare

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

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

新闻

🌟 SE-0260 Library Evolution for Stable ABIs

四娘:目前 ABI 稳定的工作正在逐步收尾,Swift 5.0 达成的是标准库的 ABI 稳定。但这种 Module ABI 稳定的机制还没有提供给外部用户使用。

当前标准库是通过一些私有的注解和编译选项来使用这一套机制的,所以这次提案讨论的内容就是如何将它作为一个功能提供给我们使用,里面涉及的主要是一些语法和编译选项的设计。

需要跟 SDK 打交道的同学可以点击查看更具体的内容。

(SE-0253)Callable values of user-defined nominal types

Swift Evolution 最近通过的新的提案,(SE-0253)为 Swift 带来了静态调用的 Callable。作为对比你可以看看在 Swift5.0 中就引入的(SE-0216@dynamicCallable。或者,你也可以对比一下 Python 中的 __call__

新手推荐

🌟 FlutterDartTips

@olddonkey:对于很多刚接触 Flutter 的同学来说,有一些 Dart 和 Flutter 编写中的一些小技巧可能并没有特别的熟悉。这些小知识点很多时候能让开发的时候,减少掉很多不必要的负担。

有一位来自印度的同学,就建了这样的一个项目,专门分享这些 Dart 和 Flutter 的小知识点。即便你已经对此很熟悉了,也不妨可以看看是不是有什么遗漏的点。

文章

🌟 🐎 CocoaPods 1.7 新特性

@J_Knight_:本文介绍了 CocoaPods 1.7.0 的几个新特性:

  1. 支持多个 Swift 版本:可以在 podspec 配置文件中通过 swift_versions 字段指定其支持的 Swift 版本。也可以可通过 supports_swift_versions 字段为 Podfile 文件中集成的每个 target 指定所需的 Swift 版本。
  2. 引入 App Specs:引入了 app apecs,允许 pod 库作者在其 podspec 中描述一个应用程序。
  3. 生成多个 Xcodeproj:可以将每个 pod 库集成为其自己单独的 Xcode project,并嵌套在顶级 Pods.xcodeproj 下,这样显著提高大型 CocoaPods 项目的性能。
  4. 增量安装:支持了仅重新生成自上次 install 以来发生更改的 pod 库,而不是像之前那样重新生成整个 workspace。
  5. 新增 scheme 字段:可以为 specs,test specs 以及 app specs 自定义 scheme 的生成。
  6. 支持 .xcfilelist:script phases 支持使用 .xcfilelist 来指定脚本的输入和输出路径。
  7. 为 Master Specs Repo 提供 CDN 支持:启动了对 CDN 的支持,以避免在本地机器或 CI 系统上克隆 master specs repo,让使用 CocoaPods 更加方便。
  8. 为 Windows 系统提供支持:添加了对 Windows 系统的支持。

🌟 🐎 Image Resizing Techniques

@邦Ben:Mattt 大佬说:大量的调整图片的代码都宣称自己是最正确的。因此,Mattt 给出 5 种不同的技巧以供选择。什么情况我们需要缩小调整图片尺寸?当图片尺寸远大于需求的时候,缩小可以节省内存提高性能。

  • Drawing to a UIGraphicsImageRenderer (UIKit)
  • Drawing to a Core Graphics Context (Core Graphics)
  • Creating a Thumbnail with Image I/O (Image I/O)
  • Lanczos Resampling with Core Image (Core Image)
  • Image Scaling with vImage (vImage)

最后通过性能对比,前三种方法性能较好。如非必要,不使用后两种。
各个方法的示例代码,请阅读原文。

🚧 🐎 A Deep Dive Into Hero Widgets in Flutter

@CrazyCoderShi:对于 Hero 动画想必做移动开发的同学都不陌生,通常在 Native 开发情况下想要实现这个动画并不容易,但是在 Flutter 中内部就实现了这一交互效果,只需简单的使用 Hero 这个 Widget 即可,本文详细的讲解了 Hero 的基本使用和定制化开发。

🐢 基于协程的编程方式在移动端研发的思考及最佳实践

从超级 App 的性能和代码痛点从发,道出 iOS 异步编程现状存在的缺陷,想必读者也感同身受。

  • 多线程访问引发野指针问题
  • 多线程访问引发容器类崩溃问题
  • 多线程访问引发过渡释放问题

从而引出协程,基于协程的全新的异步编程方式,是我们解决现有异步编程问题的有效的方式。想要了解协程的最佳实践,读者们可以仔细阅读本文。

🐢 Xcode Build Configuration Files

在 Xcode 中可以设置我们项目相关各种工程设定,但是把所有的编译配置都在 Xcode 中设置有时候并不是一个明智的选择,光 Build Settings 选项里面就有上百项的设置选项,这并不利于我们维护。但好在苹果给了我们另外一种方式,使用 xcconfig 文件。它是用来保存配置键值对的纯文本文件,这使得我们可以分离代码和配置,如果你也有为工程配置烦恼过,不妨尝试试用一下 xcconfig 文件。

推荐阅读:

🐎 在闲鱼,我们如何用 Dart 做高效后端开发?

@xiaofei86:Dart 是一门简洁、容易上手、对异步支持良好的编程语言,在 Flutter 的开发中大放异彩。本文简单讲解了闲鱼使用 Dart 进行后端开发的实践经验。在闲鱼团队的努力下,Dart 用于后端开发的支持逐渐完善,前台和后端开发人员已经能够快速高效地使用 Dart 开发胶水层接口。未来闲鱼团队会着力于进一步改善 Dart 开发体验、与 Java 项目的兼容性、提升 Dart 远程服务的性能,挖掘 Dart 在后端开发中更大的潜力。

🐢 What to Expect From Marzipan

Marzipan 是 Apple 内部项目代号,Apple 在 WWDC 2018 发布了一项计划:将 UIKit App 迁移到 macOS 上。

@享耳先森:WWDC 2019 不久就要开始,预计 Marzipan 计划将有新的进展,但作者认为平台迁移没有想象中那么美好,不是光适配代码发布就完事了,作者从开发、设计及市场三个方面分析迁移可能会面对的难题。

工具

Run Swift in browsers

@AidenRao:将 Swift 代码编译为 WebAssembly ,使它能在浏览器上直接运行。目前还是第一个版本,Swift 的很多功能还需要支持,感兴趣的同学可以加入 swiftwasm

代码

🌟 Mango

@looping:MangoFix 是一个 iOS 热修复 SDK,不同与 JSPatch,它内置了一个语法和 Objective-C 非常类似的 DSL 和对应的解析器。它的设计目标是为了解决 iOS 热修复问题,所以在使用的便捷程度和性能方面都有很大优势。对 iOS 热修复或者制作 DSL 感兴趣的同学可以参考作者写的 《MangoFix:iOS 热修复另辟蹊径》《iOS 热修复 MangoFix 原理分析》 这两篇文章深入了解下。

ui-fabric-ios

ui-fabric-ios 是微软开源的一个界面框架,可为 iOS 平台提供 Office UI 体验。它包含有关颜色和排版的信息,以及平台控件的自定义,所有这些都来自 Office 和 Office 365 产品中使用的官方 Fluent 设计语言。感兴趣的同学可以下载下来深入研究。

mathAI

@莲叔:拍照做题在生活大爆炸中第一次出现后,就引起了不少关注,这个极具未来感的应用场景随着计算机视觉技术的发展已经逐渐走近现实,该作者基于 py 实现了一套拍照做题的系统,并在仓库中附带了一份 ppt 来介绍自己的防范,大概就是首先通过 opencv 进行字符预处理,然后用 cnn 来识别手写的字符已经数学符号,并根据空间信息来重建出手写公式的信息结构,最后一步通过编译原理中的表达式处理等方法来求解式子。作者部分开源了代码,但应该也能从中学到主要的流程,有兴趣的同学可以学习。

音视频

ggtalk | 聊聊跨平台:Weex 尚能饭否?

@莲叔:如标题所说,这一期的 ggtalk 讨论了 Weex 这个颇具争议的框架。节目中除了聊 Weex 本身的一些问题之外,还聊到了一些对 Weex 比较常见的误解。虽然 Weex 和 RN 经常被拿来做比较,但其实本身的定位却有区别,本质上是 for 不同目的的业务场景,比如 RN 比较完整的包装了系统的接口,目标是尽可能闭环在 RN 的环境中完成整个 app 的开发,而 weex 恰恰相反,其相对简洁的框架主要是服务于动态 UI 的实现,绝大多数逻辑部分还是依赖于 Native 实现,但也就因为这个特性,Weex 有非常简洁的和 native 进行 bridge 的框架方法。这类问题在节目中得到了充分的讨论,当然也包括其中的一些坑,有兴趣的同学可以看看。

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

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

说明

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

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

老司机 iOS 周报 #67 | 2019-05-13

13 May 06:04
Compare
Choose a tag to compare

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

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

新闻

19 年老司机周报定制 T 恤上架啦

只订做一批,错过不再有。只要钱到位

🚧 Google I/O for Flutter

@CrazyCoderShi:伴随着 Goole I/O 大会召开,Flutter 这几天又刷屏一波,一个好消息和一个坏消息:

  • 好消息 | 全平台支持: Flutter 1.5 稳定版发布,并为我们带来了 Flutter for web - Hummingbird 以及可供嵌入式设备使用的 Flutter for Embedded。自此,也正如官方宣称的 Flutter 已经支持全平台。
  • 坏消息 | 暂时无热更新: Flutter 官方开发团队宣布暂时不会开发热更新(Code Push)功能,原因如下:
    • Code Push 在 Android 和 iOS 平台上各有不同的限制
    • 出于安全方面的考虑,可能会被滥用

🐕 MongoDB 宣布收购 Realm

@xiaofei86: MangoDB徐娜不3900万美元的价格收购 Realm ,通过收购弥补了 MongoDB Mobile 在移动端的不足。 Realm 作为一款成熟的移动端数据库框架有着数十万的用户,并且在github上有着1w + 的star。

🐕 搞事情之 Vapor 初探

@老峰:从 Swift 开源并支持 Linux 运行之后,Swift Server Side 趋热,先后出现了 Perfect、Vapor、Kitura 和 Zewo 几个框架,其中 Vapor 目前在 Github star 数最多。

本文是作者对 Vapor 的探索实践,分享了在 Vapor 中 MySQL 的基础使用;在 Vapor 中的用户鉴权;以及自己实践中的心得体会。

相关阅读:
Swift HTTP Server 开发体验
Docker ❤️ Swift & Vapor

文章

🐕 泛型语法改进第一弹 —— Opaque Result Types

@享耳先森:Swift 5.1 将包含针对范型的一个重要改进 —— Opaque Result Types:简单来讲,用 some 修饰的方法返回值或属性,其具体类型在编译时就能确定,并且是由被调用方去决定。

🐕 What should I learn if I want to contribute to the Swift compiler?

@莲叔: Compiler 相关的工作一直处于鄙视链的顶端,这篇帖子的楼主在 2018 年 11 月的时候给自己定了一个看起来有点梦幻的目标:2019 年末能够参与到 Swift compiler 的开源工作中去(即便是楼主自己也认为很梦幻)。但有爱的 Swift 社区告诉楼主这并不梦幻,可以实现。首先 codafi 提出事实上在 Swift 编译器源码中的 C++ 并不是 Raw C++,而更多是 LLVM C++(LLVM C++并不是一门语言,而是 LLVM 工程规定的一系列 API和规范),是复杂,但没有那么复杂, 所以从 LLVM 代码规范是最佳的入门材料,不用被 C++ 吓到。然后 Aljandro 甚至给出了编译器各个环节如 Lexer、Parser、Sema 到 SIL,LLVM IR 分别对应在哪些编译器的源文件中实现,简直不要太良心。除此之外,还分享了自己很多在 compiler 相关的大型项目中如何挖到合适的点切入的经验。

整个帖子有不少优质的回复,都是既具备专业性,又照顾了对 compiler 技术陌生的新人,不容错过。

🐕 大侦探福老师——幽灵Crash谜踪案

@邦Ben:该文闲鱼技术小编描述了出现 BUG 到分析 BUG,到如何最终艰难地找到 BUG 的过程,非常值得一看。最后也得出了结论:Flutter 在用户启动辅助功能(如阅读屏幕)的情况下会出现 Crash(新版本已经 fix,同学们都升级一下。)例外这里面还提及到两个有意思的点,线上 Zombie 野指针监控和 UI 自动化重现。另外有一个很重要的点:保持和用户的良好沟通,最后直接上门现场 DEBUG,没准还可以帮妹子顺手修修电脑 >_<。

参考链接:

🐕 LLVM 编译器中的内置 (built-in) 函数

@looping:以 __builtin_ 开头的函数声明或者调用其实是一些编译器内置的函数或者编译优化处理的开关,其作用类似于宏,只不过这些内置函数并不是真实的源代码,而是一段指令块,起到编译时的内联功能。本文就介绍了八个特殊的内置函数及其用法,熟练使用这些内置函数可以提升我们程序的运行性能,也可以扩展一些编程的模式技巧。

🐕 What's new in RxSwift 5

@olddonkey:RxSwift 5 终于和大家见面了。RxSwift 5 带来了一些不算小的变化,比如有拆分 Relay 出 RxCocoa,成为独立框架,转用 DispatchTimeInterval 以对更小时间间隔的更好支持,舍弃 Variable,新增 do(afterNext:) 以及允许绑定多个观察者等变化。对于现有的 RxSwift 开发者来说,不算是根本上的变化,但是需要在一些使用习惯和语法上进行相对应的改变。

如果对英文版不是很有信心的话,也可以看看小集团队发布的中文翻译版

🐢 深入iOS系统底层之映像文件操作 API 介绍

含笑饮砒霜: 所谓的映像可以理解为将一个程序文件的内容加载到进程虚拟内存中的内容,也就是说进程的映像就是程序磁盘文件在内存中的一个副本。程序文件和映像之间的关系就如程序和进程之间的关系是一样的。那关于进程映像操作的 API 有哪些呢:

  • 获取当前进程中加载的映像的数量
  • 获取某个映像的 Mach-O 头部信息结构体指针
  • 获取进程中某个映像的名称
  • 获取某个库链接时和运行时的版本号
  • 注册当前线程结束时的回调函数
  • ...

相关操作的 API 有很多,在 <mach-o/dyld.h> 都有声明。通过相关 API 的使用,可以检测程序中某个类的某个方法是否被非法 HOOK 了。可执行程序中定义的类的实例方法的实现地址总是在可执行程序映像的地址区间范围内,即使是这个方法被可执行程序中的其他方法 HOOK 了,这个 HOOK 的方法地址仍然是在可执行程序的映像地址区间范围内,我们仍然认为这是一个合法的 HOOK 。如果这个实例方法被恶意攻击者通过动态库注入并以方法交换的形式来 HOOK 原有方法的实现时,因为HOOK的方法地址是在恶意注入的动态库映像的地址区间范围内,所以我们就可以通过检测这个类的实例方法的实现地址是否在可执行程序的映像的地址区间范围内来判断这个方法是否被恶意 HOOK 了。

🐕 百度App iOS工程化实践: EasyBox破冰之旅

@xiaofei86:EasyBox 是手百开发的一套包管理工具集。致力于为超级 App 量身打造一套现代、高效、优雅的研发工具链。EasyBox 主体由工程组装器(Installer)、多仓库管理工具(MGit)、二进制管理工具(LFS)三部分构成,分别负责工作区的构建(组件依赖分析、工程的生成与组合)、源码仓库的管理以及二进制的管理。本文对 EasyBox 的设计进行了讲解,从中可以学到一些软件架构的思想和工程管理的经验。但并没有开放源代码。

🐢 Sharing code between iOS and Android using J2ObjC

tom: 这是关于跨平台开发的系列文章,之前作者还有讨论采用 C++ 来进行 iOS 和 Android 的跨平台开发。关于跨平台的好处就不多说了,这篇文章主要介绍了使用 J2ObjC 来进行跨平台开发。J2ObjC 是一个代码转换器,能够直接将 Java 代码翻译成 Objective-C 代码,从而达到跨平台开发的目的。注意的是,正如大部分的跨平台开发框架一样,一般跨平台代码只适合工作在 Model 层,在 UI 层的代码几乎无法做到一份代码共享多个平台(自带虚拟机或者语言翻译机的除外,如 RN、Flutter 等)。最后总结一下 J2ObjC 的优缺点

优点

  1. 代码共享
  2. 可以只用 Java 进行开发(Java 开发人员容易招,iOS 同学嘛)
  3. 可以在 iOS 工程中调试 Java 代码

缺点

  1. 代码翻译总是会出错的
  2. 如果需要 Swift 混编的话是个灾难
  3. 翻译出来代码不是最优形式,会增加包体积大小
  4. 翻译的范围有限制,仅限用可支持的 JRE 类
  5. 如果依赖了一些第三方库,而又与 J2ObjC 不兼容的话也是一个大问题

🐢 100-Days-Of-iOS-DataStructure-Algorithm

kyo: 算法应该是面试中大多数公司都会考察的点,虽然在日常的业务开发中可能并不常使用,但如果做一些深入的比较复杂的项目,算法就是必不可少了。可以说,如果在技术上想更深入的了解,算法和数据结构就是必须要熟悉的。在众多相关的文章中,以 C++,JAVA 等语言进行讲解的很多,很少以 OC 来讲的文章,而这个系列文章就采用 OC 为主语言,这对其他语言不太了解的同学来讲是个福音。

工具

SwiftKit

@张嘉夫:用命令行快速生成跨平台 Swift Framework,支持 iOS、tvOS、watchOS 和 macOS,兼容 CocoaPods、Carthage 和 Swift Package Manage,整合了 Fastlane 以便测试和发布,采用 Jazzy 来生成文档。此外还包括 README.md 模板、格式工具 SwiftLint、持续集成服务配置模板(Travis、GitLab)以及自动判断库名在 CocoaPods 上是否已被占用等等。

Messier - 简单易用的Objective-C方法跟踪工具

@红纸:Messier 可以用来跟踪 iOS 应用的 Objective-C 方法调用。在越狱设备上可以跟踪任意应用,在非越狱设备上也可用于跟踪调试中的应用或使用 Monkey Dev 植入框架的项目,仅支持 arm64 的真机。据文中作者介绍,其原理基于 Hook objc_msgSend 来实现函数记录,存储本地,使用自研工具导出文件后,使用 catapult 进行展示。另外调试过程中或多或少影响到了调试性能,适合查问题的时候进行植入。

代码

MaLiang - iOS 涂鸦库

anotheren: MaLiang 是 iOS 平台基于 Metal 的涂鸦绘图框架,完全使用 Swift 实现。

目前支持的功能:

  • 笔迹通过贝塞尔曲线进行平滑处理
  • 支持添加自定义贴图
  • 纹理和贴图支持旋转
  • 内置一个荧光笔特效的实现
  • 可以根据压力自动调整笔迹,支持 3D Touch
  • 支持撤销和重做
  • 支持滚动和缩放画布
  • 导出绘制内容为图片
  • 将绘制内容保存为矢量文档和从文档恢复数据

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

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

说明

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

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

老司机 iOS 周报 #66 | 2019-05-06

06 May 05:28
Compare
Choose a tag to compare

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

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

新手推荐

Flutter 豆瓣客户端

@邦Ben:该开源库,对豆瓣客户端有一定的还原度,不过未实现部分也挺多,毕竟仅仅只是学习用途,暂时里面并没有用到更为复杂的 Rx 或者 Redux ,因此十分适合新手先上路。在学习 Flutter 的同学可以一看。

PS:项目需要还原一下 Podfile 为初始状态方可运行( BUG )

文章

🌟 🐕 移动开发这十年

@莲叔: 移动开发从诞生之日起,到现在已经过了十年时间,这篇文章是 InfoQ 邀请美团的藏成威老师回顾了移动开发技术的十年演变。笔者作为移动开发年限算比较久的老兵,有幸经历了其中大部分的浪潮。其中绝大多数技术升级都是围绕跨平台、动态性,归根到底技术体系的升级是围绕业务形态来决定的。文章比较全面的剖析了从 H5 hybrid,到 RN/Weex, 到 Flutter/小程序等不同阶段的跨平台技术。文章本身没有太多技术点,但非常适合拿来作为思考技术和业务是如何相互影响的素材,在阅读文章的时候要多问 Why,相信会有不少的收获。

🌟 🐕 🚧 Reducing FOOMs in the Facebook iOS app

@zvving:Facebook 2015 年的一篇经典文章,提出优化 OOM 问题的一些思路:

  • 通过列举所有 App 被终止的已知路径区分是 FOOM 还是 BOOM
  • 分析内存使用状况,从 UIWebView 迁移至 WKWebView,降低内存占用
  • 避免内存重复申请与释放,减少多大 30% OOM Crashes
  • 完善基础设施:跟踪 App 中每个类的实例计数和内存占用

相关阅读:iOS微信内存监控

🌟 🐕 iOS App 安全加固方案调研

@红纸:iOS 系统向来以安全著称,但是在越狱面前,我们的 App 接近于裸奔的状态。在本文中,作者整理了如下内容:

  1. 现有市面上已有的加固方案,以图片的方式,展示了各家公司的核心功能点。
  2. 对现有的加固方案,进行了一次规整,总体方案梳理
    1. 数据保护:细分中有网络数据、IPA 资源数据、沙盒数据、Keychain 数据
    2. 混淆保护:细分中有符号混淆、字符串混淆、指令混淆
    3. 反调试保护:细分方案有 ptrace 和 sysctl 两种防护策略,(有兴趣可以参考 关于反调试&反反调试那些事)
    4. 异常检测:动态监控 App 的异常信息,例如被注入、篡改代码、重签名等攻击行为

世界上没有绝对的安全可言,想要了解更多关于安全方面的知识,推荐沙老师的书《iOS应用逆向工程》,以及 念茜的安全攻防系列

🌟 🐕 🚧 为什么需要 Reactive Programming?

@Jason:相信有不少同学都或多或少尝试过 ReactiveCocoa 或者 RxSwift,享受到了链式调用的快乐,但是对于 Reactive 思想的本质,可能不一定每个人都有深入的思考过。本文抛开 Rx 库本身,也没有再重复介绍如何使用 Rx,而是从一些日常开发过程中的问题出发,探讨 Reactive 思想的由来,它所解决的关于数据流、事件传播和观察者模式的一系列问题,以及作者在几年的使用中所领悟的一些更深层次的思考。

🐕 Architecturing an app with functional reactive programming

@anotheren:本文从常见的“回调地狱出发”,讲述了为什么应该使用响应式框架来进行编程。并以 ReactiveX 框架为例,同步展示了在 Swift/Kotlin 中这类框架的思想和应用,推荐阅读。

🚧 🐕 Optional, throws, Result, and async/await

@xiaofei86:在 Swift 5 之前,我们通过 optional 和 throws 来处理错误。在 Swift 5 中,虽然没有我们期盼的 async/await 特性,但在标准库中增加了 Result 类型。本文对这些 Swift 错误处理的方式进行对比,让你更好的了解 Swift 错误处理的进化过程。

工具

Xcode10 New Build System And CocoaPods

@享耳先森:Xcode 10 发布之后,你可能发现修改了 CocoaPods 依赖库的源码之后立即编译并不生效,必须 clean 整个项目重新编译,这其实是 Xcode 10 默认采用 New Build System 导致的,本文介绍了两种解决方案。

Marzipanify

@老峰:在 WWDC 2018 苹果分享了名为 Sneak Peak 的工具可以将 iOS APP 移植到 Mac 中,并宣布 2019 对第三方开发者开放,Marzipanify 是 Steven Troughton-Smith 自己开发的一个小工具让开发者提前体验 iOS APP to Mac APP,感兴趣的读者快来尝试吧。

代码

手把手教你在Flutter项目优雅的使用ORM数据库

@CrazyCoderShi:Flutter 现在开发上最大的槽点可能就是数据库使用了,Flutter 现在只提供了 sqllite 插件,手写 sql 代码,建表、建索引、transation、db 线程控制等等繁琐的事情必然接踵而至,这种数据库使用方式是最低效的了,又倒退回去裸写 sql,这对大部分团队都是重大的成本。

本文将详细介绍一种在 Flutter 项目中优雅的使用 ORM 数据库的方法,文中使用的 ORM 框架是包含在一个 Flutter 插件 flutter_luakit_plugin (如何使用可参考介绍文章)中的其中一个功能,本文只详细介绍这套 ORM 框架的使用和实现原理。并且给出了一个详细的 demo

开源库

NSFWDetector

@张嘉夫:CoreML NSFW(色情)内容检测器。NSFWDetector 是一个小型(17 kB)CoreML 模型,由 CreateML 训练,用于检测图片中的裸体。

InAppViewDebugger

@红纸:UIView Debugger,类似于 Reveal 和 Xcode 中集成的组件,其比较方便的是能够在 APP 内就可以直观的去查看,但目前它只是处于 1.0 版本,功能仅限于查看视图层级,期待其能拥有更加完善的功能。

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/

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

说明

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

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

老司机 iOS 周报 #65 | 2019-04-29

29 Apr 03:55
Compare
Choose a tag to compare

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

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

新闻

『基于多重替换方式的 iOS 代码混淆方案』- 勘误

在 65 期,我们收录了『基于多重替换方式的 iOS 代码混淆方案』一文,后经读者反馈,我们发现这篇文章的内容存在严重的抄袭迹象。文中涉及到的混淆方案抄袭自 @kaichcodeobscure。目前该文章的在知乎和掘金上已经被删除,周报也在第一时间删掉了有争议的推荐内容。对此次事件,我们对 @kaich 和广大读者表示抱歉,同时也感谢各位读者的监督和反馈。

另外,在收到反馈之后,我们小挖了一下那篇抄袭文的作者,发现此人是惯犯,洗稿专业户。他的 GitHub(RobinChao)和博客(Technical.io),真的是仿品聚集地。

WWDC 2019 for developers: Siri, Marzipan and AR improvements, more

距离今年的 WWDC 已经只有将近一个月的时间了,众所周知,WWDC 向来能带给行业和开发者带来全新的围绕用户体验新技术,本篇文章给我们介绍了本次 WWDC 会发布的新的 API 以及特性,主要有:

  1. 新的 Siri intents
  2. Marzipan 的优化(Marzipan 就是让 macOS App 也能用上 UIKit 的技术)
  3. Swift-only 的 AR 框架
  4. 震动引擎,NFC 在以前的基础上提供了更多的功能
  5. CoreML 支持动态训练以及音频的分析

新手推荐

How to make Auto Layout more convenient in iOS

@邦Ben:该文从 Frame 布局,到 Autoresizing 讲到了 AutoLayout,并且介绍了如何简单的进行封装 AutoLayout,以提高易用性。毕竟众所周知,原生的 AutoLayout 异常难用,在 OC 下,Masonry 的出现简直是拯救了世界。在 Swift 下,各种布局系统百花齐放。同时眼光不妨放到 React Native 和 Flutter 上,声明式布局非常值得学习。

文章

🐕 RxSwift & MVVM - How to use RxTests to test your ViewModel

@Damonwong:之前我问过好多人这样一个问题,你觉得 Rx 框架到底解决了一个什么样的问题?虽然答案都不太一样,但是引入 Rx 框架,便于封装 ViewModel,然后编写单元测试提高应用稳定性是大部分人比较认可的一点。

所以推荐大家阅读一下作者写了三篇关于 RxSwift & MVVM 的文章:

🐎 Conditional Compilation Part 1 Part 2 Part 3

@四娘:之前我们在 29 期周报里介绍过这篇文章的第一篇:

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

后面陆续写了 Part 2 和 Part 3,主要是介绍了跨平台代码库编译选项的一些控制方式,对这方面有疑虑的同学可以看一看

🐕 Flutter 实时视频渲染

@CrazyCoderShi:Flutter 如火如荼的火了一段时间了,但鲜少有关于音视频方面的文章,本文是声网 Agora 的高级架构师张乾泽在 RTC Dev Meetup 上的分享,主要介绍 Agora 在 Flutter 实时音视频开发方面的实践经验,整个分享分三部分:

  • 基于 Texture Widget 实现思路分析
  • 基于 PlatformView 实现思路分析
  • 两种方案的性能对比

🐎 对职业发展的一些想法

职业发展是每一个职场同学都会去思考的很重要的问题,我们也常常说有时候选择比努力更重要,除了个别的运气成分外,我们能过左右的就是如何去做选择。本文是 limboy 对职业发展的一些看法,从稀缺度剩余市场空间这样两个角度去谈,结合生动的坐标图,让人一看就很明了。

🐕 How to run a single test in Xcode

@老峰:本文作者归纳总结了在 Xcode 中运行单元测试的一些小 tips:

  • 通过 gutter (左边列)
  • 通过 shortcut (快捷键 ^ ⌥ ⌘ U)
  • 通过 scheme
  • 通过 terminal
  • 通过开源测试库如:Quick

🐕 iOS 中的 Promise

@四娘:当你需要连续地执行多个异步过程时,总会无可避免的出现地狱回调,Promise 是一个不错的解决方案,这篇文章前半部分主要讲了 Promise 具体的实现,后面介绍了一些实用的 API,感兴趣的朋友可以看一下。

🐎 Preventing Infinite Loops in Swift Property Observers

@张嘉夫:Swift 的属性观察器 (即 willSetdidSet hook 函数)非常实用,可以用于验证、通知和调用 log 方法等等,适用于结构体、类和枚举。但在使用强大的属性观察器时,要避免搬起石头砸了自己的脚,这篇文章会为你介绍如何避免在 Swift 属性观察器中创建无限循环。

🐎 如何画出一张合格的技术架构图?

画架构图是架构师的第一门课,本文介绍了架构图的各种画法和具体案例,希望让大家在架构图方面的理念和经验得到提升

架构图分类

  1. 场景视图:一般就是我们理解的用例图
  2. 逻辑视图:一般是组件图和类图
  3. 物理视图:一般是部署图
  4. 处理流程视图:一般是时序图和流程图
  5. 开发视图:一般是包图

好的架构图:好的架构图是不需要解释的,它应该是自描述的,并且要具备一致性和足够的准确性,能够与代码相呼应

最后推荐 C4官网,有各种画图的模板可以参考

工具

MTHawkeye

@looping:MTHawkeye 是美图 iOS 团队开源的调试和性能优化辅助工具集,旨在帮助 iOS 开发者提升开发效率、优化性能体验。目前已经包含对内存、CPU、电量、网络等的使用监控。由于该工具模块采用了可扩展的插件式设计,所以我们也可以根据自己的需求定制合适的开发调试插件。详细介绍可以参考这篇文章 MTHawkeye:美图开源的iOS调试辅助、性能优化工具集

代码

Swiftshield

@oldonkey:这是一套代码混淆工具,作用是加密工程的函数和类名,来免疫一些逆向工程。加密的原理很简单,就是把所有函数和类名都替换成一段新的字符串。此工具可以加密,也可以解密,以方便对 Log 进行 Debug。

开源库

IkigaJSON

IkigaJSON 是一个非常快的 JSON 解析器,它的解析速度大概是是 Foundation 中对应组件的 4 倍。它也提供了 SwiftNIO 的支持(同时也依赖 SwiftNIO),你可以直接从 ByteBuffer 对象初始化需要的 JSON 。

音视频

ggtalk | 聊聊我们的编程启蒙经历

@J_Knight_:本期 ggtalk 邀请的嘉宾是李亮老师和莲叔。围绕本期的主题,二位嘉宾和主持人梁杰都分享了各自的编程启蒙经历。

此外,还分享了对“中年危机”的看法以及关于小孩应该如何入门编程的讨论。

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

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

说明

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

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

老司机 iOS 周报 #64 | 2019-04-22

22 Apr 03:16
Compare
Choose a tag to compare

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

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

新手推荐

🐎 Designing Swift APIs

@zvving:如何写出可读性更高的代码?本文提供一些示例:参数标签可以帮助我们定义清晰易读的 API,嵌套类型能提供辅助的上下文关系,强类型为代码增添必要的仪式感,可扩展的 API 设计能同时满足便捷调用和丰富定制。

作者认为:『人人都是 API 设计师,当我们在设计非私有属性或方法时,我们都在设计 API』,你认为呢?

文章

🌟 🐕 Humble Asset Catalog & Assets Catalogs 与 I/O 优化

@looping:这两篇文章分别从各自的角度解释了在使用 Asset Catalogs 后,读取图片资源的速度变快的原因。

通过仔细阅读这两篇文章,我们能够更清晰地了解到:

  • Asset Catalogs 和 car (Compiled Asset Catalogs) 文件的相关内容以及它们的作用
  • CoreUI 框架对图片资源加载过程的一些逻辑细节

从而明白使用 Asset Catalogs 后,在加载资源上速度更快的原因:

  • Asset Catalogs 会对图片进行分类压缩存储,减少在目标机型上的资源文件大小,提高读取速度
  • 通过内存映射 (mmap),减少 I/O 操作,加速读取 car 文件内容
  • car 文件实际上是一种特殊的 BOM 文件,能够在加载图片时直接获取 rendition、renditionKey 以及 attribute 这些信息,不同于从文件夹 (bundle) 中读取,需要执行耗时的 -[CUIMutableStrucetedThemeStore canGetRenditionWithKey:] 操作来读取 rendition 和 renditionKey

除了文章带给我们的结论,以及我们今后可以做的事情 (将常规资源文件都迁移到 xcassets 中) 之外,两位作者对问题的探寻和思考的方式也是非常值得学习借鉴的。

🌟 🐢 Let’s write Swift code to intercept SSL Pinning HTTPS Requests

@含笑饮砒霜:现在几乎绝大部分的 iOS App 都使用了 HTTPS 请求,这极大提升了我们使用的安全性,但也不意味着这就是绝对安全的。

如果想检查 iOS 应用中的 HTTPS 请求,最常用的方法就是中间人(MITM)攻击,这种技术需要使用某台主机作为代理服务器,为客户端提供服务。为了保证攻击成功,客户端需要将代理服务器的证书安装到设备的全局信任存储区中。这样处理后,客户端就会将证书添加到白名单中,允许与代理服务器之间的 HTTPS 通信。

如果想保护应用免受 MITM 攻击影响,可以使用 SSL 校验证书绑定,此时受信任服务器的证书副本会打包到 iOS 应用中,还有一些附加代码可以确保应用只与使用特定证书的服务器通信。当 SSL 证书绑定处于激活状态时,应用不会将任何请求发送到不受信任的服务器上。

即便如此,也依然可以绕过 SSL 证书绑定。也就是在具体请求通过受保护的 HTTPS 通道发送之前,尝试拦截这个请求,这需要将代码植入到应用中,这里会用到代码注入的相关知识。

如果想更细致的了解如何拦截 HTTPS 请求,本文不可错过,绝对深度好文。

🌟 🐢 干货 | 近万字长文详述携程大规模应用RN的工程化实践

@Damonwong: 如果谈起 React Native 在国内的业务落地,我可能第一个会想起的就是携程和赵辛贵老师。在上次听完赵兴贵老师分享的专题《携程无线持续交付平台工程实践》之后,意犹未尽,一直想更加深入了解一下携程在 RN 方面的技术探索。今天终于等到了携程的 RN 建设及他们设计的 CRN 的分享。这篇文章主要讲了下面几个事情:

  1. RN 在携程中的使用情况
  2. 携程基于 RN 优化的 CRN 框架的设计及使用
  3. CRN 做了哪些性能优化及实际效果比较
  4. 如何发布及运维

比较可惜的是没有看到这套系统相比较于原生开发,对业务增长,开发效率有哪些优化,所以比较期待后续能有这方面的分享。

最后,在文中提到将要开源的 CRN,也已经开源了,感兴趣的同学移步 携程开源RN开发框架CRN 查看。

🐎 JSON as configuration files: please don’t

@olddonkey:这是一篇 2016 年的老文章,但是其中的观点直到今天依然具有参考价值。

很多公司,很多团队使用 JSON 文件作为 App 的配置文件,不论是从远程下发,还是本地加载。

但是,在实际的项目中,用 JSON 来作为配置文件解决方案并不是个完美的方案,它存在的很多问题,这些问题会在实际中逐渐暴露。

文章作者围绕这他心中的几个缺点展开论述:

  1. 注释容易缺失。
  2. 可读性差。
  3. 过分严格的格式。
  4. 缺乏可编程性。

本文虽本意是针对 Web 开发提出观点,但是对 Mobile 开发也一样适用。

🐕 基于多重替换方式的 iOS 代码混淆方案

@含笑饮砒霜:代码混淆,是将计算机程序代码转换成难于阅读和理解但是功能上等价的行为。可用于源代码,也可用于编译而成的中间代码。混淆代码可以有效保护我们的源代码,阻止逆向工程,因为逆向可能会带来一些诸如程序漏洞等不可预知的问题。

目前常用的几种方法,像打乱代码格式,将代码中的元素,如变量、函数等改写成无意义的名字,甚至是重写代码的部分逻辑等,都或多或少的存在问题。比如对于支持反射的语言,代码混淆可能与反射发生冲突,被混淆的代码难于理解,而且也不能真正阻止逆向,只能增大逆向的难度。

对安全性要求很高的场景,这些常规的混淆方式,并不能保证源代码的安全。鉴于此,TalkingData 团队最终决定,自研一套能够完美集成到打包流程中实现自动化的无侵入的混淆工具。由于不同业务线的要求并不一致,所以 TalkingData 自研的这套混淆工具未必适用所有业务线。但文中提到的一些自研过程中可能会遇到的一些问题,值得我们去借鉴和思考。

🐎 Swift 5 Frozen enums

@没故事的卓同学:在 Swift 5.0 中编译器针对使用 C style 枚举增加了一类提醒(即使 switch 已经覆盖了所有的 case 依然会有这样的警告):

Switch covers known cases, but 'XXXXX' may have additional unknown values,Handle unknown values using "@unknown default"

提醒用户虽然现在你已经覆盖了所有的 case,但是未来这个枚举值有可能会增加新的值,我建议你还是处理一下这样的情况。

不过有的枚举值作者可以保证未来不会新增值,针对这个场景苹果增加了 NS_CLOSED_ENUM。如果枚举用 NS_CLOSED_ENUM 声明而不是 NS_ENUM,Swift 使用这个枚举编译器就不会产生建议使用 @unknown default 的警告。

🐎 Asynchronous completion handlers with Result type

@邦Ben:Swift 5 中的标准库中加入了 Result Enum (success / failure),该文作者通过一个 URLSession 的请求例子,演示了使用 Result Enum 改造过程。使用 Enum 会让你的程序看上去更为简洁以及意思明确,详细请看文章内容。

🐕 Improve your iOS team’s productivity by building features as frameworks

@老峰:如果你使用 Swift 开发过大一点的项目,那么你可能会有这样的感受,明明只是修改了一行代码,但却把整个 App 重新编译了一次,花费了很多时间。

本文作者针对这一痛点提出一种优化方案,通过把功能独立的业务代码改为 Framework 动态库,这样就不会每次重新编译整个 Project,从而减少编译时间,文中结合示例代码给出了详细的优化过程。

尽管作者这一方案可以缩短编译时间,但如果 Framework 粒度太小,太多动态库反而会引起其他问题如增加 APP 启动时间、App 安装包变大;粒度太大,每次修改代码又会涉及多个 Framework ,编译时间优化又不会很明显,感兴趣的读者可以借鉴这一思路,做些有益的尝试。

🐕 How to deploy a Swift backend on Amazon AWS

@小非86:目前 Swift 的后端框架主要有 Perfect、Vapor、Kitura 和 Zewo 等。往期周报 推荐过使用 Perfect 开发后端的经验。本期推荐大家这篇使用 Kitura 开发后端的另一种尝试。

🐕 Disjoint-set union in C++ and Swift

本文使用 C++ 与 Swift 实现了简单的并查集。大家可以借此对比同一个数据架构在不同语言的实现。

工具

Accio

Accio 是一个基于 SwiftPM 和 Carthage 的包管理工具,其有以下特点:

  • 依赖预编译,也就是二进制化。
  • 自动集成到项目文件里,不像 Carthage 那样需要手动集成,这也解决了 Carthage 项目中最麻烦的部分。
  • 基于 SwiftPM 的依赖管理系统,只要第三方库使用 Package.swift 声明即可,不需要去跟 xcodeproj 和 Cartfile 打交道。
  • 基于 SwiftPM 的缓存管理,可以减少不必要的重复的下载和编译。

代码

Markdown Playgrounds for Swift

@莲叔:Markdown Playgrounds for Swift 是 objc.io 基于 Swift5 开发的一款 markdown 编辑器,最大的特性就是在你 markdown 中的 Swift 代码可以被执行。对比传统 markdown 编辑器,核心就是实现了 Swift 语法的高亮以及将 Swift 代码提取出来后用 Swift REPL 程序去执行并拿到返回的结果(Swift REPL 程序就是终端中的 Swift 命令)。整个工具是开源的,并且 objc.io 有一整套配套的教学视频(第一章是免费的)一步步的教你如何写一个类似的工具出来,从工具的属性可以看出从中可以学到各种高级的字符串处理(如符号高亮、代码提取等),算是非常不错的 Swift 学习材料。

音视频

🌟 深入了解 Flutter 的高性能图形渲染

@CrazyCoderShi:本视频为 Google Flutter 团队的软件工程师 Yuqian Li 在 2018 谷歌开发者大会做的演讲,内容包含 Flutter 介绍,Flutter 的工作原理(对比原生开发和其他跨平台框架),Skia 介绍,分析常见的性能瓶颈等,通过解决 Flutter 样例 App - Flutter Gallery 的性能问题(Issue #13736),与大家分享如何通过 Flutter 工具定位、调试和解决性能问题。

视频主要讨论点:

  • Flutter 为何能够拥有媲美原生的高性能图形渲染
  • 如何通过 Skia 调试来分析 Flitter 应用
  • 关于 saveLayer 和 clipPath 的注意点
  • 使用 flutter screenshot 截取 skp 来单步调试绘图指令

ggtalk | 向架构进发

@J_Knight_:本期 ggtalk 邀请的嘉宾是 Casa Taloyum,他所写的 iOS 架构系列文章在社区非常受欢迎。本期主要围绕“架构”这一主题,主要讨论了以下几点:

  • 做架构到底是在做什么
  • 架构师和工程价值观
  • 架构师和高级工程师的区别在哪里
  • 如何定义真正的问题
  • 如何看待新技术和旧技术

除此之外,Casa 还分享了对跨平台技术以及区块链的一些看法。

推荐阅读:

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav

如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

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

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

说明

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

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