Life is a YOLO game

Sudo 開發日記 2016-04-11

April 11, 2016

工作內容

1. 完成 app 的自動化部署

  • 使用 fastlane 進行部署。
  • 使用 testflight 向測試人員發送通知與推送新版本。

2. app 主體

  • 將 app 改寫成 redux-like 架構,之所以加上 -like 是因為真正實作的工具是 recompose

其他新東西

1. fastlane

fastlane 可以類比成行動平台的 capistrano,主要的兩大平台 iOS、Android 都有支援。fastlane 由好幾支工具組成,fastlane 指令本身只負責將參數轉送給這些工具。從 測試編譯後勤支援 (e.g. 螢幕截圖、更新 app 資訊) 到 打包上傳 Testflight,甚至最後 送審上架 都可以透過 fastlane 完成。

fastlane 的主體與設定檔採用 Ruby 開發,開發前請注意機器上是否有安裝 Ruby。

這次主要使用到的 fastlane 元件有 match、gym 跟 pilot,分別介紹如下。

A. match

透過 Git 管理開發時使用的各類憑證:

  1. private key 存取 Apple 開發者平台所需的私鑰。
  2. certificates app 的身分證。
  3. provisioning profiles 與開發環境連動的設定檔,主要分為 development (開發用) 與 ad-hoc (內部測試時使用,在這次 app 開發中被 Testflight 取代)。

有開發過 iOS 的工程師大概都經歷過管理這些憑證的痛苦,match 透過 Git repository 配合 spaceship (fastlane 團隊實作的 Apple Developer Portal API),將這些憑證的簽發與同步的工作透過一個 match 指令完成。

因為一支 Git repository 保存的只有與 app 有關的 certificates 與 provisioning profiles,因此 一支 repository 對應一支 app,也就是開發團隊的所有成員如果要參與開發都是 同步同一支 Git repository

至於 match 的安全性:

  1. match 強烈建議使用者將使用 private repository 管理憑證,可以大幅降低資安風險。
  2. 簽發憑證時 match 會要求使用者輸入 passphrase 做加密,因此即使 repository 被入侵,如果 passphrase 的強度足夠有心人士短期內也很難解鎖,相對也可以幫團隊爭取到更換憑證的時間。
  3. private key 透過 Mac 的 Keychain 工具程式保存在本機上,不會同步到 Git repository。所以惡意人士即使取得 repository 的控制權,也無從偽裝成開發者的身份進一步控制 Apple 開發者帳號。

B. gym

由於 Xcode 的 command line 編譯指令十分複雜:

$ xcodebuild clean archive -archivePath build/MyApp \
                           -scheme MyApp
$ xcodebuild -exportArchive \
             -exportFormat ipa \
             -archivePath "build/MyApp.xcarchive" \
             -exportPath "build/MyApp.ipa" \
             -exportProvisioningProfile "ProvisioningProfileName"

透過 gym 則可以大幅降低編譯的指令長度:

$ gym

但卻不失彈性:

$ gym --workspace "Example.xcworkspace" --scheme "AppName" --clean

C. pilot

pilot 負責將 app 打包簽呈 (將憑證包入 app) 並 上傳iTunes Connect

iTunes Connect 可以想成是 iTunes 的後台,所有 app 的 測試送審發布 都在 iTunes Connect 上解決。app 上傳後,已加入該 app Testflight 測試計畫的使用者都會收到更新通知。

2. Testflight

原來是獨立一家公司,主要業務是 iOS app 的測試服務,之後被 Apple 收購。透過 Testflight,Apple 開發者可以邀請 不具備 Apple 開發者身份 的非開發人員或特定客戶,透過 Testflight app 加入 app 的測試流程。

3. recompose

這算是從 React 衍生出來的一套工具程式,在 React ecosystem 中與 Redux 同級。

Forget ES6 classes vs. createClass().

An idiomatic React application consists mostly of function components.

-- recompose

recompose 希望透過 high-order functions 與 functional programming 的實作 (curry、compose 等函數包裝方法) ,而不是 ES6 的 class 操作 React component。

簡而言之,一個 high-order function 就是一個 component

原來想透過 Redux 重寫 app 的主體架構,順便將排版的 flexbox 從頭到尾整理一次,為接下來串接 API 做準備。打開 Redux 的文件才發現 Redux 有很大一部分的實作都已經非常地 functionalized,這才想起之前看過的 recompose,想說如果 Redux 都被 functionalized 了不如直接使用 recompose,API 也比 Redux 簡潔許多。

唯一要注意的是 component 的 lifecycle 在 recompose 中被 implicated 了,很容易不小心就在 render 的部分改動了 state。由於之後的動畫的啟動與重新繪製很容易去踩到這條不明顯的界線,要如何分割 component 是接下來要研究的部分。


Henry Wu
Written by Henry Wu who lives and works in Taipei producing some nasty bugs.
Author: Henry Wu License: MIT License: CC BY-NC-ND 4.0