想想你真正動工的地方。
一間混凝土基礎、沒有窗戶的地下室。一棟只立好輕鋼骨、釘上外牆板、水電都還沒接的新建案。一處偏遠的房子,開車過了最後一座基地台,還要再二十分鐘。商業大樓某個樓層正中央的機房。一座地下停車場。
現在想想軟體示範都是在哪裡辦的:一間有 Wi-Fi 的辦公室。
正是這個落差,讓現場軟體用起來令人火大,而這種火大很難講清楚是為什麼。App 並不慢,也不是設計得差,它在車道上跑得好好的,一進地下室——也就是你真正需要它的地方——就不動了。而且失靈的方式往往不老實:通常是一顆一直轉的讀取圖示、一次根本沒存進去的「靜默儲存」,或是表單在你退出時,把剛輸入的內容全丟了。
具體來說,失靈有哪些模式
「沒有連線」不是單一問題,其實包含好幾種情況,而每一種讓軟體失靈的方式都不一樣。
完全沒有訊號。 最單純的情況。設計良好的 App 知道自己離線了,也會照著離線的方式運作。多數 App 都處理得還可以,因為這種狀況很容易偵測。
只有一格訊號,嚴格說起來算是連線。 這種才真的會出事。裝置回報有連線,於是 App 試著連上伺服器,請求就這樣掛住。你會看著圖示轉四十秒,然後逾時;或者更糟,一個做到一半就中斷的請求。軟體如果只檢查「有沒有網路」,而不檢查「這個請求到底成不成功」,在這種情況下摔得最慘。
訊號時有時無。 你一天要在車道和地下室之間走上四趟。每進出一次,同步就多一次中途被打斷的機會。
有連線,但很慢。 下午四點壅塞的偏遠基地台。所有功能嚴格說起來都能動,只是慢到讓你乾脆不想再用。
真正稱得上能離線運作的 App,這四種都得應付。只處理第一種的 App,照樣會弄丟你的工作內容。

「能離線運作」到底該是什麼意思?
這句話大家常常隨口就講。其實有一套實在的檢驗方式,分成四個部分。
讀取要能用。 完全沒有連線時,你照樣打得開一件工程,看得到地址、工程範圍、客戶的電話號碼,以及昨天拍的照片。這代表資料是真的存在裝置上,不是碰巧快取到的。
寫入要能用,而且要撐得住。 你可以新增一則備註、記錄工時、登記一筆費用、拍照片。就算手機當場掛掉、App 被強制關閉,或是電池在寒流裡耗盡,這些內容在開機後也還在。只放在記憶體裡,不算存下來。
同步要自動、要無感。 訊號一恢復,排隊等著的內容會自己上傳。你永遠不該需要記得去按同步按鈕,因為你忘記按的那一次,恰好就是最要緊的那一次。
衝突要老實處理。 兩個人都在離線狀態下,改了同一件工程。好的軟體會偵測到,並且告訴你。差的軟體默默留下其中一個版本,你要到好幾週後才發現有一則備註不見了。
最後這一點最容易被跳過,也正是「能容忍離線」和「以離線為優先」這兩種 App 的分野。要偵測衝突,App 必須替每一筆記錄留下版本,上傳時再逐一比對。這是扎扎實實的開發工作,卻交不出任何看得見的功能,所以常常就沒人做。
為什麼照片值得專門用一段來談
照片是現場軟體裡最難處理的離線情境,同時也是承包商最需要在現場拍下的東西:動工前的既有損壞、牆後的狀況、完工成果、電錶讀數、一次送到的材料。
難處理是因為檔案很大。一件工程完整解析度的照片,動輒數十 MB。在一格訊號下,這種上傳會失敗,而且會一直失敗。把照片當成普通記錄來處理的 App,要嘛卡住等上傳,要嘛就把照片弄丟。
正確的做法是這樣:照片立刻寫進裝置並掛到工程上,上傳則是另一件獨立的背景工作,會不斷重試,就算 App 重啟、就算拖上好幾天也一樣。照片在拍下的那一刻就必須能在 App 裡使用,不管它有沒有真的傳上伺服器。
該留意的失靈情況,是那種照片在裝置上看得到、卻默默從來沒上傳的 App。一切看起來都正常,直到你在筆電上打開這件工程,或是手機弄丟了,才發現那些照片一直只在本機。

這件事沒做好,代價是什麼?
看得見的代價很小,卻一直在發生:每出一次狀況就損失幾分鐘,還要走回車道去找那一格訊號。
真正的代價是行為上的。吃過兩次虧之後,大家就不再信任現場的這款 App 了。工時又回到隨手寫在紙片上,星期五晚上再補輸入;收據拍進一本從來不整理的相簿;真正的排程放回自己腦子裡。軟體還是裝著、還是照付錢,公司卻又靠記憶在運作了。
一旦走到這一步,下游的一切都會跟著變差。工程成本核算會失效,因為成本根本沒掛到工程上。開帳單也會延遲,因為沒人確定工作是不是真的完成了。整套系統的價值,本來就建立在「資料在動工當下就記錄下來」這個前提上,而離線失靈,正好打破了這個前提。
決定要用之前,該怎麼測?
功能清單上看不出來,每一家都會寫「支援離線」。花十分鐘,實際測一次:
- 把手機切成飛航模式。
- 打開一件你最近沒開過的工程。能不能完整載入,包括照片?
- 新增一則備註、記錄工時、登記一筆費用、拍三張照片。
- 強制關閉 App,重新打開。剛剛那些是不是都還在?
- 恢復連線。所有內容會不會自動同步,不需要你按任何東西?
- 接下來才是真正的考驗:開啟 Wi-Fi,但連上一個上不了網的無線網路,讓手機回報「有連線」,實際上卻不通。重複步驟 3。很多通過飛航模式測試的 App,會在這一關掛掉。
六項全都撐過去,代表開發它的人真的在地下室裡待過。
Zeus 就是刻意這樣打造的:App 會在裝置上保留一份完整的本機資料庫,工程、客戶和價目在沒有連線時也讀得到,你輸入的每一筆內容都先寫進本機,等訊號恢復再同步。照片會立刻存進裝置;在含照片備份的方案裡,上傳會在背景重試,而且有只走 Wi-Fi 的選項,這樣一整天拍下的照片才不會吃光你的行動數據。兩支裝置改到同一筆資料時,系統會偵測出衝突,不會默默覆蓋掉,還會標示在同步指示器上,交給你來處理。
常見問題
把所有東西都存在手機上,會不會很佔空間?
文字記錄非常小:數千筆工程、客戶和明細項目,加起來只有幾 MB。照片才是唯一真正吃空間的東西,所以照片通常會獨立管理,一旦上傳完成,全解析度的原始檔就放在雲端。
手機弄丟或被偷了,上面的資料安全嗎?
這要看是哪一款 App,而且值得直接開口問清楚。該留意的重點有兩個:本機資料庫有沒有加密,以及 App 本身有沒有獨立的鎖,而不是只靠手機的螢幕鎖。Zeus 會為本機資料庫加密,也提供可自行選用的應用程式鎖定,用的是你裝置本身的生物辨識或 PIN 碼。
兩位工班成員在離線狀態下改了同一件工程,會怎樣?
在設計良好的系統裡,第二支裝置一同步就會偵測到衝突,並且交給人來處理。要小心任何宣稱「這種情況絕不會發生」的 App:常見的做法其實是「後寫入的蓋掉先寫入的」,也就是有人的工作內容默默不見了,誰也沒被通知。
出發去工地之前,需要手動同步嗎?
不應該需要;如果需要,那就是一個警訊。只要有訊號,同步就該在背景持續自動進行。





