Third Party Tools

0x00 前言

这篇文章是自己在学习 CFHipsterRef Chapter 15 Third Party Tools 时做的笔记。

0x01 appledoc

Cocoa 开发者中有一句谚语,Objective-C 的冗长有助于自文档化(self-documenting)代码。在 longMethodNamesWithNamedParameters: 和这些参数的显式类型之间,Objective-C 方法不会留下太多的想象。

但是即使是自文档化代码可以通过文档来改进,只需少量的工作就能对他人产生显著的好处。

在 Objective-C 中,选择的文档工具是 appledocappledoc 能够从 .h 文件中生成 HTML 和 Xcode 兼容的 .docset 文档,看起来跟 Apple 的官方文档几乎一样。

Objective-C 文档由任何 @interface@protocol之前的 /** */ 注释块(注意额外的初始星号)以及任何方法或 @property 声明所指定。文档可能还包含系统字段的标签,如参数或返回值:

  • @param [param] [Description]:描述了应该传递什么值或此参数
  • @return [Description]:描述了一个方法的返回值
  • @see [selector]:提供“参见”相关项目的参考
  • @discussion [Discussion]:提供额外的背景情况
  • @warning [description]:调出异常或潜在的危险的行为

appledoc 可以通过遵循项目页面上提供的最新的安装说明或使用 Homebrew 安装:

1
$ brew install appledoc

要生成文档,可以在一个 Xcode 项目的根目录中执行 appledoc命令,传递元数据比如项目和公司名称:

1
2
3
4
5
$ appledoc --project-name CFHipsterRef \
--project-company "NSHipster" \
--company-id com.nshipster \
--output ~/Documents \
.

这会从目标目录中找到的头文件中生成并安装一个 Xcode .docset 文件。

额外的配置选项,包括 HTML 输出,可以通过传递 --help 找到:

1
$ appledoc --help

0x02 xctool

xctoolxcodebuild 的替代,xcodebuild 是 Xcode.app 下的工具。

xctool 的优美不只是表面上的,构建进度也可以格式化报告,可以由其他工具读取:

1
$ xctool -reporter plain:output.txt build
  • pretty:( 默认 )一个基于文本的报告器(reporter),其使用 ANSI 颜色和 unicode 符号来美化输出。
  • plain:如 pretty,但是没有带颜色或 Unicode。
  • phabricator:输出一个 JSON 数据的构建/测试结果,可以输入到 Phabricator 代码 review 工具中。
  • junit:生成具有测试结果的 JUnit / xUnit 兼容的 XML 文件。
  • json-stream:一个构建/测试流作为 JSON 字典,一行(示例输出)。
  • json-compilation-database:输出构建事件的 JSON 编译数据库,其可以通过基于 Clang Tooling 的工具使用,例如 OCLint。

xcodebuild 的另一个改进是 xctool 会以 Xcode.app 相同的方式在项目中运行应用程序测试。

仅仅因为这个原因,xctool 对 Objective-C 社区中持续集成测试的新兴学科具有重大含义。

要安装 xctool,运行下面命令:

1
$ brew install xctool

0x03 OCLint

OCLint 是一个静态代码分析器,用于检查 C 代码是否存在常见的问题源,想空的 if/else/try/catch/finally 语句,未使用的局部变量和参数,具有高 NCSS(非注释源语句,Non Commenting Source Statements)复杂代码,冗余代码和其他不良做法。

安装 OCLint 最佳的方式是使用 Homebrew Cask

1
$ brew cask install oclint

还记得 xctool 的 json-compilation-database 报告器选项吗?与 oclint-json-compilation-database 一起使用来启动 OCLint:

1
2
3
4
5
6
$ xctool -workspace NSHipster.xcworkspace \
-scheme "NSHipster" \
-reporter json-compilation-database \
build > compile_commands.json

$ oclint-json-compilation-database

0x04 xcpretty

xcpretty 类似于 xctool,它改进了 xcodebuild 构建输出,但不是尝试替换 xcodebuild,而是扩展并改进它。

事实上,xcpretty 通过获取 xcodebuild 的管道输出,而不是直接调用来例证 Unix 可组合性的哲学:

1
$ xcodebuild [flags] | xcpretty -c

这种方法的一个主要好处是它真的很快 —— 事实上,在某些情况下,xcpretty 实际上比直接调用 xcodebuild 还要快一点,因为它节省了打印到控制台的时间。

xctool 另一个共性是报告器功能,其特点是格式化输出为 jUnit 风格的 XML,HTML 或 上述 OCTool 兼容的 json-compilation-database 格式。

xcpretty 可以使用 RubyGems 安装,其在 OS X 中已经默认安装:

1
$ gem install xcpretty

0x05 Nomad

Nomad 是用于 iOS 和 OS X 开发的世界级命令行工具的集合。它自动化常见的管理任务,以便于开发者可以专注于构建软件。

每个工具都可以独立地安装,或者用一条命令一起安装:

1
$ gem install nomad-cli

0x06 Cupertino

应用程序 provisioning 的过程被所有 Apple 开发者普遍厌恶。

除了整个过程是一个噩梦的开始到结束,许多操作需要通过 Web 界面进行交互。这不仅需要大量额外的点击,而且使其很难自动化。

Cupertino 提供了一个 CLI 用来管理设备,provisioning profiles,app IDs 和 证书(certificates)。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ ios devices:list

+------------------------------+---------------------------------------+
| Listing 2 devices. You can register 98 additional devices. |
+---------------------------+------------------------------------------+
| Device Name | Device Identifier |
+---------------------------+------------------------------------------+
| Johnny Appleseed iPad | 0123456789012345678901234567890123abcdef |
| Johnny Appleseed iPhone | abcdef0123456789012345678901234567890123 |
+---------------------------+------------------------------------------+

$ ios devices:add "iPad 1"=abc123
$ ios devices:add "iPad 2"=def456 "iPad 3"=ghi789 ...

0x07 Shenzhen

有一件事 web 开发者相对于 iOS 是可以在几秒钟之内连续部署代码,与为 Cupertino 的批准(有时候拒绝!)一个更新而等待几天截然不同。

幸运的是,一个家庭手工业随着开发和企业分发而兴起。第三方像 HockeyApp,DeployGate 和 TestFlight 提供开发者一个更简单的方式去注册测试用户和发送最新的 QA 版本。

Shenzhen 是一个进一步自动化此过程的工具,通过构建 .ipa 文件然后分发到一个 FTP/SFTP 服务器,S3 bucket 或任何上述第三方服务。

1
2
3
$ cd /path/to/iOS Project/
$ ipa build
$ ipa distribute:sftp --host HOST -u USER -p PASSWORD -P FTP_PATH

0x08 Houston

Houston 是一个用于发送 Apple Push Notifications 的简单工具。传递凭据,构造消息,并将其发送到设备。

1
2
3
$ apn push "<token>" \
-c /path/to/apple_push_notification.pem \
-m "Hello from the command line!"

此工具特别适合用于测试远程通知 —— 特别在一个新的 app 中实现功能。

0x09 Venice

应用内购买(In-app Purchase)已经,或多或少,成为 app 开发者最有利的商业模式。

Venice 是一个用于验证 Apple 应用内购买收据的 CLI,并且用收据数据检索相关联的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ iap verify /path/to/receipt

+-----------------------------+-------------------------------+
| Receipt |
+-----------------------------+-------------------------------+
| app_item_id | |
| bid | com.foo.bar |
| bvrs | 20120427 |
| original_purchase_date | Sun, 01 Jan 2013 12:00:00 GMT |
| original_transaction_id | 1000000000000001 |
| product_id | com.example.product |
| purchase_date | Sun, 01 Jan 2013 12:00:00 GMT |
| quantity | 1 |
| transaction_id | 1000000000000001 |
| version_external_identifier | |
+-----------------------------+-------------------------------+

就像 Houston,Venice 具有一个客户端库组件,允许它部署在一个 Rails 或 Sinatra 应用程序。验证服务器上的收据允许保留他们自己过去购买的记录,这对于最新的指标和历史分析是有用的。因此,关于 IAP,这是推荐的做法。

0x0A Dubai

Passbook 管理登机牌,电影票,零售优惠券和会员卡。使用 PassKit API,开发者可以注册 web services 以自动更新通信证上的内容,比如登机牌上的登机口更改或向会员卡添加积分。

Dubai 可以很容易地从脚本或命令行生成 .pkpass 文件,允许快速迭代你的 passes 的设计和内容,或生成一次性的动态。

1
$ pk generate Example.pass -T boarding-pass

一旦一个 pass 生成,它可以用 Dubai 通过 HTTP 开启一个本地服务,允许 passes 在 iOS 模拟器上动态地预览:

1
2
$ pk serve Example.pass -c /path/to/certificate.p12
$ open http://localhost:4567/pass.pkpass