ioswebview圖片上傳
㈠ 上傳圖片並預覽的網頁代碼在瀏覽器可以,但是在android的webview上不行
出現這個問題大多都是因為路徑不對
把你的圖片放進你要上傳的那個文件裡面,在從新增加這個張圖片就行了
上傳到空間有時會丟失銜接或圖片,你可以把丟失的那個HTML文件在空間刪了在從新上傳就可以了,記得把圖片也一同上傳
檢查一下路徑
你建站的文件在E:\1,那麼你的圖片途徑必須是E:\1\***.gif或***.JPGE等
㈡ H5調用本地相冊/相機上傳圖片
在開發中有時候會用到H5調用本地圖片粗伏或者相機,像第三方的實名認證,在線客服等蔽凳檔等都需要上宏亂傳圖片。H5中只需要通過 <input> 調用即可,ios是可以的實現的,不需要自己處理,除非客戶端壓縮圖片,但是Android中需要自己處理,比較坑,本文記錄H5調用本地圖片或者相機的實現過程以及遇到的問題。
H5主要是通過 input 標簽來獲取圖片
通過 WebView 載入 h5 頁面,監聽 WebView 對應的方法,實現自己的邏輯。
當點擊 input 標簽的時候會調用 WebChromeClient 的 onShowFileChooser() 方法(5.0+)或者 openFileChooser() 方法(3.0+)在改方法中處理自己邏輯,這里是彈出一個原生的選擇框,選擇從相冊還是拍照獲取圖片。
拍照和打開相冊功能封裝到了 PhotoUtils 工具類中了。
file_paths.xml
從相冊中選擇
onActivityResult() 方法處理
這里使用 Luban 壓縮以後再上傳的
㈢ 圖片拍照上傳解決方案
微信內置瀏覽器,和一些主流瀏覽器支持調用攝像頭,但也有很多不支持調用攝像頭,僅支持相冊。
如果是WebView中,就需要客戶端支持了,android和ios的許可權也是問題。
formData 簡介
簡單的說就是:通過formData,我們可以用ajax方式來發送表單數據;以前上傳圖片是需要用form表單提交的。
我們知道瀏覽器默認顯示的文件上傳按鈕是很醜的,通常UI都會對上傳按鈕進行設計。有以下幾種方案來寫樣式。
弊端:
坑
通過ref獲取上傳按鈕。
ref方式
event.target方式
坑:
FileReader 簡介
通過 readAsDataURL() ,在讀取操作完成後,result屬性中將包含一個data:URL格式的字元串以表示所讀取文件的內容。
base64字元串
兼容性
我在safari中測試,發現是支持的。
URL.createObjectURL 簡介
通過URL.createObjectURL()創建一個URL對象,這個URL對象表示指定的file對象或Blob對象。
兼容性
張鑫旭的文章: HTML5 file API加canvas實現圖片前端JS壓縮並上傳
張鑫旭的文章: 理解DOMString、Document、FormData、Blob、File、ArrayBuffer數據類型
使用Camera API
張鑫旭
㈣ iOS WKWebView與H5交互,JS調OC傳值、OC調JS傳值、進度條載入等(干貨滿滿)
WKWebView是蘋果在iOS 8之後推出的框架,關於它比webview的優勢這里就不講了。主要說一下與JS交互的問題,其實WKWebView已經內置了JS與OC的互調、傳值等方法,使用起來也非常方便,下面就來細細的探討一下以及自己遇到過的坑...
首先來看下WKWebView的初始化相關設置:
一、導入相關頭文件、設置相關代理和屬性
二、WKWebView初始化
注意:
樓主遇到的第一個坑:如果JS給OC傳值為空,必須寫成: postMessage(null),如果什麼都不寫,方法是調不通的。
1、在viewWillAppear中配置, addScriptMessageHandler name: "這里就是JS的方法,方法名必須統一"
樓主遇到的第二個坑:配置完後必須在 viewWillDisappear 中 remove,否則會造成循環引用,導致crash
2、實現 WKScriptMessageHandler 協議
以上就是JS調OC,JS向OC傳值...
樓主這里舉三個例子:
1: webview載入完成前,將用戶信息傳給js
2: webview載入完成,將相關信息傳給js
3: 調用相冊或相機時,將選擇的圖片請求後台介面,後台返回圖片地址,將該地址回傳給H5,H5將圖片顯示到頁面上
第一個例子: webView載入完成前傳值
因為 evaluateJavaScript 方法默認是在載入完成後調用,所以直接在頁面開始載入中調用是傳不過去的,這個時候怎麼辦呢? 我們可以讓js端寫兩個方法, 第一個方法是js端開始向oc端發起信息需求的方法名,當oc端收到該方法名的時候,就去調用js端第二個獲取傳值的方法,把信息傳遞過去。
先讓JS端寫個方法調OC,OC實現方法後在這個方法內部給JS傳值
在WKScriptMessageHandler協議中,實現該方法,然後在方法內部給JS傳值
注意: 以上就是在Webview載入完成前傳值,如果列印沒報錯,證明傳參成功,如果web端沒收到,讓他把獲取到值的方法寫到頁面中即可。
第二個例子: webView載入完成,傳值給js
第三個例子: 傳圖片地址給js,js拿到後顯示圖片
1:拍照事件
1.1:將拍的照片請求上傳圖片介面,成功返回圖片地址,並傳值給H5
2: 從相冊中選取照片
2.2:將相冊中選取的照片請求上傳圖片介面,成功返回圖片地址,並傳值給H5
注意: getPhotoCallback 即為調用的方法名,後面傳值格式必須為: ('') , 這里遇到了第三個坑, 如果方法名寫為: 名稱.名稱 (例如:hello. getPhotoCallback),這種是調不通的,可以寫成hello_getPhotoCallback的形式,一般的話最好還是定義一個完整的名稱。 剛開始這個問題卡了比較久,一直調不通,在此記錄一下.....
在 viewDidLoad 中注冊進度條監聽
開始載入網頁
載入完成
載入失敗
頁面跳轉失敗
progressView懶載入
添加監聽觀察者
最後別忘記 removeObserver
Demo地址: https://github.com/zhwIdea/WKWebViewAndJS