Git LFS ( Large File Storage )

今天在更新 BlayPods 時,發現 Realm 的某個檔案(60.04 MB)超出了 GitHub 的上限(50.00 MB),所以無法順利地將檔案推上去 GitHub,而 Git 也自行 untracked 那個檔案,所以在 git status 上便失去了蹤影。

至於為什麼會將 Pods 的檔案全推到 GitHub 上呢?

而在 git push 的時候,有顯示解決的方法,便是今天的主題:

Git LFS

首先我們透過 brew 來安裝 git lfs

brew install git-lfs

接著繼續在 git 裡頭安裝

git lfs install

再來我們就來定義哪些檔案需要被 lfs track,像我這邊是這樣:

git lfs track 'Pods/Realm/core/librealmcore-ios.a'

然後可以透過指令來確認是否有被加入到 track 的名單

git lfs track

git status

現在就可以從 git status 之中再次看到剛剛沒推成功的檔案被 track 了!

git lfs track 的內容會被記錄到 .gitattributes 裡頭,所以也一併推上 GitHub 即可完成!

git push

這樣便可以在 GitHub 上處理單個檔案超過 50.00 MB 的問題,不過免費流量為 1GB / month。

 

Pods 到底需不需要放在 .gitignore?

若有使用 GitHub 所預設的 Swift .gitignore,你會發現在 CocoaPods 的部分寫著

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/

用意如同字面上的意思,GitHub 所提供的預設會建議你上傳 Pods 的內容到 git server 上,

而我個人也認同這種做法,目前所想的原因如下:

  • 可以完整地打包套件當前狀態到 git 上,以避免套件有異動
  • 若你們有直接修改 Pods 裡頭的 Source code 的話,更加得上傳(不過完全不建議這麼做)
  • git clone 下來之後可以不用再 pod install 一次

不過也是有些壞處,如套件越多時,造成 git 上的專案肥大等。

但是像是 Carthage 的話,就會建議加入到 .gitignore,畢竟它的用意就是要去中心化,

若將自己 build 出來的套件放上去就和中心概念背道而馳了!

Siren – 通知使用者更新

我們時常可以在 App 之中看到,「目前有新版本可以提供下載」等相關的訊息;
而實作通知使用者更新的方法很多,這篇則是介紹一個開源的 Framework:

Siren

Siren 的運作邏輯是,你可以透過版號來決定跳出什麼通知來提醒使用者,
並且提供多語系的訊息內容。
它會透過 Bundle Identifier 去 App Store 上尋找資訊,
再來比對版號執行後續動作。

版號的定義

1.0.123.5678

  • 1:major
  • 0:minor
  • 123:patch
  • 5678:revision

一般我個人的習慣是:
major 會是在商業模式改變或是重大功能發布時,才會動到的;
而 minor 則是有必要的更新,像是嚴重的 bug 或是無法向下相容的異動。
patch 是更新一些 issue 或是修正 bug;
revision 則讓它跟著 commit 的數量。

Siren 的設定

舉個例子,在 major、minor 有提升時;
像是從 1.0.0 -> 2.0.0 或是 1.0.0 -> 1.1.0,
我會希望舊的使用者一定要更新 App 才能使用,
則會設為強制更新(.force)。

而 patch 則讓使用則決定要不要更新,或是可以跳過此次更新。

Siren.shared.majorUpdateAlertType = .force
Siren.shared.minorUpdateAlertType = .force
Siren.shared.patchUpdateAlertType = .skip
Siren.shared.revisionUpdateAlertType = .none

還沒上架前的測試

Siren 建議可以先將 Bundle Identifier 更改為 iTunes Connect Mobile 的 Bundle Identifier:com.apple.itunesconnect.mobile
並把 Siren 的 debugEnabled 調整為 true。