移動端H5混合開發設置復盤與總結

来源:https://www.cnblogs.com/buoge/archive/2018/09/22/9691573.html
-Advertisement-
Play Games

此篇接上一篇: 移動端H5混合開發,Touch觸控,拖拽,長按, 滑屏 實現方案 https://www.cnblogs.com/buoge/p/9346699.html app 場布設置已經上線了,用戶可以通過手機端嵌入的h5網頁進行場布設置,原來只能在pc端瀏覽器,還得帶上個筆記本電腦很是不方便 ...


此篇接上一篇:

移動端H5混合開發,Touch觸控,拖拽,長按, 滑屏 實現方案
https://www.cnblogs.com/buoge/p/9346699.html

app 場布設置已經上線了,用戶可以通過手機端嵌入的h5網頁進行場布設置,原來只能在pc端瀏覽器,還得帶上個筆記本電腦很是不方便,這個功能很好的解決了目前設置不順暢的問題。上線後得到大家的認可,提升了業務效率,這一個多月的辛苦開發還是值得的,接下來是對自己這一段時間開發過程的一個總結。

整體開發基於H5+Css3+Jquery,前端這個組合略顯過時,不過我就這個用的熟悉,先做完再說

前後端開發混合開發

功能前端和後端是一起開發的,好處是自己靈活定製不需要溝通成本,但是缺點也有前後端切換需要切換大腦思維的上下文,一會再寫JS一會回去寫Java不利於思維發揮和深入思考

後端開發過程中還好有現成的方法可以調用,所以並沒有耗費太多時間,大部分時間在前端開發上,假如後端也要做那才真是入水兩腿泥

總結:後續在有類似開發,不要大包大欖,專註一端去做,這樣高效省心,專註前端和專註後臺分工開發速度快了,效率高了,遇到難題有時間和情景去深入思考,所以儘可能把任務分開下

android iOS 與h5 互相調用的問題

H5調用相機圖片方向有問題:拍照是豎屏,展示成橫屏,上傳上去展示也是橫屏
這兩個帖子講的很清楚,我就不展開了,思路就是利用 exif.js 判斷方向,然後用CanvasApi從新生成base64
格式的圖片

  • H5拍照應用開發經歷的那些坑兒
    http://www.yuuuuc.me/problems-with-html5-file-api-while-uploading-images/

  • 利用exif.js解決ios手機上傳豎拍照片旋轉90度問題
    https://blog.csdn.net/linlzk/article/details/48652635

源碼放在了這裡:
https://github.com/buoge/gist/blob/master/FrontEnd/FixH5Oritention.html

相冊調用去攝像頭,圖片大小限制

  • Android 有api去除攝像頭相機拍照的選項

  • iOS 沒法直接去除,只能通過環境判斷,動態觸發自定義函數,直接跳轉到相冊,選擇完成後返回base64數據
    客戶端直接使用base64類型的數據判斷文件大小,展示,最終上傳到服務端也是base64方式的

        // 前端    
        function selectDeviceImg(){
            console.log('selectDeviceImg');
            if (window.webkit) { // iOS
                window.webkit.messageHandlers.Photo.postMessage(null);
            } else { // Android and others
                $("#file_head").trigger("click");
            }
        }
        
        // 服務端是這樣子的
        @ResponseBody
        @RequestMapping(value = "/upload", method = RequestMethod.POST)
        public Result uploadImage(@RequestParam(required = true) String imageBase64,
                                  @RequestParam(required = true) String projectId) {
                                  ...
                                }

h5與native交互方式

  • Android 通過WebView對象自定義的AndroidObjec註入到頁面,頁面調用AndroidObjec
  • iOS 實現機制類似,也是在UIWebView裡面創建了一個對象,頁面上直接給這個對象發送消息
  // 假如在iOS中 
  if (window.webkit) {
       // iOS post message 的方式
       window.webkit.messageHandlers.Signature.postMessage(null);
    } else if (typeof AndroidJSObj != "undefined") { 
        // AndroidObjec 方式  
        AndroidJSObj.getSignature();
    }   
  • URL攔截的實現思路:Android和iOS的webview都在監聽url的調轉事件,攔截到後,不做跳轉,
    直接執行本地的邏輯,在實現語音播放的時候用到這個技巧,這個技巧本來是做頁面跳轉時使用的,
    客戶端攔截到url跳轉到對應的 Controller或是Activity,如果是瀏覽器h5直接跳轉到對應的html頁面

  • 另外一種WebViewJavascriptBridge的庫: https://github.com/marcuswestin/WebViewJavascriptBridge 1萬多個start經過實戰考研,後續項目中可以使用這個提升效率

瀏覽器返回問題:history

頁面中有一個功能就是上傳圖片,這個功能會覆蓋現有頁面的背景,上傳頁面是一個html,完事後直接location.href跳轉到了另一個,現在整個頁面嵌入在app裡面有返回按鈕,但現在不想讓頁面返回到上傳頁面,
試了 location.replace 也不管用,這個方法在移動端不好用,而且還存在另一個問題就是在iOS需要點擊兩次返回按鈕才能退出webview。

這個功能上也調試了好久,最後也是讓客戶端處理了,監聽頁面返回在指定頁面點擊返回鍵直接推出

總結:嵌套h5的時候儘量使用單頁面的佈局方式,方便管理,或是用react,vue這種都有對應的路由插件,這裡也暴露了前端技能二把刀,遇到這種叼酸的bug就搞不定

屏幕像素與真實像素轉換

之前一個帖子寫過,背景是充滿屏幕的,場布上是有點位的,長按可以添加點位,點位的定位演算法就比較重要:

核心就是:計算點位在原始圖片的left,top位置,在不同解析度上等比展示

設備解析度: 300600
圖片解析度: 600
1200

點在屏幕上的位置是(left,top):(30,60)
對應到圖片上原始像素就是(left,top):(60,120)

在另外一個設備解析度是: 200*400的話
圖片上原始像素:(60,120),存在資料庫,前端展示會返回
在此設備上對應的位置就是:(20,40)

我這裡為了方便演繹參數值經過調整,大概意思就是這樣

網路異常的處理,loading...,成功失敗

所有Ajax請求剛開始的時候沒有使用一個統一的異常處理,請求開始加loading...,出錯或網路異常,取消loading,提示業務異常或網路異常,這塊應該提早規劃,再有類似需求一定註意

網頁認證授權的問題

ajax api 的認證方式是目前考慮到3種:

  • 自己按照一定規則md5計算出來的,根據時間戳算一個不可逆的簽名,客戶端算好,調用h5傳給頁面,發送ajax時放在header裡面(目前是這種)

  • 我之前實現過一種思路是使用md5和base64一起算好之後放在cookie裡面,頁面發送的時候帶上cookie,計算過程任然在客戶端,客戶端計算完成調用h5的js函數,然後在發起ajax請求,由伺服器驗證,驗證通過返回json

  • OAuth2 標準不解釋了,這個服務暫時還沒有自己搭建過倒是用過別人的,後續也會單獨學習這塊把這個技能點補充上來

關於移動前端開發效率

Jquery 為主的開發方式還可以在優化
Jquery 效率比起 mvvm 的vue,react 代碼效率要低,但是比較簡單,目前代碼已經接近2000行功能再要疊加肯定是要混亂起來,改不好改,修不好修,除了我每人敢動

css3 與前端工程實踐的積累不足
在瀏覽器返回,手機相冊選取,樣式相容性展示顯示出很多力不從心的感覺,只能是大家一起協作解決,或是workaround 用曲線救國的方式實現,這塊其實沒辦法,主力沒有在前端,只能遇到問題多總結,多去實踐才行

移動端觸控庫選擇

  • hammer.js 做手勢交互和點擊,長按的操作簡直太棒,這個庫1024!
  • 其實回過頭來講,js開發庫不該用jquery應該用 zepto.js,它本身是為移動端而生,jquery 在移動端點擊事件處理有很多問題,好些時候不能響應,只能用touchstart,touchend來觸發,但是使用touch事件會發生很多誤操作和無觸碰,體驗不是很好

UI 框架和樣式庫的選擇

前面說過css不是很溜,不希望自己花時間在前端樣式上,所以尋找一個合適的UI庫是尤為重要的,這裡我選擇的是mui https://github.com/dcloudio/mui/
Bootstrap4 一些基礎樣式
iconfont 免費的icon

** 模態彈層layui **
使用的 layer.js的移動版非常好用,解決了移動端模態彈層的問題,推薦大家使用:
https://layer.layui.com/mobile/

tmpl
前端模板老組件了,雖然比起mvvm遜色不少,好在夠用

滾動穿透

  • 這裡有一些詳細的解釋,其實在模態彈窗那裡也沒有解決滑動穿透的問題
    https://uedsky.com/2016-06/mobile-modal-scroll/

** 點擊300毫秒延遲問題 **
在iOS端尤為強烈,這裡放兩個鏈接解釋下,緣由,解決方案很多自行搜索

* 為啥會有300毫秒延遲?
 https://thx.github.io/mobile/300ms-click-delay
 https://stackoverflow.com/questions/12238587/eliminate-300ms-delay-on-click-events-in-mobile-safari

動態播放音頻的問題

H5頁面動態播放音頻,在iOS一直沒有弄好,可能是頁面動態添加音視頻的緣故,動態播放一直有問題,從測試結果來看是我們自己的音頻文件伺服器不穩定導致的,無法動態預覽mp3語音文件,只能通過調用原生app的方法播放聲音

  • 但音頻播放問題
    https://www.ibm.com/developerworks/cn/web/wa-ioshtml5/index.html

  • 下麵是幾個播放音頻比較好的庫個人十分推薦howler.js後續有類似需求也會直接使用這個庫
    https://github.com/goldfire/howler.js#examples
    https://github.com/mediaelement/mediaelement
    https://github.com/CreateJS/SoundJS

上線時間點

本來說是8月15號上線,延期到8月底上線,但是由於我弄了兩天發佈腳本,研究了一天的部署環境,沒有儘早提測,但是感覺主要是沒有溝通到位,我從其他處得知這次功能要在月底一次發版,我就沒在意,沒有繼續推進這個事,又在打磨一些細節,一個是調試音視頻播放,一個是調試window.hostory介面嘗試解決頁面返回的問題,最後沒解決和客戶端協商解決,因此耽誤了時間,下次在商談好時間節點後要儘量按照時間節點來進行活動安排,時間點關鍵點要多溝通,上還是不能上,還是延期上都要有個明確的結論。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 剛接觸數據倉庫是在我的第一份實習工作——數據中心數據管理系統開發,它是一個B/S架構的應用,與一般的項目不同的是,系統是以數據倉庫來進行數據存取的,這是我第一次聽說數倉這個詞,感覺它龐大而且神秘,不知道從何入手,對數據倉庫有一種敬畏之心,後來經過慢慢的學習和使用,發現其實它在應用開發中的使用方法跟傳... ...
  • 本系列博客主要介紹MySQL資料庫的binlog日誌的相關內容,這個系列的主題包括: MySQLbinlog日誌01binlog日誌基本操作 MySQLbinlog日誌02binlog日誌用於數據恢復 MySQLbinlog日誌03binlog日誌位元組碼解析 MySQLbinlog日誌04binlo ...
  • 本系列博客主要介紹MySQL資料庫的binlog日誌的相關內容,這個系列的主題包括: MySQLbinlog日誌01binlog日誌基本操作 MySQLbinlog日誌02binlog日誌用於數據恢復 MySQLbinlog日誌03binlog日誌位元組碼解析 MySQLbinlog日誌04binlo ...
  • 1.前言 總是聊併發的話題,聊到大家都免疫了,所以這次串講下個話題——資料庫(歡迎糾正補充) 看完問自己一個問題來自我檢測: NoSQL我到底該怎麼選? 1.1.分類 主要有這麼三大類:[再老的資料庫就不說了] 1.傳統資料庫(SQL): 關係資料庫:SQLite、MySQL、SQLServer.. ...
  • USE MASTER GO DECLARE @dbname SYSNAME SET @dbname = 'databasename' --這個是要刪除的資料庫庫名 DECLARE @s NVARCHAR(1000) DECLARE tb CURSOR LOCAL FOR SELECT s = 'ki ...
  • 很多人在安裝orcl資料庫時,出現很多報錯,我也不例外,因上次資料庫出現問題,無法修複,只能從新安裝,無奈的是,安裝時報啟動服務出現錯誤,找不到OracleMTSRecoveryService錯MMP,心想又是咋咯回事,第一反應肯定就是沒卸載乾凈。下麵時處理辦法:不是所有報錯通用辦法。 打開註冊表看 ...
  • 在網頁中,實現動畫無外乎兩種方式。1. CSS3 方式,也就是利用瀏覽器對CSS3 的原生支持實現動畫;2. 腳本方式,通過間隔一段時間用JavaScript 來修改頁面元素樣式來實現動畫。接下來我們就分別介紹這兩種方式的原理,讓大家先對這兩種方式有一個直觀認識,瞭解各自的優缺點。 CSS3 的方式 ...
  • 在一些網站上可以經常看到有一些圖片進行持續不斷的滾動,這個效果可以通過css的動畫效果來實現。具體效果如下 主要原理是通過動畫向左移動。 首先給出兩組一樣的圖片(同一行上),讓整體圖片向左移動一組圖片的長度, 這樣在動畫結束時會迅速還原到原來位置,而此時正好與第二組圖片交替,看起來就像是一組圖片在不 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...