今早一去公司,被組長遠程發過來一個Bug,聽說是用戶反饋的一個iOS的問題,在咱們的業務中,有一個有關圖片上傳的問題。咱們的業務代碼是在本身的客戶端、微信、釘釘、企業微信四個地方跑的同一套代碼。api
Bug的具體描述是企業微信用戶在使用上傳圖片時,無反應。可是在安卓下運行正常。在其餘平臺運行正常。
找測試復現該問題時,發如今安卓平臺下一切正常,可是在iOS端測試發現,在iOS8上運行正常,在iOS9往上的系統中,會彈出一個報錯瀏覽器
a.oldWXObj.invoke not a function
wx.chooseImage
的地方,而後console
出相關的opts
參數wx.chooseImage(opts);//這是咱們本身的調用 wx.chooseImage({ count: 1, // 默認9 sizeType: ['original', 'compressed'], // 能夠指定是原圖仍是壓縮圖,默認兩者都有 sourceType: ['album', 'camera'], // 能夠指定來源是相冊仍是相機,默認兩者都有 defaultCameraMode: "batch", //表示進入拍照界面的默認模式,目前有normal與batch兩種選擇,normal表示普通單拍模式,batch表示連拍模式,不傳該參數則爲normal模式。(注:用戶進入拍照界面仍然可自由切換兩種模式) success: function (res) { var localIds = res.localIds; // 返回選定照片的本地ID列表, // andriod中localId能夠做爲img標籤的src屬性顯示圖片; // 而在IOS中需經過上面的接口getLocalImgData獲取圖片base64數據,從而用於img標籤的顯示 } });
發現opts
沒有問題,而後開始查看企業微信的開發文檔,發現了這樣一段話微信
此接口在企業微信2.3及之後版本支持相機連拍(當sourceType是camera時)
參數defaultCameraMode僅在企業微信2.4.20及之後版本支持
從2.4.6版本開始,IOS版企業微信瀏覽器將升級爲WkWebView,因其不支持原有的直接經過localid做爲img標籤的src屬性來顯示圖片的方式。開發者須要採用經過getLocalImgData來獲取localid對應圖片的base64數據。
看到了iOS,看到了有關圖片上傳,便覺得是這裏的問題,而後便開始對localid
進行修改,改着改着發現,不對啊,是調用的時候就報錯了,並非由於在callback
裏面的問題啊。app
wx.chooseImage
進行alert
,發現這個函數是存在的,可是發現仍是有問題,代碼大概是這樣的a.oldWXObj.invoke("chooseImage",params,callback)
而後我一直在想這個a.oldWXObj
是什麼東東,看源碼,並無找到這個東西,而後查看咱們的sdk版本是1.0.0,最新的sdk版本是1.2.0。覺得是由於sdk版本的緣由,而後把項目中的sdk升級,問題仍是存在,看來不是sdk的緣由,繼續探索。函數
wx
的sdk,而後我把相關的wx.config
給 複製 了過去,發現圖片上傳仍是有問題,而後考慮是否是免登沒有經過呢? 試着調用其餘的方法,發現獲取當前位置、掃描二維碼、開始錄音這三個方法均可以成功調用,肯定免登是經過了的,不是免登的問題。Charles
開始抓包查看第三方的實現,這一部分纔是寫這個 踩坑記錄的重點 ,主要是看這個調試的過程,最開始用Mac自帶的Safari嘗試調試,發現企業微信並無把調試開放出來,只能經過抓包來一點點嘗試了,OK,在簡書上搜索Charles抓包,按照步驟,發現第三方是https
,而後再萬能的簡書,抓包https
,一切完成後。發現第三方也是調用的wx.chooseImage
,那麼說明咱們調用的業務代碼沒問題啊,而後經過wx.config
粘貼過來、貼過來、過來、來......咦,這個config有一點不同誒!!!//咱們本身的配置 wx.config({ debug: false, appId: '', // 必填,企業微信的corpID timestamp: , // 必填,生成簽名的時間戳 nonceStr: '', // 必填,生成簽名的隨機串 signature: '',// 必填,簽名,見附錄1 jsApiList: [] // 必填,須要使用的JS接口列表,全部JS接口列表見附錄2 }); //文檔標準的配置 wx.config({ beta: true,// 必須這麼寫,不然wx.invoke調用形式的jsapi會有問題 debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。 appId: '', // 必填,企業微信的corpID timestamp: , // 必填,生成簽名的時間戳 nonceStr: '', // 必填,生成簽名的隨機串 signature: '',// 必填,簽名,見附錄1 jsApiList: [] // 必填,須要使用的JS接口列表,全部JS接口列表見附錄2 });
忽然發現咱們的代碼配置裏面,沒有beta
這個配置,加上,試一下,😌😌😌,心情非常複雜,代碼此次終於正常調起來了。
OK,到這裏,問題解決。測試
此次不是踩坑的大坑,總結出3點:spa