Skip to content

Commit

Permalink
Merge pull request SwiftOldDriver#31 from SwiftOldDriver/master
Browse files Browse the repository at this point in the history
Pull from master
  • Loading branch information
waz0820 authored Aug 11, 2019
2 parents cb5cb43 + 8179167 commit 3291361
Show file tree
Hide file tree
Showing 2 changed files with 181 additions and 24 deletions.
53 changes: 29 additions & 24 deletions Reports/2019/#78-2019.08.05.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,34 @@

你也可以为这个项目出一份力,如果发现有价值的信息文章工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻
## 新手推荐

> 行业相关的新闻趣事看法
### 🌟 🐕 [swift-best-practices](https://github.com/Lickability/swift-best-practices)

## 新手推荐
随着 Swift 的稳定,越来越多的项目开始尝试 Swift 这门的语言,当然会有一部分新手不太清楚如何正确的在项目中使用 Swift[swift-best-practices](https://github.com/Lickability/swift-best-practices) 就告诉了你答案。内容包括但不局限于这几点:基础 MVVM 结构、通用控制器类型、文档的编写等。

### [swift-best-practices](https://github.com/Lickability/swift-best-practices)
### 🐕 [iOS 开发舆图](https://ming1016.github.io/2019/07/29/ios-map/)

随着 Swift 的稳定,越来越多的项目开始尝试 Swift 这门的语言,当然会有一部分新手不太清楚如何正确的在项目中使用 Swift[swift-best-practices](https://github.com/Lickability/swift-best-practices) 就告诉了你答案。内容包括但不局限于几个内容:基础 MVVM 结构、通用控制器类型、文档的编写等。
[@老峰](https://github.com/GesanTung):本文是来自戴铭的 iOS 开发全景图以及一些相关资料整理,成体系地罗列了 iOS 开发的知识点与技能栈,方便我们在日常开发中查漏补缺,主要包括以下内容:

- iOS 基础:列表布局图标图形多媒体AppServices动画
- iOS 系统:XUNdyldMach-O
- 编程语言
- 开发工具
- 计算机基础
- 通用知识
- 视野

## 文章

### 🌟 🐕 [Deriving Reactive from Imperative: An Introduction to Duals](https://jasdev.me/duals)

[@莲叔](https://weibo.com/aaaron7):Swift 的函数式编程从 Swift 语言发布之初、宣布支持 First Class Function 开始,就一直备受关注,开源社区陆续贡献了 RAC4,RxSwift 等基于 Swift 函数式特性实现的、方便用户更轻松的在日常的业务开发中应用函数式特性的开发框架。最近 Apple 官方推出了 Combine 框架,给社区增加了更多的信心。

虽然如此,但很多同学对函数式编程仍然觉得云里雾里,本篇文章开辟了一个新的视角,对比了命令式编程与函数式编程的其中一个分支:响应式编程, 并从函数式编程的角度,论证了一定程度上,响应式编程和命令式编程是对偶关系作者首先从范畴轮的角度解释了什么叫对偶,并基于命令式编程中的 IteratorProtol 以及 Sequence,来对比响应式编程中的 Subscriber 和 Publisher,并用之前对于对偶的定义来论证了他们存在的对偶关系

整篇文章视角新颖,能够带给人很多思考,读起来不算轻松,建议花时间消化消化

### 🐕 [分析一个 App 需要的技术手段](https://mp.weixin.qq.com/s/ZmDd3tOkHwSqCCsG7kfokQ)

[含笑饮砒霜](https://weibo.com/chinafishnews/):有时候看见喜欢的 App 可能会想要对它的实现一探究竟,本文作者以微信为例,站在逆向的角度,列举了分析一个 App 所需要的技术手段,包括:
Expand Down Expand Up @@ -50,27 +66,14 @@
- [WeChatRedEnvelop 抢红包](https://github.com/buginux/WeChatRedEnvelop)
- [深入iOS系统底层之汇编语言](https://www.jianshu.com/p/365ed6c385e5)


### 🐢 [iOS Memory 内存详解](https://juejin.im/post/5d3ee77ef265da039f1290b2#heading-2)

[@J_Knight_](https://github.com/knightsj):本文以 iOS 内存作为主题,以一般的操作系统的内存机制、iOS 系统内存、iOS APP 内存管理等三个层面进行了介绍。在文章后面还提供了一些内存分析的方法以及参考资料。想比较全面了解 iOS 内存相关知识的读者可以看一下这篇文章。

### 🐢[Rule-based logic in Swift](https://www.swiftbysundell.com/posts/rule-based-logic-in-swift)
### 🐢 [Rule-based logic in Swift](https://www.swiftbysundell.com/posts/rule-based-logic-in-swift)

[@享耳先森](https://github.com/iblacksun):对于系统设计而言,只考虑技术架构的话其实相对简单(比如使用 MVVM 还是其他架构模式),虽然架构模式非常重要,但我们还是可以通过对一些次要代码或结构进行改进来提升代码质量,所谓见微知著。本文通过 URL 匹配这一点入手,介绍如何将原来难以维护的代码抽象出一些规则来进行重构。

### 🐕 [iOS 开发舆图](https://ming1016.github.io/2019/07/29/ios-map/)

[@老峰](https://github.com/GesanTung):本文是来自戴铭的 iOS 开发全景图以及一些相关资料整理,成体系的罗列了 iOS 开发的知识点与技能栈,方便我们在日常开发中查漏补缺,主要包括以下内容:

- iOS 基础:列表布局图标图形多媒体AppServices动画
- iOS 系统:XUNdyldMach-O
- 编程语言:
- 开发工具
- 计算机基础
- 通用知识
- 视野

### 🐎 [Swift 5 之后 "Method Swizzling"](https://mp.weixin.qq.com/s/8z7A_-d0ZvvAJ3155DogvA)

[@四娘](kemchenj.github.io):Swift 5.1 里新增了一个私有功能叫做 Dynamic Method Replacement,可以简单地理解为一个类型安全的 Method Swizzle
Expand All @@ -80,7 +83,9 @@
## 工具

### 🚧 [iOS Continuous Integration with GitLab CI, Fastlane & OTA Installation](https://medium.com/flawless-app-stories/ios-continuous-integration-with-gitlab-ci-fastlane-and-ota-installation-from-gitlab-pages-f312e07ab06e)

[@水水](https://www.xuyanlan.com/): 本文介绍了基于 GitLab 的持续集成、Fastlane、无线下载安装。在本文中,我们将讨论的点有:

- 为什么选择 Gitlab?
- Gitlab CI 和 Runner
- Gitlab Runner 安装
Expand All @@ -89,23 +94,23 @@
- 配置 Fastlane
- 为我们的 TestProject 配置Gitlab CI
- 来自 Gitlab 的无线 IPA 安装

值得一提的是,[Gitlab.com](https://about.gitlab.com/) 为我们提供了免费的 CI。希望本文介绍的工具对正在做持续集成的团队或个人有所助益。

### [Swift 5 for Android is here](https://www.scade.io/download/?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=web)

一份代码,多端运行一直是我们移动端非常关注的点,业界也有很多不同的方案,如 FlutterQtReact NativeWeex 等等,而这些大多是采用 C++ 或者 JS 作为开发语言Swfit 作为苹果力推的开发语言,社区成员从一开始就希望它可以移植到更多的平台,像之前 Github 上就有用 Swfit 来开发 web 的 demo如今,SCADE 为我们带来了 Swift for Android,它使用 iOS 和 Android 各自的 Native 控件,保持了平台 UI 的差异性,然后通过统一的 Swfit API 进行调用同时,它的图形引擎支持很多动画效果,并且在屏幕适配上也很简单,这可以让我们开发更加复杂的应用

## 代码

### [SwiftUIX: An extension to the standard SwiftUI library.](https://github.com/SwiftUIX/SwiftUIX)

[@张嘉夫](https://github.com/josephchang10):SwiftUI 标准库的扩展,力求完善尚未成熟的 SwiftUI,提供了大量组件、扩展和工具。


### [apple_bleee](https://github.com/hexway/apple_bleee)

[@anotheren](https://github.com/anotheren):这是一份通过蓝牙/Wi-Fi获取 iPhone 用户信息代码示例,攻击者可以在特定条件下,获取到受害者的部分设备信息甚至手机号码。严格的来说这不是一种系统漏洞,这是 Apple 生态的一部分,这种东西一方面能够使人享受整个 Apple 生态圈的便利,但是另一方面也会造成少数窃取个人隐私的可能。具体也可以看看少数派的[这篇文章](https://sspai.com/post/55920)。

## 书

> 比较不错的书的推荐和书评

## 音视频

### 🌟 [ Flutter 开发 iOS 应用](https://www.bilibili.com/video/av61563879/?redirectFrom=h5)
Expand Down
152 changes: 152 additions & 0 deletions Reports/2019/#79-2019.08.12.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
# 老司机 iOS 周报 #79 | 2019-08-12

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/ios-weekly.png?raw=true)
老司机 iOS 周报,只为你呈现有价值的信息

你也可以为这个项目出一份力,如果发现有价值的信息文章工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻

### [7000个未解决issue,Flutter看起来很好,用起来挺疼](https://mp.weixin.qq.com/s/EAgzYQX5-4pu7HWaGwK7Ag)

[@CrazyCoderShi](https://github.com/CrazyCoderShi):Flutter 自发布以后,国内外都掀起了 Flutter 的学习热潮,其中褒贬不一,本文作者分享了一些自己在学习过程中的一些心得和体会(吐槽😂),好了先开始吐槽:

- 安装过程很漫长
- 一团糟的 Material Design
- 其他烦心事 (这里面包括了一些组建的 Bug)

目前 Flutter 在 GitHub 上有超过 7000 个 issues 未解决,这个数字真的很吓人小编本人之前也用 Flutter 开发过 App ,我也趁着这波吐槽一下😂,因为问题远不止 Bernardo Ferrari 说的那些:

- 跟现有项目混和开发体验极差
- PlatformView 的表现相当差强人意,特别是在 iOS 上
- 生态发展欠缺的还是比较多的

略微做个总结,整体来看问题真的很多,但是 Flutter 自发布 1.0.0 以来还不到一年,发展速度已经是很快了,有不足之处,但也有不少惊艳之光,不然国内的大厂也不会纷纷都在布局 Flutter 技术的落地,其中走在最前面的咸鱼,想必大家都是知道的所以,小编觉得,不管从哪个角度来看,都是一个值得尝试和学习的技术栈,毕竟技多不压身不是?

## 新手推荐

> 收集一些对新手友好且质量不错的文章

## 文章

### 🐢 [抖音研发实践:基于二进制文件重排的解决方案 App 启动速度提升超15%](https://mp.weixin.qq.com/s/Drmmx5JtjG3UtTFksL6Q8Q)

[含笑饮砒霜](https://weibo.com/chinafishnews/):App 的启动速度通常是 App 给用户的第一印象,重要性不言而喻。除了传统的通过修改业务代码的方式,抖音 iOS 客户端团队,开拓性的发现通过修改代码在二进制文件的布局可以提高启动性能。

本文从原理出发,介绍了抖音 iOS 客户端团队是如何通过静态扫描和运行时 trace 找到启动时调用的函数,然后修改编译参数完成二进制文件的重新排布相信在未来,二进制文件重排也会有更多应用场景

> 最近 Facebook 也在一个技术大会上分享了类似的内容,强烈推荐: [视频](https://www.facebook.com/atscaleevents/videos/664302790740440/)

### 🐎 [SE-0261 Identifiable Protocol](https://github.com/apple/swift-evolution/blob/master/proposals/0261-identifiable.md)

[@Damonwong](https://github.com/Damonvvong)在 SwiftUI 中引入了 Diff 的概念。意思就是在一个列表刷新的时候,会根据一个唯一标识符来判断是否需要重新渲染,如果通过 Diff 算法算得某个唯一标识符并没有变化,那么这块区域就不会重新渲染。而在这个事情中最重要的就是「唯一标识符」这个东西了,在 SwiftUI 中通过 Identifiable 来约束类型满足唯一标识符这个概念。当然,唯一标识符不仅仅可以使用在 Diff 算法中,还可以用在很多其他的地方,比如通讯录联系人的唯一标识符。因此在[Swift 社区讨论](https://forums.swift.org/t/move-swiftuis-identifiable-protocol-and-related-types-into-the-standard-library/25713)之后,决定把 Identifiable 这个协议加入到标准库中,并在 Swift 5.1 发布。

### 🐎 [swift-corelibs-foundation Release Notes for Swift 5.x](https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/ReleaseNotes_Swift5.md)

[@享耳先森](https://github.com/iblacksun),[@老驴](https://github.com/olddonkey):

Swift 开源版的 Foundation 在 Swift 5.x 有了不小的改动:

1. 依赖:

Swift 开源版的 Foundation 初版实现大量地使用了开源库,这次在新版本中整理了一下开源库的依赖,并且把之前的 Foundation 拆分成了三个库:

* Foundation
* FoundationXML:考虑到大部分人不会使用 XML 相关的功能,所以通过 FoundationXML 将 libxml2 的依赖从 Foundation 里拆了出来
* FoundationNetwork:将 URLSession 相关的网络请求 API 拆了出来

FoundationNetwork 的情况比较复杂一点,之前论坛里的草案 Pitch: Move URLSession to new FoundationNetworking module 比较详尽地介绍这一次的改动

Foundation 网络库使用的 [libcurl](https://forums.swift.org/t/pitch-move-urlsession-to-new-foundationnetworking-module/14002) 带来了太多子依赖,一部分甚至和 SwiftNIO 的依赖产生了冲突,并且开发组希望使用 SwiftNIO 作为 URLSession 的底层实现,这一次改动之后依赖链就变成了 FoundationNetwork -> SwiftNIO -> Foundation。

2. Objective-C Runtime 仿真:

Foundation 为 Swift for Linux 提供了模拟仿真部分 Objective-C 方法现在,Swift 5.1 中也可以用这样的方法了:

``` swift
let someClass = NSClassFromString("NSTask")
assert(someClass == Process.self)
let someName = NSStringFromClass(someClass)
assert(someName == "NSTask")
```

3. NSCoder 的改进:

这个版本的 Swift Foundation 中改进了 `NSCoder` 的具体实现,让它能更接近 Darwin 中对应的部分

4. NSSortDescriptor 的改动:

现在,在 Swift Foundation 中包含了 `NSSortDescriptor` 的实现,同时它与 Objective-C 中对应部分兼容因为有部分的 API 改动,所以推荐有用到 `NSSortDescriptor` 的开发者看一下对应的文档

5. 其他改动:
Scanner API 改进,现在不再需要做 Casting 了,更加符合 Swift 的语法习惯FileHandle API 改进,主要是针对 NSError 变化上的变动,能够抛出 Error 而非直接 Crash 了

## 工具

### [Swift API-Digester](https://github.com/apple/swift-nio/commit/07e7e01c76be20640ddc3770d7b16e87eedf20de)

[@享耳先森](https://github.com/iblacksun):Swift 5.1 里新增了一个 `api-digester` 功能,用来打印和比较编译产物的 API,Swift-NIO 在此基础上搭建了一个 API Diff 功能,可以预见未来开源框架都会使用这个功能来生成 API Diff,帮助检验 Pull Request 对于 API 的影响,ChangeLog 的生成等等。

用类似这样的命令:`swift api-digester -diagnose-sdk --input-paths "dir1" -input-paths "dir2"` 就能比较两个编译产物的 API 区别,生成类似下面的结果:

> Removed Decls
> Constructor WebSocketFrameDecoder.init(maxFrameSize:automaticErrorHandling:) has been removed
> EnumElement WebSocketOpcode.unknownControl has been removed
> EnumElement WebSocketOpcode.unknownNonControl has been removed

> Renamed Decls
> Func WebSocketFrameDecoder.decode(ctx:buffer:) has been renamed to Func WebSocketFrameDecoder.decode(context:buffer:)
> Func WebSocketFrameDecoder.decodeLast(ctx:buffer:) has been renamed to Func WebSocketFrameDecoder.decodeLast(context:buffer:seenEOF:)
> Func WebSocketFrameEncoder.write(ctx:data:promise:) has been renamed to Func WebSocketFrameEncoder.write(context:data:promise:)
> Func WebSocketProtocolErrorHandler.errorCaught(ctx:error:) has been renamed to Func WebSocketProtocolErrorHandler.errorCaught(context:error:)

> Type Changes
> Constructor UInt8.init(webSocketOpcode:) has return type change from UInt8? to UInt8

## 代码

### 🐕 [CombineCocoa](https://github.com/freak4pc/CombineCocoa)

[@老峰](https://github.com/GesanTung):CombineCocoa 是基于 [Combine](https://developer.apple.com/videos/play/wwdc2019/722/) 对 UIKit Controls 的封装,类似 RXcocoa 实现了许多组件的绑定功能,可以直接把值和控件互相绑定,避免通知、监听、delegate 等,极大的简化了 UI 相关逻辑处理,示例如下:

- textField.textPublisher
- segmented.selectedSegmentIndexPublisher
- slider.valuePublisher
- button.tapPublisher
- swtch.isOnPublisher
- datePicker.datePublisher
- ...

## 书

> 比较不错的书的推荐和书评

## 音视频

> 比较不错的书的推荐和书评

## 内推

老司机周报团队联合知识小集和 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/qrcode_for_wechat.jpg?raw=true)

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

## 说明

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

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


0 comments on commit 3291361

Please sign in to comment.