最近,微信小程式掃碼簽到工具正式上線了。
回首過去一個月的歷程,是時候該停下來做個階段性的總結了,回顧得失,以便持續改進。這篇文章,就總結一下過去跳過的那些坑吧。
這些坑大致可以歸為如下幾類:
-
小程式某些技術細節與常用技術存在不一致。文件中雖有提及,如果不仔細看容易跳坑。
-
小程式的文件太簡略,沒有註明支援哪些功能,哪些不支援,只有用了才知道。
-
小程式的bug。
列舉一下幾個比較典型的坑吧。
1. Get和Post請求的返回資料不支援二進位制流。
小程式支援通過post獲取小程式碼(有點像菊花)。嘗試通過wx.request向微信伺服器獲取小程式碼的圖片,結果發現返回的結果無法顯示。開始懷疑程式碼有問題,除錯之後,發現微信伺服器返回的結果正確,而小程式會自動把二進位制結果轉碼。更鬱悶的是,這種轉碼丟失了檔案內容,並且轉換是不可逆的。
於是,我們改方案,把伺服器當中轉站,讓小程式使用wx.downloadFile從伺服器下載圖片。在收到小程式下載圖片的請求之後,伺服器直接和微信伺服器獲取小程式碼的圖片,然後以附件的形式返回給小程式。
問題解決。
2. Canvas和Image對圖片的各種不支援。
①掃碼簽到中用到了二維碼。
在開始的版本中,我們準備在Canvas上直接繪製二維碼,接著使用wx.canvasToTempImage函式儲存為image檔案,然後通過Image元件載入。
經過除錯,一切順利。執行的時候呢,發現有時候在繪製完圖片之後,呼叫wx.canvasToTempImage函式失敗。這種情況在除錯無法重現,執行的時候偶爾出現,不穩定。
仔細檢查了程式碼,沒問題啊。Google之後,有網友提出瞭解決方案,在drawImage完成之後,最好等3秒鐘再呼叫wx.canvasToTempImage,以保證儲存成功。
② Canvas和Image都不支援Base64圖片,Image無法儲存。
最初的方案中,我們自己生成二維碼,後來為了相容微信的“掃一掃”功能,我們決定改用小程式碼。
開始,我們把Image的src設定為Base64格式,從伺服器上通過request獲取圖片的Base64編碼。小程式開發工具和iPhone上面測試都沒有問題,唯獨Android手機上無法正常顯示圖片。哦,原來在Android上,Canvas和Image都不支援Base64圖片。可是…小程式開發文件中並沒有這方面的說明啊。
怎麼解決Android手機上的這個問題呢?如果把Image改成URL形式呢,小程式無法儲存圖片,以致即使是相同的圖片,每次都要從伺服器獲取,這又加重了伺服器的負擔。這樣吧,使用wx.downloadFile把檔案下載到本地,然後再處理。
3. 小程式碼的識別率太低。
上文提到,最初我們使用的簽到二維碼是自己生成的二維碼(QRCode),正方形的那種。識別率高,缺點是不支援微信“掃一掃”。在使用過程中,我們發現,相當數量的使用者看見二維碼,第一反應會使用微信“掃一掃”去掃二維碼。為了滿足這個需求,那就把二維碼替換成微信的小程式碼(有點像菊花)吧。
可是,和方形二維碼相比,識別小程式碼的成功率非常低。小程式碼距離遠點、稍微有些變形或方向沒有對正都可能造成識別失敗。一種典型的使用場景是:簽到發起者把小程式碼投影到大螢幕上,由於投影儀的解析度和電腦不一致,圖片可能產生變形。這種情況下,簽到者怎麼掃都無法識別。而以上所有這些,對於方形的二維碼,全都不是問題。
由於小程式碼的實現和識別原理沒有開放,我們也沒法採取圖片糾錯、還原等措施改善識別效果。
魚和熊掌,真的很難兼得。
4. 轉發小程式時預設帶引數。
關於轉發,在官方文件裡是這麼寫的。
在 Page 中定義 onShareAppMessage 函式,設定該頁面的轉發資訊。
-
只有定義了此事件處理函式,右上角選單才會顯示 “轉發” 按鈕
-
使用者點選轉發按鈕的時候會呼叫
於是,在實現中,我們定義了此方法,把方法體留空。然後紕漏出現了,當使用者簽到之後再分享,收到的人一點選分享的連結會進入簽到狀態。
查了很久,才發現原因是在分享的時候,把當前頁面載入時候的引數也給分享過去了,可是,onShareAppMessage函式裡面什麼都沒做啊。
看來,什麼都不做的話,它就會預設分享頁面載入時的引數。為了修復這個bug,就嘗試return一個object,並給這個object賦值path和title兩個引數。
終於解決了。
除了上面提到的之外,還有不少微小的bug,不一而足。雖然很快就解決了,相對開發源生程式碼而言,還是有些影響開發效率的。
過去的這一個月,有些累。
相對之前鋪天蓋地的小程式宣傳,其實它沒我們想象中的那麼好。當然,不得不承認,微信平臺的龐大使用者量和小程式無需下載的便利性,這是國內其他任何平臺無法做到的。
對於掃碼簽到工具這種輕量級的應用,開發微信小程式或許是比較好的選擇。
至於複雜的應用,是否要開發小程式版本,可能就得慎重了。
歡迎關注我微信公眾號,終端研發部,一個致力於技術研發的公眾號!