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

0x01 起因

最近因为某些原因,公司准备把用了好多年的 Slack 换成企业微信。这其实是件挺正常的事情,公司在不停地发展,什么样的变化都有可能会发生。说不定公司在做大到一定程度以后,做自己的 IM 也不一定。

但如果之前没有用过 Slack 还好,但在用过几年之后,就不免会把它与企业微信之间做一些对比。

我喜欢 Slack 的 Message and file threadsEmoji reactions 还有它便捷的 API,这几点企业微信都做的不太好,甚至没有。这还挺让人失望的。

而且它的水印真的很魔性,在聊天界面很显眼。所以我决定用我仅有的一点点逆向工程破解知识,来把它的水印从聊天界面中去除。

KeyPath in iOS

KeyPath in Objective-C

看下面两段 Objective-C 的代码,

// KVC
[someObject setValue:someValue forKey:@"someKey"];

// KVO
[account addObserver:self
forKeyPath:@"balance"
options:NSKeyValueObservingOptionNew
context:PersonAccountBalanceContext];

上面的代码存在的一个共同问题是 KeyPath 参数的类型。NSString * 代表你和所谓的编译检查就没有什么关系了。在未来的某一天,如果 property 的名字发生了变化,代码就会出现问题。所以 Objective-C 中的 KeyPath 并不安全(这样的例子在 Objective-C 中并不少见)。

香港印象

本文的大部分內容都是五月份在香港的時候用 Notes 記下的,但因為懶,拖到今天才整理 🙈
因為内容关于香港,所以索性就用繁體好了

五月中旬計劃去泰國玩一玩,訂機票的時候發現從香港轉機再過去清邁會便宜一些,而且經過香港去其它國家並不需要提供香港的簽註,只要在入境的時候提供一下後面的行程單就可以了。

分析使用 CocoaPods 项目的依赖

在去年,我曾用 electron 写过一个分析使用 CocoaPods 项目依赖的工具,当时对 CocoaPods 还不怎么了解,用了一种「非正常」的操作解决了我当时的需求。不过现在,我找到了一种更好的解决方案

先回顾一下我们的需求

podspec 中列出的 dependecy 在某些情况下要远远比看起来的多得多,尤其是在大量使用 development pods 的情况下。而有些情况,需要确认一个 pod 的全部依赖(比如为这个 pod 创建 Example 工程的时候),这时就需要一个工具来分析了。最终的目标是在拥有一个 podfile 的情况下,把每个依赖的所有依赖都找出来

Swift 中的方法调用(Method Dispatch)(一) - 概述

Objective-C 方法调用的方式是发消息,那 Swift 方法调用的方式是什么呢?搞清楚 Swift 中方法调用的方式,会对于我们理解 Swift 有更好的帮助

Swift 4 & Xcode 9.2

先看一个最简单的例子,

// DogStruct.swift
struct DogStruct {
func makeNoise() {
print("bark in struct!")
}
}

let ds = DogStruct()
ds.makeNoise()

给 iOS 组件集成 GitLab CI

相信每个人都有这样一个愿景,就是希望自己维护的每一个组件都能跟知名的开源项目一样优秀,有高的代码质量,完整的测试和文档。为了达到这一目的,就需要有 CI 作为项目开发过程中的一个环节介入。在每次 push 或者提交 Merge Request 的时候,CI 可以代替人来做一些事情,编译项目,跑跑测试,做一些静态检测,帮助提交者和 reviewer 及时发现一些简单的问题,提高工作效率。CI 的

使用 Homebrew Formula 搭建命令行工具

当团队工程中的脚本过多了以后,就应该考虑把它们组织起来,做成 CLI 了。比起一个个独立的脚本,CLI 更容易升级和维护,也更方便共享代码。

我的初衷就是把所有的脚本放到一个 gitlab 的 repo 中,所有想使用这个工具的人通过很简单的方式就能安装、更新并使用它。

那么问题来了,如何把这些脚本,变成在团队内部,人人都可以安装/升级的 CLI 呢?

我的选择是 Homebrew Formula。

Phantom Types in Swift

在 Objc.io 上看到了这样一期视频。主要介绍了一种叫 Phantom Types 的技巧,它的作用就是在类型(type),而不是值(value)这个层面上来表示状态,而且在编译时期对错误类型间的运算做出提示。

Phantom Types(幽灵类型) 其实就是空类型。比如这样,

enum Miles {}
enum Kilometers {}

它比较实际的一个应用是,让编译器帮你检查某些对象在特定的状态下能够调用哪些方法。也能通过类型来表示状态。

升级 Swift 4

公司的 CI 终于升级到了 Xcode 9,所以项目的代码也可以升级一下 Swift 4 了。因为 Xcode 9 是支持 Swift 4 和 Swift 3.2 同时存在的,如果你所有依赖的第三方库都能够支持到 Swift 3.2 及以上,那你的项目就能无痛升级了。如果真的希望一半是 3.2 一半是 4,可以通过这样更改 Podfile 实现这种需求。