1. 程式人生 > >與後端或APP聯調時如何定位問題3——移動端對接

與後端或APP聯調時如何定位問題3——移動端對接

移動端聯調主要是三類問題:

  • 第一類問題,後端返回的資料是否符合要求
  • 第二類問題,JSBridge傳參或回撥錯誤
  • 第三類問題,相容性問題

三類問題中,除了第一類檢視服務端返回的資料是否符合要求可以在pc機上除錯,另外兩種都需要真機除錯,如何連線真機除錯呢?

非常重要:真機除錯的APP一定要用debug包,找你對接的APP開發人員打debug包給你,同樣,你部署到測試伺服器的JS、CSS不要開啟壓縮模式。

一、真機除錯

Android 真機除錯

桌面端的前端開發除錯非常簡單,因為有 Firebug、Chrome DevTools 等工具,直接右擊開啟就可以看到元素的 CSS,並且可以檢視各種資源、修改執行調錯 JS 等。而移動端瀏覽器顯然沒法帶有這些功能,於是可以用資料線連線裝置,然後用電腦上的 Chrome DevTools 來除錯移動裝置上的頁面。

第一步:開啟移動端開發者模式

  1. 在安卓4.0以後,為了防止手機使用者誤操作,系統預設開發者模式都是關閉的。設定→關於手機→連擊7次版本號,之後便會在手機設定中出現開發者模式。
  2. 進入設定→開發者選項→開啟開發者選項,開啟USB除錯
  3. 通過資料線連線手機和電腦,部分機型連線電腦時,會提示安裝驅動程式,安裝驅動程式
  4. 在手機上開啟任意一個網頁,只要是webview形式的網頁都是可以的

第二步:在電腦上除錯頁面

  1. 在電腦chrome瀏覽器位址列輸入:chrome://inspect/#devices 會看到如下情況(如果沒有顯示裝置資訊,則表示沒有連線好,可以拔插手機或關閉模式重開一下,但是部分華為的機型能看到裝置名,無法看到webview中開啟的網頁,原因不明。據測試最好用的除錯機是小米)

     
  2. 找到準備除錯的頁面,確保手機上該頁面也是處於啟用狀態,點選藍色的 inspect 連結,彈出一個新的視窗:


    注意 :第一次使用chrome://inspect/#devices時,開啟的頁面是空白,其實是chrome需要下載一些工具才能支援,這些工具國內網是無法訪問的,需要翻牆。但是隻有第一次才需要,以後有了快取就不要了,除非你的快取被清掉。
  3.  接下來就可以像在PC機一樣除錯頁面了。

 IOS 的真機除錯

首先你得有臺蘋果電腦,沒有蘋果電腦,那你可以跳過這一節了。

iPhone 等一系列蘋果裝置對前端還是相當友好的,效能夠好,Safari 瀏覽器也是不錯,型號固定統一,問題也比較好解決,蘋果公司也提供了一系列開發者工具,但有些手勢操作測試以及最真實的使用者體驗測試還是需要真機。Safari 除錯真機上的網頁也是非常簡單的。

  1. 首先需要在 iPhone 等裝置上設定一下 Safari 瀏覽器,開啟除錯功能。具體步驟:設定→Safari→高階→開啟”web檢查器“。
  2. 使用資料線連線電腦,Safari 預設是隱藏開發選項的,在第一次使用的時候,需要在 MAC上開啟Safari的開發選單:頂部選單欄“Safari”→偏好設定→高階→開啟”在選單欄中顯示“開發”選單

    開啟 Safari 開發功能
     
  3. 在iOS裝置上的Safari瀏覽器中開啟要除錯的頁面
  4. 切換到MAC的Safari,在頂部選單欄選擇“開發”→找到你的iOS裝置名稱→右邊二級選單選擇需要除錯的對應標籤頁,即可開始遠端除錯
    Safari 除錯 iOS 模擬器
     
  5. 在裝置上用 Safari 瀏覽器開啟需要除錯的頁面,之後在桌面版的 Safari 開發選項中即可看到進行除錯,跟用chrome devTools差不多。

微信 Webview 除錯

其它除錯工具

Fiddlerr抓包

Fiddler是一個抓包工具,可以將網路傳輸傳送與接受的資料包進行截獲、重發、編輯、轉存等操作,也可以用來檢測網路安全。個人認為更適合非前端人員抓包APP資料,而前端需要除錯的內容更多,不太建議採用這種模式除錯,更詳細的抓包教程:https://www.cnblogs.com/miantest/p/7289694.html

二、JSBridge聯調介面

JSBridge聯調介面,基本集中在檢查入參和回參是否符合要求。建議呼叫JSBridge的方法寫成Promise形式,統一封裝,如呼叫掃碼介面scanCode寫成統一的呼叫方式,可根據不同的平臺,如公司自研APP、公眾號、UC瀏覽器,根據執行的平臺呼叫對應的JSBridge,這樣頁面適配性更高,即可實現一套H5頁面實現多端底層介面呼叫,遷移成本也很小。

呼叫底層JSBridge實現思路大致如下:

// 呼叫方法
support.scanCode().then(function(result){
    // 執行掃碼後回撥
});


//底層呼叫方法
class support{
    constructor(){
        // 初始化執行環境,判斷當前平臺
        // 非同步引入平臺JSBridge,如微信公眾號
        let environmentName = JRE();// 判斷當前平臺
        switch (environmentName) {
            case ENVIRONMENT.WEIXIN_CLIENT:
                //非同步載入微信JSBridge
                ...
                weixinClient.init(weixinUrl).then(function(wxResult){
                    this.bridgeName = 'weixin';
                    this.bridge = wx;               
                }).catch(function(error){
                    console.log('微信公眾號調取失敗',error)
                });
                break;
           case ENVIRONMENT.APP_CLIENT:
                //非同步載入APPJSBridge
                ...
           default:
                //預設載入高德地圖
                ...
         }       
    }
    
    function scanCode(){
        return new Promise(function(resolve, reject){
            switch (this.bridgeName) {
                case ENVIRONMENT.WEIXIN_CLIENT:              
                     resolve(weixinClient.scanCode());
                case ENVIRONMENT.APP_CLIENT:
                     ...
                default:
                     resolve({
                         errorMessage:'更多內容請下載APP'
                     });
                } 
        })
    }    
}
    
class weixinClient{
    ...
    function scanCode() {// 呼叫微信掃碼介面
        return new Promise(function(resolve, reject) {            
            this.bridge.scanQRCode({
                needResult: 1,
                success: function(res) {
                    resolve(res);
                }
            });            
        });
    }
}

建議在呼叫JSBridge前打console輸出呼叫引數,拿到JSBridge中的返回,輸出返回引數,即可查出入參和回參是否正確,再找對應的app開發人員配合解決。

三、相容問題

移動端常見相容問題:

  • 安卓和IOS機型部分事件處理機制不一樣
  • 低端機型不支援ES6和fetch等語句

1、安卓與ios常見的不同事件處理機制
1)IOS中click事件延遲300ms響應
最簡單的處理方案:判斷當前執行裝置,如果是IOS用touchend替代click,然後preventDefault來阻止預設行為click

2)IOS中input鍵盤事件keyup、keydown、keypress支援不是很好
解決方案:
判斷當前執行裝置,如果是IOS用onInput事件處理操作

3)IOS中的DIV的click事件無效 
最簡便的處理方案:給​目標元素加一條樣式規則 cursor: pointer

2、低端機型不支援ES6和promise等語句
頁面在多數機型中有效,但在部分低端機型,如iphone6s、Iphone6中頁面無法渲染,出現白屏的情況,這個時候連線真機除錯,能看到iOS Safari 報錯
SyntaxError: Unexpected keyword 'const'. Const declarations are not supported in strict mode.
這就是低端機型不支援es6。
解決方案:
安裝以下外掛
babel-preset-es2015
babel-polyfill
es6-promise

四、如何判斷問題由webview引發

我前面戲稱這是一篇甩鍋教程,其實解決問題的思路都是先查己方問題,確定不是己方問題,再排查是哪一方引起的。

在工作中,有些時候APP端沒有處理好webview,也會引起H5頁面bug。H5頁面要執行在多平臺,如公眾號、安卓、IOS等,如何確定和歸納問題是屬於webview引起的,應該由和你配合的APP開發人員去處理呢:

  1. 首先,這類bug不是通用性的,如果一個bug在所有平臺中都暴露,這一定是你的問題。
  2. 這類bug是在特定的容器中暴露,在其它容器中正常,如安卓正常,IOS不正常。找到暴發問題的移動終端如IOS,查頁面在該移動端的瀏覽器能否正常執行,再看在app中是否能正常執行。
  3. 測測其它平臺,如PC端瀏覽器和安卓APP是否正常執行,採用排除法,確定只有IOS的有問題,基本就是IOS端APP的webview問題。

結語:

這個系列寫到這,基本結束了,有很多部分因手上沒有實際的專案可供參考就沒有整理進來,如支付寶的JSBridge除錯、後端服務常見報錯,會在以後的工作中慢慢完善進來。基本上都是一些工作中的總結,如有錯漏,歡迎交流指點。

與後端或APP聯調時如何定位問題

參考: