Skip to content

Releases: SwiftOldDriver/iOS-Weekly

老司机 iOS 周报 #47 | 2018-12-10

22 Dec 09:56
Compare
Choose a tag to compare

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

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

福利

🌟 我们发福利啦~

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

新闻

🌟 Result 类型将加入标准库

Result 类型经历了一整个月的讨论终于决定加入标准库,预计 Swift 5 就能完成实现,这次的提案关注的人非常多,经历了两次修改三次讨论才最终通过。

讨论的焦点主要集中在 Result.Error 的定义上,喵神也写了一篇文章讨论这个问题,一句话总结就是,Swift 出于兼容性和实现的考虑,一直没有实现 Typed Throw,所以 Result.Error 很难实现为一个泛型参数,甚至在草案阶段决定让 Result.Error 不遵循 Swift.Error。

后来 Swift 团队专门给这个提案开了后门,调整了泛型参数的实现,让 Swift.Error 成为了目前唯一一个可以作为泛型参数存在的泛型类型,以便与 Cocoa 的 API 进行更好的交互,才结束了这场讨论。

从这一次也可以看出,Swift 核心团队还是希望让抛出的错误能够有具体的类型(而不是一个泛型的 Swift.Error),所以才会开后门使用这种过渡性的方案,这次的提案让我感觉 Typed Throw 还是有希望的。

另外如果大家有兼容性方面的担忧的话,由于提案的作者是 Alamofire 负责人之一,所以最终通过的版本与 Alamofire 采用的 Result 差异很小,如果你采用的是这个版本的 Result 的话,就不必过多担心。

Flutter 1.0 正式版: Google 的便携 UI 工具包

万众瞩目的 Flutter 1.0 终于正式发布,从我们首次看到 Flutter 的 Beta 测试版,到如今的 1.0 正式版,总共经过了 9 个多月。Flutter 的高性能跨平台渲染与热重载等优秀的特性相信会让移动开发者们眼前一亮,在早先 beta 期就已经有很多公司与团队进行了这方面实践,现在 1.0 来了,作为移动开发者当然要感受一下
Flutter 的魅力。

文章

🌟 🚧 🐢 Dependency Injection on iOS — part 1-4

本长文的主题是关于架构的,切入点是依赖注入在 iOS 上的应用,共分成了四篇文章。作者从描述模块耦合的概念,到介绍使用依赖注入能带给我们的好处(可复用性、可维护性、可扩展性和可测试性),以及推荐了一款依赖注入的框架(Swinject)后开始进入正题 —— 通过编写和优化一个简单应用来实践依赖注入的概念和感受它带来的好处。全文结构非常清晰,举例也很详尽,是一篇学习和感悟架构,特别是依赖注入的好文章。

🌟 🐢 iOS App冷启动治理:来自美团外卖的实践

文章整理了 APP 冷启动的三个阶段,对三个阶段分别提出了存量解决方案、管理增量方案和监控体系。下面几点是文章观点的总结:

  • 冷启动阶段T1: 点击 APP 图标进入至 main 函数,这两者之间的耗时
    • 代码瘦身,废弃无用代码和资源文件
    • 延时 +load 函数,将函数延迟到合适的触发时机,比如说冷启动结束之后
  • 冷启动阶段T2: main 函数后至 didFinishLaunchingWithOptions 函数执行完毕,这两者之间的耗时
    • 整理 APP 启动阶段,顺序化子项目的启动顺序
    • 分阶段启动,利用自验的 Kylin 项目,将子项目的注册信息(启动阶段、启动需要执行的代码等)写入 __DATA 数据段中,运行期读取 __DATA 段代码,并赋予执行。
    • 利用工具(Time Profile/自研的 Caesium)整理执行过程中的一些隐晦耗时,比如归档操作、IO操作、资源任务等
  • 冷启动阶段T3: didFinishLaunchingWithOptions 函数至首页渲染完成,这两者之间的耗时
    • 将 APP 的 RootViewController 设置为闪屏,同时进行首页UI的构建,加快 RootViewController 的加载
    • 整理首页加载的串行操作,优化体验成并行操作
  • 数据监控:除了上述的优化外,建立监控体系,保证持续优化成果
    • 冷启动的开始与结束时间对比,值得注意的是这里的开始时间采用了 APP 进程创建时间
    • 冷启动过程中的关键节点都有手动添加的测速点,并自动上报

🐕 如何提高工作效率 - 自动化篇

在本文中,作者向我们介绍了 macOS 环境下几种自动化的实现方案,并以自己的亲身实践案例为我们讲述了大体的实现流程,以下为文中的案例:

  • 利用 Shell Script 和启动加载任务,在开机过程中自动配置双网卡
  • 利用 Apple Script 访问 Microsoft Outlook 自动生成和填充邮件,完成每日邮件汇报工作
  • 利用 Apple Script 和热键,快速定位当前 Finder 路径到 iTerm 的窗口当中
  • 利用 Apple ScriptAlfred WorkFlows 进行快速保存/搜索记录瞬间想法
  • 利用 Shell ScriptApple Script 定时拉取并编译代码

🐢 iOS 内存管理的那些事儿

iOS 中的内存管理一直是令开发同学们比较头痛的事情,自 ARC 问世以后,虽然不再需要我们手动管理内存,但是掌握内存管理的相关知识依然是十分有必要的。

作者通过研读源代码的方式向我们详细讲解了内存管理的实现原理,并列举了一些日常开发中容易导致内存泄漏的常见场景,掌握这些有助于我们在复杂业务场景中更好的避免内存相关的问题。并且作者后续会介绍一些开源检测内存泄漏的工具及实现,大家可以持续关注。

🐕 Rethinking Design Patterns in Swift: State Pattern

这篇文章展示了如何在 Swift 中实现状态模式(State pattern),借助 Swift 强大的能力,让模式实现变得简单而又灵活。此文通过一个实例来探索状态模式的各个方面,并且评估其处理需求变更的能力。然后还会讨论实现该模式的关键考量、收益以及实际应用。

🐎 技术人的成长

作者从自身的经验和感悟出发,从三个维度描述了技术人的成长道路

  • 抵御所谓“全栈”的诱惑,聚焦领域。
  • 扩大视野,提高技术敏锐程度。
  • 多看多尝试,不要空想

总体来说,就是到了一定的技能熟练度以后,从广度上拓展自己的知识面,从深度上钻研某一个垂直领域,将能够极大的帮助大家从普通工程师进阶到高级工程师。

🐕 Category:从底层原理研究到面试题分析

随着移动端的发展,从 weak 面试题的一步步升级就能明白,我们应该多进行深入了解底层实现细节。

作者从源码进行一步步分跟踪和分析,整理 Category 整个的执行顺序,非常适合想了解其工作原理的同学们看。并且还提供了一个简单动画示意图。通过阅读,可以清晰地回答面试中常见的几个 Category 相关的问题。

另外 loadinitialize 也给出了源码分析和对比表格。在准备面试的同学,尤其适合阅读一番。

🐢 iOS: ARM64不定函数传参问题调试剖析

从实际开发中遇到的一个平台相关的 crash 问题出发,通过代码对比,研究了在 x86-64 架构和 ARM64 架构对于不定函数参数传递的方式——特别是 iOS 系统的不同之处,同时也解答了为什么在调用带不定参数类型的 C 函数指针时,应该显示将其强转为对应参数类型的函数指针问题。

🐢 【译】Swift 中的面向协议编程:是否优于面向对象编程?

本篇是 SwiftGG 最新出炉的译文,原文在上月 周报第42期 推荐过,可以再回顾一下。

🐢 Swift Protocols: Tips and Tricks

ProtocolSwift 的基础,我们可以定义方法,甚至提供默认实现。本文介绍了 Protocol 的一些小 tips,比如 协议组合Protocol extensions、利用 Protocol 实现模板方法设计模式等。

🐎 8 Useful Swift Extensions

文中列举了 8 个Swift中比较实用的 Extensions,比如字符串中字符个数、计算两个日期之间的天数,给字符串添加前缀等。当然,我觉得这 8 个远远不能满足于日常的开发,所以我更推荐大家看一下 SwifterSwift 这个库,里面都是很实用的 Extension。如果你有什么不错的 Extension 推荐,也可以给这库贡献自己的代码哦。

🐕 simctl

simctl 是苹果提供给开发者驱动 Xcode Simulator 的命令行工具。我们能够通过它做到:启动模拟器,在桌面和模拟器之间复制和粘贴,进行视频录制等。

🐢 Swift Program Distribution with Homebrew

本文介绍了当你创建了 mac 上的命令行工具的时候,如何进行分发,文中介绍的工具是 Homebrew 。

  1. 创建一个 Makefile 文件
  2. 编写一个 Homebrew formula (相当于编译打包)
  3. 自测需要,可以先试试本地安装,确保安装过程顺利
  4. Homebrew 安装 formula 是基于 Tap 的,所以需要发布一个 Tap
  5. 用户可以根据远端的 Tap 来安装 formula 了

🐢 与 JOSE 战斗的日子 - 写给 iOS 开发者的密码学入门手册

JOSE (Javascript Object Signing and Encryption) 定义了一系列标准,用来规范在网络传输中使用 JSON 的方式,本文介绍了 如何使用 Security.framework 处理 JOSE 中的验证。对比已有的 JOSE 实现框架,譬如 JOSESwiftJSONWebToken.swiftSwift-JWTvaper/jwt 等等,作者的方案优势在于同时支持 RSA 和 ECDSA ,并且不需要引入复杂的依赖关系

设计

工具

Publish Your Flutter App on macOS

最近 Flutter 扩张势头似乎没有停下来的意思,反而看起来越来越凶猛了。

Flutter 除了可以写 iOS,Android App 之外,其实,也是“支持” macOS, Windows 和 Linux 的。只是这并不是那种官方支持,而只是把移动版 App 直接跑在 Desktop 上, 类似明年 macOS 要支持 iOS App 运行一样。

Google 的 Github Repo 下有一个叫 flutter-desktop-embedding 的项目,就是做这样的桥接工作的,只是这库确实不是很好用,使用比较麻烦。

于是有第三方开发者做了基于 flutter-desktop-embedding 的工具,可以方便的将你已有的 Flutter 工程打成 macOS 包。同时他们还做了一个小型商店,开发者可以一键上传,其他人也可以很方便的下载安装。

有兴趣的童鞋可以尝试一下把自己的 Flutter App 跑在 macOS 上,来看看那是什么样的感觉。

音视频

ggtalk | 聊聊 Swift 这四年(下)

上周推荐了上部,收到了不错的反响。在这期(下)中,几个程序员聊了最近几年 Swift 领域发生的事情,比如 jspatch 导致的大规模下架事件,第二第三届 Swift 开发者大会的一些故事。最终探讨了 Swift 的未来,内容同样精彩,不容错过。

内推

关注我们

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

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

本期编辑

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

说明

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

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

老司机 iOS 周报 #46 | 2018-12-03

22 Dec 09:55
Compare
Choose a tag to compare

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

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

新闻

Apple 举办编程一小时活动

在 12 月 1 日至 14 日期间,Apple 将在全国的 Apple Store 零售店举办「编程一小时」活动,现在已开放报名。你将有机会从编程基础知识入手,用 Swift 语言写代码,为机器人编程。也许这一小时的课程,将开启你对编程一生的热爱。

App Store Connect Holiday Schedule

因圣诞假期,App Store 将在 12 月 23 日至 27 日停止应用审核。

文章

🐕 Animations are assets: using Core Animation archives on iOS

作者在逆向过程中发现了 Animations 也可以作为资源归档,并且在2016年的时候已经上线了一款使用该技术的 APP。
简单而言,就是将 Core Animation 添加完动画效果的 layer 利用 NSKeyedArchiver/NSKeyedUnarchiver 进行归档,然后在 APP 需要动画的时候进行加载,文中附有 Demo

  • 使用 Kite软件 进行方便动画的制作,并且导出 CAAR 文件(也可以自行代码 archiver 后导出)。
  • 因为导出的文件是一个 CoreAnimation layer tree,你可以实现颜色改变,形变等 CoreAnimation layer 的动画效果。
  • CAAR 文件独立,意味着你可以放在 Asset CatalogBundle,甚至服务器下发。
  • 不需要依赖另外的第三方动画框架。

延展阅读:

🐢 iOS 12 Password Tools: Improving User Security and Experience

在本教程中,您将使用这些 iOS 12 安全工具,使您的用户能够:

  • 在您的网站和您的应用之间共享和同步密码。
  • 保存并更新iOS密码。
  • 自动生成安全密码。
  • 访问通过短信发送的验证安全代码,无需离开应用。

🐕 Extending optionals in Swift

Swift 中的可选值实际是定义了一个 Optional<Wrapped> 枚举,所以我们可以通过扩展枚举,让我们以一种更好的方式处理可选值。

我们可以给枚举添加一个扩展方法,当值为 nil 的时候抛出 error,直接将方法接入到调用末尾,则能轻松将缺失值转换为一个错误。

当然你也可以发挥更多想象力,添加扩展将值的逻辑判断代码、类型匹配代码等等操作封装起来,最终得到一个更好,更容易阅读的调用链。

🐎 When to use UserDefaults, Keychain, or Core Data

本文总结了我们开发过程中常用的几种数据存储方式的使用场景,以及它们的使用方法和注意点。都是比较初级的知识,但作者写得很详细,总结的也很到位。

  • UserDefaults

    用来存储不敏感的少量数据,比如需要持久化的用户设置、游戏分数、播放的歌曲名等。

  • Keychain

    用来存储相对敏感的少量数据,比如用户密码、内购状态、令牌密钥等。

  • Core Data

    用来存储数据量大的列表、关系型数据,以及需要查询和筛选的数据,比如 Todo 列表、文章评论等。

🐢 A Comparison of Swift and Kotlin Languages

尽管 Swift 和 Kotlin 在语法上有太多相似的地方,但也仍然有很多核心特性上的差异。本文重点介绍了 Swift 和 Kotlin 之间的异同。

从代码风格和语法层面详细对比了属性,数据结构,方法,闭包,可选类型,流程控制,类,扩展,协议,功能性语法等重要语言特性的相似点和不同点。同时推荐了许多其他对比 Swift 和 Kotlin 的文章。

🐢 手把手教你给企业微信 Mac 客户端去除水印

目前,许多公司使用了企业微信作为内部聊天工具,既然是企业级的,免不了界面会有水印,这可以使公司的内部信息被员工截图散播出去时候可以有效的溯源等等。

水印有两种情况,一种是在客户端合成的,另一种是 server 下发的图片就带有水印。前者通过反编译客户端进行去除,而后者相对较难,只能通过图像技术去做。企业微信 Mac 的客户端水印就属于前者。

所以,文中笔者就尝试反编译的手段成功去除了水印。不过,本文更适合作为反编译的实战教学文章来观看,一方面是截图公司的信息散布出去本事也并不好,另一方面是不能保证微信企业客户端没有暗水印。

🐕 Evaluating SwiftSyntax for use in SwiftLint

之前 SwiftLint 是基于 SourceKit 封装了一套 API 去处理语法规则的。现在 SwiftSyntax 出来之后,本来打算使用它去简化之前的语法规则,结果发现运行效率竟然变低了。文中笔者给出了具体原因:SwiftSyntax 对于每个文件解析都新开一个 Swift 编译器实例拖慢了整体速度。

🐕 解读 App Store 审核黑箱政策 —— 远没有你想象的那么邪恶

作者在 App Store 上架了 15 款应用,与 App Store 审核的往来超过几百次,在这篇文章里,作者分享了他对 App Store 的理解和看法,具体包括 App Store 采用黑箱审核的原因、为何难以得到清楚的答复、双标情况以及对于 App Store 审核的几点建议。

工具

ReadyForBAT - iOS 面试准备之思维导图

作者在学习完慕课网 iOS 面试实战项目后利用思维导图做了总结。这套导图覆盖面较广,可以给正在跳槽或者准备年后跳槽的各位同行用作参考,好好梳理一遍自己的知识体系。

Komondor - Git Hooks for Swift projects

Komondor 是一款帮助简化 Git Hook 设置的工具,它依赖于 Swift Package Manager 的运行,只要在 Package.swift 里加上依赖,然后像这样去指定 hook 就可以完成设置:

import PackageConfig

let config = PackageConfig([
    "komondor": [
        "pre-push": "swift test",
        "pre-commit": [
            "swift test",
            "swift run swiftFormat .",
            "swift run swiftlint autocorrect --path Sources/",
            "git add .",
        ],
    ],
])

代码

appstoreconnect-swift-sdk

上个月苹果终于将 WWDC 2018 里提到的 App Store Connect API 开放给广大开发者。这是一个基于 Swift 编写的 SDK,可以让开发者方便地使用苹果开放的这些接口。

音视频

ggtalk | 聊聊 Swift 这四年(上)

Swift 自第一次推出到现在,已经有了四年的时间。这四年语言本身经过了很多发展,很多改变,而国内的 iOS 开发行业,Swift 开发者的生活和工作,也发生了很多变化。从 14,15年的黄金时代到16年的 ‘iOS 没人要了’,再到18年的 ‘iOS 又有人要了’,今年,Swift 5.0 终于提出要把 ABI 稳定放在首位,这应该算一个 Swift 重要的一个里程碑。在这样一个时间点,ggtalk 请了几个使用 Swift 的程序员,一起聊了聊 Swift 的这四年(ggtalk 是国内 Swift 社区 SwiftGG 推出的程序员闲聊节目)。有空的时候可以听听,相信同样写 Swift 的你,会有共鸣。

内推

关注我们

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

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

本期编辑

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

说明

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

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

老司机 iOS 周报 #45 | 2018-11-26

22 Dec 09:55
Compare
Choose a tag to compare

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

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

小专栏

Swift 开源项目精选导图

这份文档主要基于微博 @SwiftLanguage 跟踪过活跃于 Swift 语言领域的那些 GitHub 开源项目,顺便也是对于过去几年关注的内容进行一次系统化梳理。尝试整理出一份相对结构化且精练的 Swift 开源项目参考知识库,它将主要以思维导图形式呈现。

文章

🌟 🐢 Hades:移动端静态分析框架

本文介绍了大众点评基于 Objective-C 的代码静态分析工具 Hades 的研发经验,重点解决了以下痛点:

  • 开发成本高,收益有限,研发参与积极性不够。
  • 针对局部代码分析,跨编译单元以及全局性分析较难。
  • 增量分析困难,CI 静态检查效率低下。
  • 工具性较强,大部分只作代码规范检查,应用范畴局限。
  • 接入和维护成本高,难以平台化。

Hades 相对于市面上已有的工具,在研发端解决了代码检查规则维护困难的问题,在 CI 端解决了性能问题,因为针对每次检查都可以持久化 Model 对象,在扩展性上还有很大的想像空间,大众点评团队为我们提供了很好的代码静态分析工具研发思路。目前 Hades 还是闭源阶段,将来有可能转为开源。

P.S. 目前iOS平台上的代码静态分析工具一览表
SwiftLint
Appscreener
Checkmarx
Fortify
Infer
oclint
Veracode

🐕 Swift Development with Visual Studio Code

Swift 在早些时候宣布将支持 LSP(Language Server Protocol),整个社区都沸腾了。人们涌上街头,奔走相告,一遍遍的确认着:我们可以摆脱 Xcode 了吗?VSCode 作为 LSP 支持的先驱者与佼佼者,目前基本已经是行业排行第一的通用型代码编辑器。

本篇文章由 mattt 大神出品,详细介绍了怎么在 VSCode 中配置 Swift 的开发环境。目前虽然 Swift 的 LSP 支持还处于 early stage,但已经可以支持最常用的自动完成、快速帮助以及跳转定义等功能。并且基于 VScode 强大的插件生态,还有 SwiftLint 这样的插件可以来提升代码的风格优化。不得不说,人们对于 Swift,尤其是非 Apple 生态下的 Swift 开发体验跨越式升级,已经发生。

🚧 🐢 Xcode and LLDB Advanced Debugging Tutorial

作者准备了一个简易项目,演示了如何利用 Xcode 和 LLDB 进行高级调试。

  • 第一部分 在断点处添加调试命令,注入一行新代码进行调试。

  • 第二部分 通过给属性添加观察点,当其变化的时候,会中断程序,观察到属性变化的前后值,及可以进行堆栈追踪。

  • 第三部分 在断点中,通过调试命令新增新的断点,使断点在某些场景下才开始执行,更高效的追踪问题。

🚧 🐢 A taste of MVVM and Reactive paradigm

本文通过一些简单的类讲述了什么是 MVC 和 MVVM,以及如何进一步研究 Rx。您可以自由地创建自己的架构,但无论您做什么,一致性都是关键,不要让别人看的时候感到困惑或惊讶。

所有设计模式的简单原则可总结为:

  • 确定应用程序的各个方面的变化,并将它们与保持不变的方面分开
  • 编程到接口,而不是实现
  • 组合好过继承

希望本文对正在为架构选型而头疼的朋友有所帮助。

🐕 实用的可选项(Optional)扩展

OptionSwift 最基础的内容,它迫使开发者们处理好一些临界情况,使得程序更加健壮。标准库中 Option 的 API 非常少,编码过程中通常需要配合 if let guard let 一起使用,这容易造成多分支。作者参考了 Rust Scala 等语言的实现,给出了一些 Option 扩展,或许你可以用于自己的项目中。

🚧 🐕 Stubbing in pair with Swift compiler

Unit tests 中 stubbing 是一个很常见的做法,现在也有很多成熟的框架。而本文却从另外一个角度来做: 利用 Swift 的语言特性来做另类的轻量级的 Stubbing。
这种做法的应用面虽然比较有限,但是不妨可以了解一下作为参考。

🐕 关于 performSelector:afterDelay: 的一个坑及思考

本文通过对于 performSelector:afterDelay: 函数进行了研究,总结了以下三点内容:

  1. 在一个没有开启 RunLoop 的子线程中调用 performSelector:afterDelay: 函数,最终是不会被执行的
  2. 看似相近的 API,可能不是同一个模块提供的,其实现方式也不尽相同
    • performSelector: 来自于 NSObject.h,其是有 id 类型的返回值,并不依赖于子线程的 RunLoop 开启状态
    • performSelector:withObject:afterDelay: 来自于 NSRunloop.h,其并没有返回值,依赖子线程的 RunLoop 开启状态
    • performSelectorOnMainThread:withObject:waitUntilDone: 来自于 NSThread.h,其并没有返回值,依赖主线程的 RunLoop 开启状态
  3. performSelector: 中函数定义在其他地方就会引起编译警告,如果函数没有返回值可以使用 performSelectorOnMainThread: 或者 performSelector:withObject:afterDelay: 来避免编译警告

🐕 函数式编程 - 有趣的 Monoid(单位半群)

本文介绍了在函数式编程中比较核心的一个概念 Monoid(单位半群)。从半群到单位半群,从数学定义到 Swift 的展开实现,以引导教学的方式带领读者一步步深入了解 Monoid,极易消化理解。后半部分介绍了几个有趣实用的 Monoid 类的数据结构,且都有递进式的概念讲解及 Swift 实现。

另外,本文是近两年来作者关于函数式编程系列文章中的最新一篇。本系列文章同样都是采取引导递进式的行文风格,作者从 Haskell 这种标准化的、通用纯函数式的编程语言中汲取灵感,将诸多函数式编程的核心概念改造为 Swift 实现,让我们从新的角度去认识 Swift 以及 与 Swift 相关的函数式编程思想,Swift 或 函数式编程爱好者不容错过。

🐎 Unit testing retain cycles

循环引用问题会造成内存泄露,轻则影响应用性能,重则导致应用闪退,非常影响用户体验。同时它也是不太容易被发现的。所以在开发测试过程中,增加对循环引用的检测很有必要。

本文就介绍了如何在单元测试中检查循环引用。思路很简洁,通过建立弱引用去检测。这样我们就能保证代码库本身没有问题,正如文末所说的 “get a level of comfort”。除了检测方式,作者所表现出的这种为代码负责任的态度也是值得我们学习的。

🐕 Self-sizing Table View Cells

这是一个关于 tableview cell 的布局教程,该本教程中,您将学习如何启用自动调整大小的 cell ,以及如何使它们按需调整大小并支持动态类型。该教程通过 storyboard 加代码的教程形式,一步步完成一个大家常见的 tableview 需求,并附上了项目 demo 。

🐕 Extending optionals in Swift

Swift 里的 Optional 虽然帮助我们保证了内存安全访问,但在很多情况下都需要我们解包后再进行操作,让代码显得比较啰嗦而且不连贯。

Sundell 这周就给我们带来了 Optional 的实用拓展,总结了一些 Optional 常见场景,并且构建对应的语法糖去优化 Optional 的使用。

🐕 Swift Async Operations at Your Command

当一个操作相对比较复杂时,使用 Operation 封装上下文会是一种比较合理的做法,这篇文章里作者分别介绍了 Fabric 封装的 FABAsyncOperation 和 FABCompoundOperation 以及各自的使用场景,并且讲述了他在项目中使用 Swift 重写的过程。

🐕 关于 Swift defer 的正确使用

在 Swfit 中,defer 关键字即为延迟的意思,用 defer 声明的 block 并不会立刻执行,而是在当前代码执行退出后被调用,这类似于 JAVA 里的 try/finally。最近,喵神在重构 Kingfisher 的时候,因为 defer 的使用不但而造成了 bug。为此,喵神完整梳理了下 defer 的特性以及使用方法。

代码

30-seconds-of-swift-code

一个立志于让你 30 秒看懂一段 Swift 代码的项目,较为新手向,方便新人快速了解 Swift 的内建函数。当然老鸟也不妨一读,总有你漏掉的知识点。

LINE SDK for iOS Swift

用 Swift 开发的 iOS LINE SDK 可以让我们用现代化的方式来实现 LINE API,包括用户认证及通过 OpenID 获取用户信息等功能,为 iOS app 开发有吸引力的、个性化的用户体验。

内推

关注我们

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

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

本期编辑

@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal@aaaron7@方秋枋@kyo@tom510230@anotheren@水水@looping@老老老老老老老驴@邦Ben@红纸@含笑饮砒霜@JimQ

说明

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

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

老司机 iOS 周报 #44 | 2018-11-19

22 Dec 09:54
Compare
Choose a tag to compare

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

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

文章

🐢 Implementing features with ReactiveFeedback

本文作者通过一个实例演示来介绍他们团队写的单向数据流应用框架 ReactiveFeedback。由于作者所在团队用的是 ReactiveCocoa,所以他们就基于 ReactiveSwift 自己实现了一套类似 RxFeedback 的框架。

虽然是教程类的文章,而且还是写自家框架的,但是阅读本文还是会有三层收获:

  • To 普通开发,了解应用开发还能这么玩。如果大家对 Redux, ReSwift, RxFeedback 这些比较熟悉的话,文中介绍的框架结构和用法还是很好理解的。即使不熟悉,认真看也是能懂的,因为文章写得真是超级详细;
  • To 框架维护,理解他们做类似架构演进的思路。单向数据流应用框架的可维护、可预测以及可测试性等这些特点可以较好地解决一个复杂应用工程会面临的臃肿混乱难以管理的问题。文中也提到 ReactiveFeedback 没有设计全局的应用状态,但是每个功能模块与外部交互时都有明确的主入口,内部只有自己独立的状态,使用起来非常简单灵活和方便;
  • To 技术管理,通过技术手段来提高工程质量和效率是非常有意义的,特别是大家一起维护一套开发框架。能对应用架构和编程模式不断地进行探索,也是工程师文化的很好体现。经常做这类技术输出的团队肯定也是大部分人所向往的有技术氛围的团队。

🐢 Docker ❤️ Swift & Vapor

Docker 作为近几年来服务端最重要的技术创新之一,解决了无数配置与运维的噩梦。而另一边,Server-side Swift 的蓬勃发展,似乎和 Docker 拥抱已经是一个必然。本文既是一篇非常棒的 docker 入门文章,用很简洁的篇幅讲了 docker 是什么,能做什么,并且给出了相应的学习路径,同时,也是一篇介绍如何使用 docker 技术来提升 Server-side Swift 的开发与配置效率的文章。作者生动的介绍了如何制作 Swift 的 docker image,如何实时修改 docker image 中的代码,最后还提出基于 docker compose 来实现基于 Vapor 的微服务架构,非常酷! 推荐大家阅读。

🚧 🐕 Assertions in Production

作者围绕断言的使用展开了以下探讨:

  • 如何上报断言(Assertion)?

    首先作者分享了将断言上报的代码片段。作者认为相较于 Property Testing(性质测试),断言等于真正的用户产生的 Property Testing,更加随机、多样和不可预测,而且不需要写任何测试用例。

  • 何时加断言?

    作者一般的规则是,在没有 else 的情况下,应该加断言。以下情况下也会加断言:确保方法传参正确的时候;从字典里用已知的 key 取值的时候(如 NSNotification``userInfo);确保必须在主线程进行的操作当前是否在主线程的时候;打开关键的数据库或者文件失败的时候。

  • 对于线上的产品,是否应该让断言处 Crash?

    作者认为没有必要。断言可以当做错误上报,但不应该造成闪退。

🐕 Avoiding race conditions in Swift

Race condition, 即竞争条件。我们都知道,当多个线程同时访问相同的资源,就可能会出现意想不到的问题。对此,线程安全一直是开发中需要额外关注的一个问题。本文讲了在 Swift 中,race condition 可能存在的场景,以及在平时的编码中,如何尽可能避免这种问题。

🐕 What's .self, .Type and .Protocol? Understanding Swift Metatypes

Swift Metatypes,可能每天都在用,却很难解释清楚到底是什么东西,Apple 文档对此描述也比较晦涩,只说 type of a type

文章从最简单的 String 开始,讲 String.Typestring.self 之间的关系,串起 .Type .self type(of:) Protocol,最后还介绍了一些 Metatypes 使用场景。

🐕 用 Swift 解读 React/React Native: Part 1 - React Element & React Component

本文系列文章第一部分,作者希望将 React/ReactNative 中的主要编程思想,应用在 Swift 中,以此提高提升开发效率和代码质量。作者认为 React 的核心概念为,将数据转化成视图描述数据,也就是 DataReact Element 的过程。在这个过程中,无形中引入了单向数据流,提升了代码的规范性和开发效率。文中介绍了如何用 Swift 实现 Componet, Element, Node 这几个关键部分。

🐢 Mirror / Custom​Reflectable / Custom​Leaf​Reflectable

相对于 Objective-C 来说,Swift 没有 Runtime 不能实现类似 swizzing 功能。但得益于 Mirror反射功能,我们可以得到对象信息的只读访问,Playground 就是 Mirror 的一个主要场景。文章介绍了 Mirror 及相关的 Custom​Reflectable Custom​Leaf​Reflectable 两个 protocol 使用细节。

🐕 分析实现-倒计时设计

倒计时器是一个日常开发中很常见的需求,通过 NSTimerGCD 或者 CADisplayLink 都可以轻易实现。本文作者在看到一个基于 NSOperation 的全局计时器方案后,引发了如何完成一个更高效、接口设计更合理的倒计时器轮子的思考。从选择存储结构出发,到最后的逻辑封装,作者一步步完成了自己的倒计时器。

虽然是一个很小的需求,但却很考验开发人员的编码能力,希望各位读者都能够从作者这种软件设计思维中有所得。

🐕 在 Flutter 中嵌入 Native 组件的正确姿势是...

闲鱼团队的新文章,他们算是最早用上 Flutter 重写自己 App 的大厂团队,趟过的坑一定不会少,也值得其他人学习经验。

Flutter 最近也在各个国内大厂掀起了应用浪潮,如果有打算应用 Flutter 或者是已经在尝试应用 Flutter 的同学们,不妨考虑先读一读闲鱼团队的系列文章,可以让你少踩很多坑。本文就介绍了闲鱼团队在项目中嵌入 Native 代码的做法和背后的源码中的原理,虽然 iOS 中还暂时没有出现和 AndroidView 对应的控件,但是相信之后一定会有对应的控件跟上。目前在 Android 端有需求的同学们不妨先学习参考。

🐕 Custom​Playground​Display​Convertible

本文介绍了我们熟悉的 Playground,它通过 PlaygroundLogger 框架来实现实时反馈。文章前半部分花了大篇幅介绍这个框架支持展现的类型和 Custom​Playground​Display​Convertible 协议的用法。文章后半部分则从 Playground 自身的特殊性展开,总结了 Custom​Playground​Display​ConvertibleCustomStringConvertibleCustomDebugStringConvertible 以及 Debug Quick Look 之间的关系。读完全文,不仅能让我们知道了 Custom​Playground​Display​Convertible 怎么用的,而且也清楚了它的具体使用场景。

🐕 Debugging a subtle Swift bug that will make you facepalm

Jesse Squires 在修复一个 UI 测试的崩溃时,发现是因为 json 序列化时使用了 [String: Any] 作为容器,赋值时少写了一对括号导致的问题:

func toDictionary() -> [String: Any] {
    var dict: [String: Any] = [:]

    // code setting other keys and values...

    dict[JSONKeys.dateClosed] = self.dateClosed?.toMongoDate

    return dict
}

extension Date {
    func toMongoDate() -> [String: Any] {
        // return date in expected mongo date format
    }
}

这段代码是 Codable 之前就存在的,从这方面也印证了 Codable 的好处。

🐕 支付宝客户端架构解析:iOS 客户端启动性能优化初探

支付宝 mPaaS 团队又向大家带来了一篇启动性能优化的实践,本片文章主要从另一个角度探索启动性能优化,利用苹果的 Background Fetch 让 App 在后台的时候就能处理一些预加载任务,来解决真正启动性能中比较耗时的图片加载问题。我们也可以借此了解一下 iOS 的这种 Background Fetch 伪后台的作用机制

工具

Commander

Commander 简单而言,就是你通过 Decodable & Decoder 协议的规则书写 struct 来描述 cli 参数的输入,该库会进行解析检查,并且提供对应的描述帮助信息,也提供自动补全的机制。

Code Friend

自 Xcode 8 开始,苹果提供了 XcodeKit 用于开发 Xcode Extensions,但是开发者们似乎并不买账。Code Friend 通过 JavaScriptCore 封装了 XcodeKit 的原生方法,并提供了使用 JavaScript 接口来快捷地开发 Xcode 插件。你可以直接在 Mac App Store 中找到它,但是还是建议你先读一读这篇文章

音视频

"Promises everywhere", with special guest Max Howell

15 年的时候,有位牛人,曾经在 Twitter 上吐槽自己去 Google 面试被拒经历。Google 说 90% 的工程师使用他写的软件,但是因为他不能在白板上翻转二叉树,so fuck off...这个事情相信很多人都听过,而这个人,正是大名鼎鼎的包管理软件 HomeBrew 的作者 Max Howell 。就在近期,Sundell 邀请了他作为嘉宾,在这期播客里讨论了包管理器的设计、异步编程、面试流程以及 Swift Package Manager 是如何诞生的。

内推

关注我们

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

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

本期编辑

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

说明

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

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

老司机 iOS 周报 #43 | 2018-11-12

22 Dec 09:54
Compare
Choose a tag to compare

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

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

小专栏

From Swift To C++

来自微信团队的周报编辑芒果最新出炉的一篇文章。这篇文章按照编程范式(programming paradigm)来组织脉络,从一个客户端工程师的角度来品味和对比这 Swift 和 C++ 两门语言。如果你也在或者即将同时把 Swift 和 C++ 当做主流编程语言,那么这篇文章你绝对值得一看。

新闻

适用于触控问题的 iPhone X 显示屏模块更换计划

号外!号外!继“降频门”事件引起的 218 元换电池服务后,苹果又出免费更换 iPhone X 显示屏服务了。只要你的 iPhone X 经过测试满足以下两个问题,则苹果会替你免费更换显示屏。

  • 显示屏或显示屏的一部分不响应或间歇响应触控操作。
  • 即使没有进行触控操作,显示屏也会作出反应。

另外友情提醒,218 元换电池只剩最后一个半月了,还没换的小伙伴抓紧上,绝对能让你的老设备焕然一新!

文章

🌟 🐕 Language Server Protocol

前段时间 Apple Swift 团队在 Swift Forum 上宣布他们会对 Swift 和 C 系列语言(C/C++/ObjC)增加 LSP (Language Server Protocol)支持。这对于饱受 Xcode 折磨的开发者来说是个极大的利好,意味着在这之后可以有更多的第三方 IDE 支持。

Matt 的这篇文章,解释了什么是 LSP,LSP 是怎么工作的,以及潜在的可能带来的好处。

虽然 Swift 支持 LSP 的具体时间表到现在还没有放出来,但是受苦于 Xcode 的大伙们也算是有点盼头了。

🌟 🐎 Tricks & treats to make UI testing less terrifying

part1part2part3

自动化测试,尤其是 UI 的自动化测试,对于国内大部分的开发者应该都是“只闻其声未见其人”的感觉,知道有这么个事儿,但基本都没怎么实践过。这一系列文章系统性的讨论了 UI 自动化测试的最佳实践。从如何标记 UI 元素到如何访问,最后在第三部分还探讨了一种编写 UI 测试的“设计模式”,名叫 PageObject 的编程模型,来提升 UI 测试代码的可维护性。

🐎 Stephen King's Advice To Software Developers

斯蒂芬·金,《肖申克的救赎》的作者。他曾在《On Writing》一书说,讲述了他的写作经验。学习技巧基本相通,因此本文作者将斯蒂芬·金的经验融合到软件开发实例中。

  1. 多输入,多输出
    • 多输入:多看源码,CodeReview,博客,书籍,如无从做起,可多关注老司机周报
    • 多输出:对于想掌握的技巧,多进行刻意练习。
  2. 避免分心
    • 规划时间,固定的时间做固定的事情,效率更高。
    • 寻找专门的空间和可以集中精神的 2 个小时
  3. 闭门,开门
    • 专注开发完成后(闭门),接受 CodeReview 或者开源,吸纳更多的意见进行优化(开门)。
  4. 杀掉你的所爱
    • 每次优化,果断删掉你自豪但无用的代码,炫技不如贴合业务。
  5. 花时间
    • 没有捷径,务必坚持(但是要注意学习技巧)。

🚧 🐕 How to remove duplication from Swift tests with helper functions

对于 XCTest 的单元测试来说,提取重复代码对于开发者而言并不友好,可能会出现如下几种问题:

  1. 执行过程中,Xcode 的断言函数停止在了提取函数内部。
  2. 多个单元测试同时报错时,需要展开错误信息才能了解到具体信息。

为了解决如上几个问题,作者巧妙的运用了 Swift 中 XCAssert 函数的另外两个入参 fileline,来传递辅助函数调用时的文件和行号,这样 Xcode 就能够帮助你将错误信息正确提示到辅助函数调用的地方。

🐕 Keeping your code clean

写得一手好字,对于普通人来讲是一个很好的加分项,而是否写得一手简洁漂亮的代码则对于我们开发者来说更为重要。招聘单位往往对应聘人的代码风格都会有一定要求。本文分享了如何写得一手好代码的几个小技巧,很值得大家关注,并在平常开发中重视起来。

  • LOC(Lines Of Code):代码应该足够精简,函数是最小的执行单元,避免冗长的代码集中在一个函数实现上。
  • 正确的缩进:不管你是 “Tab” 党还是 “空格” 党,合适的缩进能让你的代码排版更加整齐,让人读起来更加舒适。
  • 标准的命名:虽然命名一直是程序员的难题,但我们仍然需要能够很好的名字来提高我们代码可读性。
  • 变量和函数的声明:在合适的地方做声明,按照功能进行分组。
  • 代码风格:每个团队都应该有一套代码规范,来统一团队成员的代码风格。

另外,该作者还在最后为我们推荐了几个 Lint 的工具,可以帮助我们自动化代码规范审核,如 SonarQubeTailor 以及 SwiftLint

🐕 String’s ABI and UTF-8

近日,Michael Ilseman 在 Swift 社区论坛发文 String’s ABI and UTF-8 表示 String ABI 相关改动已提交到 master 分支。具体来说,这是底层实现的一次显著改动(这些改动在 API 层面无任何影响),其中最主要的一点就是原生 Swift 字符串会统一使用 UTF-8 进行存储(在内存里),而之前是根据内容选择 ASCII 或者 UTF-16 进行存储。

文章还特地提到:传统意义上中文字符串是 UTF-8 性能最差的场景(需对多个 UTF-8 编码进行重排合并得到 Unicode 码位),得益于现代 CPU 的改进,这些已不再是问题。

🐢 Result<T> 还是 Result<T, E: Error>

API 的错误处理一直是 Cocoa 做的不好的一部分。到了 Swift 时代,我们有了更好用的 enum,可以帮助我们统一 Data 与 Error 的封装。如果你常用 Alamofire,一定对它的 Result<T> 非常熟悉,对于错误,它仅要求满足 Swift.Error。但是很多时候处理这个空协议依旧不是最方便。于是又有人提出了 Result<T, E: Error> 来指定错误类型,大部分情况下你会在这里定义一个 enum 来穷举所有可能的错误(注意这里的错误是 Error 而非 Swift.Error)。喵神在文中详细对比了这两种方式的利弊。

当然,官方不可能对这一不足置之不理,相关的提案 SE-0235: Add Result to the Standard Library 本周已经在讨论中,相信结果很快就会出来,让我们拭目以待。

🐢 KVC/KVO 总结

对 KVC / KVO 做了到位的总结和代码示例。相信对想要详细了解或使用 KVC / KVO 的同学会有所帮助。

KVC

  • Key-Value Coding基本原则
  • 访问对象属性
  • 访问集合属性
  • 访问者搜索模式

KVO

  • 注册KVO
  • 兼容KVO
  • 注册从属keys
  • Key-Value Observing 的实现细节

🐢 Category 特性在 iOS 组件化中的应用与管控

关于组件化,在业界的文章和讨论已经很多了。但组件化其实是一个比较大的工程化问题,对于想要使用和已经采用组件化进行开发的团队来说,对于实施组件化的很多细节,其实很多文章并没有说的很清晰。本文主要围绕组件分层通信解耦的机制,先后列举了常见的几种方案对比,以及美团所采用的方案:Category+NSInvocation 和 CategoryCoverOrigin。对于这两个相对陌生一些的方案,文中也有一定的介绍,并且写了实际运用的代码,对此有兴趣的同学推荐可以认真看一下本文。最后,Category 的使用笔者一向认为需要比较慎重,否则往往会带来更坏的效果,至于采用哪种方案,就看大家自己的抉择了。这里并没有打太极的意思,而是对于组件分层通信,怎么做、是否要做到如此,以及各种方案所带来的代码量的增加和后期的维护成本是否值得,不同的团队也会有不同的见解。

🐕 Void

NSHipster 介绍了很多和 Nothingness 相关的内容。这篇文章主要介绍的是 Swift 中的 Void。文章内容依旧是 Mattt 大神的写作三部曲:

  • Void 在标准库中的运用

    描述了 Swift 标准库在设计 ExpressibleByNilLiteral 的时候,如何巧妙的运用 Void 避免了和默认 init 冲突的情况。

  • Void 一些被忽略的细节

    比如 Void 是一个 non-nominal 类型,如何在无法拓展的情况下如何相互比较、一些自相矛盾的写法等

  • Void 实际开发中的秒用

    以网络请求为例,在使用 Void 的情况下,巧妙的把 completion(.success(())) 改成了 completion(.success)

🐎 Swift Tip: Lightweight Observation

对于静态视图结构和动态数据,我们可以使用内建的 didSet 属性观察器来观察数据的变更,并对应更新视图。这项技术的优势就在于简单性:不需要引入响应式框架、KVO 或其他东西。这篇文章用一个实际的例子演示了具体的做法。

🐕 Swift 5 and ABI stability

Swift 5 的分支最近已经准备要合并到主干了,这一次合并意味着 ABI 在 Release 之前不会有大改动,并且在未来版本保持 ABI 的向后兼容性。

所以最近在 Swift 论坛上也能看到核心团队加快节奏在调整精简标准库的 API,包括加入 Contiguous Collection Protocols 确立数组内存布局以便优化排序等操作,去除掉 Sequence.SubSequence 以便提升数组切片效率等等。

如果你还不了解 ABI 相关的内容,那么可以看看这篇文章,了解一下 ABI 稳定对我们日常开发的影响。

🐢 【译】给 iOS 开发者介绍 Flutter

本文是 Flutter for iOS 官方指南的翻译。iOS 知识和技能对 Flutter 开发非常有价值,如果你已经有 iOS 开发经验,可以通过这篇文章,用自己已有的 iOS 知识去使用 Flutter 构建应用。

文章主要介绍 UIView、UIViewController 等 iOS 常见知识在 Flutter 中怎样使用。共包含 12 个章节:View、页面导航、线程和异步、工程结构/本地化/依赖和资源、ViewController、布局、手势检测和 Touch 事件处理、主题和文字、表单输入、与硬件交互/第三方服务和平台、数据库和本地存储、通知。

作为给 iOS 开发者的入门 Flutter 的文章,本文内容全面,也可以作为开发手册来查阅。另外,作者还翻译了 给 Android 开发者介绍 Flutter,有兴趣可以阅读。

设计

Photopea: advanced image editor

Photopea 是一款免费的在线 Photoshop(替代品),拥有和 PS 几乎相同的界面和快捷键,并且支持多语言,已经有超过 150 万独立访客。

工具

手机上的抓包神器 Stream

配置简单,不需要改代理等繁琐操作,即可

  1. 抓取手机上的 HTTP & HTTPS 请求和响应,方便开发和测试人员快速定位线上问题。

  2. 重放和构建请求,高效调试服务端接口。

  3. 支持在 iOS 上实现配置 Hosts 的效果,方便产品和测试切换线上和测试环境。

  4. 集成一些常用工具,如 URL Decode/Encode,md5,base64,时间戳转化等。

另一款轻量级的 UI 实时调试工具 - Sherlock

这是除 Reveal 外又一款支持实时调试 UI 的工具,相比于 Reveal,Sherlock 虽然没有 Reveal 那么强大的功能,但它更加轻量级,且无需任何配置,打开模拟器和 Sherlock 就可以直接使用。此外,它还支持调整屏幕大小以测试你的 UI 在各类屏幕上的展示效果,不需要你去启动各种模拟器。目前 Sherlock 正处于 Beta 测试中,暂时只支持 iPhone 模拟器。

SmartBaby

SmartBaby 是一款提高 Swift 开发者效率的工具。它能从 JSON 推断出 Codable 模型,且具有好用的自定义功能。创建的模型可按照 Project 分组,并使用 CloudKit 存储在 iCloud 的私有数据库中。

由 SmartBaby 开发者 @nixzhu 自荐

代码

AloeStackView

AloeStackView 是一个类似垂直 UITableView 的类。它着重于让 UI 的实现变得非常的快速、简单和直接。不过为了实现更简单、更安全的API,它放弃了 UITababieView 的一些特性,如视图循环。

特性

  • 允许您保持对视图的强引用并动态更改其属性,而自动布局让 UI 实时更新。
  • 允许视图动态添加、删除、隐藏和显示,并提供可选动画。
  • 包括对视图间可定制分隔符的内置支持。
  • 提供可扩展的 API ,允许添加专用功能而无需修改 AloeStackView 本身。
  • 在高流量的 iOS 应用程序中广泛使用和审查。
  • 小的、易于理解的代码库(在500行代码之下)没有外部依赖性,调试轻松。

音视频

LEARN TALKS AWESOME CONFERENCE AND MEETUP TALK

顾名思义,learntalks 是一个学习如何 talk 的网站,面向技术人员。网站收录了技术领域时下热门的技术大会的演讲视频,其语言涵盖了 Swift,Kotlin, Javascript 等,颇有一种足不出户就能阅遍天下大会的感觉,学技术和学 talk 同时进行。推荐关注。

Flutter 免费视频教程第一季:开发环境搭建

手把手带你配置 Flutter 开发环境的视频教程,除视频外作者还编写了非常详尽的文字教程,对正在入坑 Flutter 的小伙伴可以看看。

内推

关注我们

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

同时也支持了 RSS 订阅:https://github...

Read more

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