游戲中有一個收集玩家問題反饋的網頁,很早之前就有同事反映說android在游戲無法上傳附件,在瀏覽器中是可以正常使用的。最近能騰出手來的時候,就仔細看了一下這個問題,發現很里藏着不少問題,這里一一記錄下來,希望能其它人有用,因為很多問題跟網上反映出來可能有點不太一樣。
既然是網頁,而且只在游戲中才出現,那第一步你要先會使用Fiddler來攔截請求,定位出問題的代碼在哪里。你可以參考這篇文章,抓包已經講的已經非常詳細了,Step By Step Fiddler (四) 實現手機的抓包
在Fiddler中找到請求的網頁鏈接,點擊查看后將響應的文本使用文本工具(我是使用的EditPlus)保存,然后修改它,再用Fiddler的AutoResponder進行請求攔截,就能進行動態調試了
不過開了Fiddler中的HTTPS請求后,使用 Chrome訪問HTTPS鏈接時都會提示此網站身份未認證,手機安裝證書之后,我的設備就必須設定手勢密碼了,設置之后還不能取消手勢必須先刪除證書才能恢復以前的無手勢訪問。
而且開啟了代理之后,360的SDK點擊登錄時提示“無法連接到網絡,請檢測您的手機網絡設置”,其實是可以上網的,只是這個提示誤導性比較強,先不使用代理登錄SDK,進入游戲后再開啟代理即可。
問題一:部分Android設備無法輸入字母、數字,但是可以輸入中文,返回按鈕點擊無效(網頁不會后退)
網上很多,包括stackflow也會有很多結果,我試了很多,沒有一個能解決我所遇到的問題,還有人說是一個bug,最后我是在一篇文章中猛然發現可能我目前使用的代碼寫的有問題(離職人員留下的),這篇文章鏈接在這里:
老的代碼,紅色標注的地方是直接返回true,改成super.onKeyDown(keyCode, event)就正常了
問題二:Android設備點擊網頁的input[file]控件無效的問題
我是通過這篇文章找到解決方案的:Android WebView上傳文件
搜索出來的答案,我記不得那個網址了,是在stackoverflow上的,但是它的那個參數有點問題,上面三個函數中好像有一個函數的參數它寫的是“ValueCallback”沒有后面的<Uri>,這個其實是有問題的,統一為ValueCallback<Uri> uploadMsg,只是它后面參數長度的問題
問題三:上傳附件可能遇到失敗的情況,上傳成功時調用history.go(-1)不起作用
一個選擇問題類型頁面A,一個問題詳情表單頁B。通過webView的loadUrl方法調用時,傳入的url有很多。比如:當前游戲的角色、服務器啊、游戲產品標識、設備mac等很長的一串信息,點擊表單頁B時,又多帶上了一個type。
在頁面B中,用戶點擊一個A元素的超鏈接(href=”javascript:history.go(-1);”)它能正常返回,但是在點擊提交問題按鈕之后,ajax接口成功后用js調用history.go(-1)頁面變成空白了,居然空白了!!!
網上搜索了很多方法,也嘗試了很多,結果都失敗了,嘗試的幾種方案:
Android : Detect history.back() in WebView
Why is javascript:history.go(-1); not working on mobile devices?
WebView back history without redirects
首先排除Java中設置的問題,因為JavaScript是起作用的,證明mWebView.getSettings().setJavaScriptEnabled(true);是生效了的。
然后我嘗試直接本地修改代碼,頁面載入完成時調用history.go(-1)是能正常工作的。原本我嘗試使用location.href = document.referrer,結果發現獲取不到referrer,關於document.referrer可以參考這篇文章>>
然后我就在想要不要動態創建form表單,然后通過document.location.search.substr(1),獲取參數列表,再將所有參數填寫input中然后提交表單就頁面跳轉呢?但又要寫一些代碼,所以又想先再找找有沒有其它辦法…
之后我仔細查看了http的上傳請求,嘗試在ajax.ajaxFileUpload的success方法中延時調用history.go(-1),發現界面錯位了。這時候我突然會不會提交表單時它里面動態創建了一個iframe導致調用history.go(-1)失效了呢?
文件上傳ajaxFileUpload插件使用的是Content-Disposition來實現的,關於Content-Disposition的詳情可以參數這篇文章:正確處理下載文件時HTTP頭的編碼問題(Content-Disposition)
源碼我就沒仔細看過了,然后我換了一種寫法:history.go(1 - history.length);就搞定了,頁面也能正常返回了
圖片上傳失敗的問題,需要與后台一起聯調,比較費時,也不是必定會遇到。也比較麻煩,所以暫時就擱置了,感覺是編碼問題造成的,有待進一步確認…
希望以上三個問題能給遇到類似問題的人一些幫助吧,通過搜索來處理完全未知的問題時,確實需要細心和耐心,特別是在時間比較緊張的情況下,一定不能急躁,一躁思路就可能亂了