起因
今早一去公司,被組長(zhǎng)遠(yuǎn)程發(fā)過(guò)來(lái)一個(gè)Bug,據(jù)說(shuō)是用戶反饋的一個(gè)iOS的問(wèn)題,在我們的業(yè)務(wù)中,有一個(gè)有關(guān)圖片上傳的問(wèn)題。我們的業(yè)務(wù)代碼是在自己的客戶端、微信、釘釘、企業(yè)微信四個(gè)地方跑的同一套代碼。
Bug描述
Bug的具體描述是企業(yè)微信用戶在使用上傳圖片時(shí),無(wú)反應(yīng)。但是在安卓下運(yùn)行正常。在其他平臺(tái)運(yùn)行正常。
找測(cè)試復(fù)現(xiàn)該問(wèn)題時(shí),發(fā)現(xiàn)在安卓平臺(tái)下一切正常,但是在iOS端測(cè)試發(fā)現(xiàn),在iOS8上運(yùn)行正常,在iOS9往上的系統(tǒng)中,會(huì)彈出一個(gè)報(bào)錯(cuò)
a.oldWXObj.invoke not a function
解決過(guò)程
- 因?yàn)槭窃趇OS端有問(wèn)題,所以我初步懷疑是因?yàn)槲覀冏约簩?duì)企業(yè)微信的相關(guān)SDK進(jìn)行二次封裝的時(shí)候出現(xiàn)了問(wèn)題,所以我在自己的業(yè)務(wù)代碼中找到了調(diào)用
wx.chooseImage的地方,然后console出相關(guān)的opts參數(shù)
wx.chooseImage(opts);//這是我們自己的調(diào)用
wx.chooseImage({
count: 1, // 默認(rèn)9
sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認(rèn)二者都有
sourceType: ['album', 'camera'], // 可以指定來(lái)源是相冊(cè)還是相機(jī),默認(rèn)二者都有
defaultCameraMode: "batch", //表示進(jìn)入拍照界面的默認(rèn)模式,目前有normal與batch兩種選擇,normal表示普通單拍模式,batch表示連拍模式,不傳該參數(shù)則為normal模式。(注:用戶進(jìn)入拍照界面仍然可自由切換兩種模式)
success: function (res) {
var localIds = res.localIds; // 返回選定照片的本地ID列表,
// andriod中l(wèi)ocalId可以作為img標(biāo)簽的src屬性顯示圖片;
// 而在IOS中需通過(guò)上面的接口getLocalImgData獲取圖片base64數(shù)據(jù),從而用于img標(biāo)簽的顯示
}
});
發(fā)現(xiàn)opts沒(méi)有問(wèn)題,然后開(kāi)始查看企業(yè)微信的開(kāi)發(fā)文檔,發(fā)現(xiàn)了這樣一段話
此接口在企業(yè)微信2.3及以后版本支持相機(jī)連拍(當(dāng)sourceType是camera時(shí))
參數(shù)defaultCameraMode僅在企業(yè)微信2.4.20及以后版本支持
從2.4.6版本開(kāi)始,IOS版企業(yè)微信瀏覽器將升級(jí)為WkWebView,因其不支持原有的直接通過(guò)localid作為img標(biāo)簽的src屬性來(lái)顯示圖片的方式。開(kāi)發(fā)者需要采用通過(guò)getLocalImgData來(lái)獲取localid對(duì)應(yīng)圖片的base64數(shù)據(jù)。
看到了iOS,看到了有關(guān)圖片上傳,便以為是這里的問(wèn)題,然后便開(kāi)始對(duì)localid進(jìn)行修改,改著改著發(fā)現(xiàn),不對(duì)啊,是調(diào)用的時(shí)候就報(bào)錯(cuò)了,并不是因?yàn)樵?code>callback里面的問(wèn)題啊。
- 然后把
wx.chooseImage進(jìn)行alert,發(fā)現(xiàn)這個(gè)函數(shù)是存在的,但是發(fā)現(xiàn)還是有問(wèn)題,代碼大概是這樣的
a.oldWXObj.invoke("chooseImage",params,callback)
然后我一直在想這個(gè)a.oldWXObj是什么東東,看源碼,并沒(méi)有找到這個(gè)東西,然后查看我們的sdk版本是1.0.0,最新的sdk版本是1.2.0。以為是因?yàn)閟dk版本的原因,然后把項(xiàng)目中的sdk升級(jí),問(wèn)題還是存在,看來(lái)不是sdk的原因,繼續(xù)探索。
后來(lái)沒(méi)有思路,去請(qǐng)教大佬,大佬給了個(gè)思路,在企業(yè)微信中開(kāi)啟一個(gè)別的第三方的業(yè)務(wù),看看他們的圖片上傳是否也存在相同的問(wèn)題,OK,照著這個(gè)思路往下繼續(xù)。我去,第三方的圖片上傳是沒(méi)有問(wèn)題的,OK,那么肯定是我們自己的業(yè)務(wù)代碼的問(wèn)題,然后把業(yè)務(wù)剝離出來(lái),在新建兩個(gè)文件,一個(gè)采用我們自己封裝的sdk,一個(gè)不用自己封裝過(guò)后的sdk,直接調(diào)用
wx的sdk,然后我把相關(guān)的wx.config給 復(fù)制 了過(guò)去,發(fā)現(xiàn)圖片上傳還是有問(wèn)題,然后考慮是不是免登沒(méi)有通過(guò)呢? 試著調(diào)用其他的方法,發(fā)現(xiàn)獲取當(dāng)前位置、掃描二維碼、開(kāi)始錄音這三個(gè)方法都可以成功調(diào)用,確定免登是通過(guò)了的,不是免登的問(wèn)題。-
大佬說(shuō)換個(gè)思路,用
Charles開(kāi)始抓包查看第三方的實(shí)現(xiàn),這一部分才是寫(xiě)這個(gè) 踩坑記錄的重點(diǎn) ,主要是看這個(gè)調(diào)試的過(guò)程,最開(kāi)始用Mac自帶的Safari嘗試調(diào)試,發(fā)現(xiàn)企業(yè)微信并沒(méi)有把調(diào)試開(kāi)放出來(lái),只能通過(guò)抓包來(lái)一點(diǎn)點(diǎn)嘗試了,OK,在簡(jiǎn)書(shū)上搜索Charles抓包,按照步驟,發(fā)現(xiàn)第三方是https,然后再萬(wàn)能的簡(jiǎn)書(shū),抓包https,一切完成后。發(fā)現(xiàn)第三方也是調(diào)用的wx.chooseImage,那么說(shuō)明我們調(diào)用的業(yè)務(wù)代碼沒(méi)問(wèn)題啊,然后通過(guò)這種方式,用本地文件代替線上的文件進(jìn)行調(diào)試,把我們的相關(guān)業(yè)務(wù)代碼代替第三方的相關(guān)代碼,發(fā)現(xiàn)我們的代碼在第三方的應(yīng)用里面是正常運(yùn)行的。我去!??!這就奇怪了呀,這時(shí),一天的時(shí)間不知不覺(jué)都過(guò)去了,還沒(méi)有解決問(wèn)題,心中真的是,一言難盡?。?!1.png 最后,開(kāi)始從頭梳理代碼,從第三方最開(kāi)始調(diào)用企業(yè)微信的sdk開(kāi)始一點(diǎn)點(diǎn)對(duì)比,把我們的相關(guān)信息跑在第三方平臺(tái)里,來(lái),把
wx.config粘貼過(guò)來(lái)、貼過(guò)來(lái)、過(guò)來(lái)、來(lái)......咦,這個(gè)config有一點(diǎn)不一樣誒?。。?/p>
//我們自己的配置
wx.config({
debug: false,
appId: '', // 必填,企業(yè)微信的corpID
timestamp: , // 必填,生成簽名的時(shí)間戳
nonceStr: '', // 必填,生成簽名的隨機(jī)串
signature: '',// 必填,簽名,見(jiàn)附錄1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見(jiàn)附錄2
});
//文檔標(biāo)準(zhǔn)的配置
wx.config({
beta: true,// 必須這么寫(xiě),否則wx.invoke調(diào)用形式的jsapi會(huì)有問(wèn)題
debug: true, // 開(kāi)啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開(kāi),參數(shù)信息會(huì)通過(guò)log打出,僅在pc端時(shí)才會(huì)打印。
appId: '', // 必填,企業(yè)微信的corpID
timestamp: , // 必填,生成簽名的時(shí)間戳
nonceStr: '', // 必填,生成簽名的隨機(jī)串
signature: '',// 必填,簽名,見(jiàn)附錄1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見(jiàn)附錄2
});
突然發(fā)現(xiàn)我們的代碼配置里面,沒(méi)有beta這個(gè)配置,加上,試一下,??????,心情很是復(fù)雜,代碼這次終于正常調(diào)起來(lái)了。
OK,到這里,問(wèn)題解決。
結(jié)論
這次不是踩坑的大坑,總結(jié)出3點(diǎn):
- 配置一旦配好后,再?zèng)]動(dòng)過(guò),所以不會(huì)想到是配置的問(wèn)題,直接就奔著調(diào)用的方法去了。下一次,代碼還是要記得從頭捋?。?!
- 企業(yè)微信對(duì)前一版本的相關(guān)配置兼容有坑!??!
- 學(xué)會(huì)了用第三方的代碼來(lái)檢測(cè)自己的業(yè)務(wù)代碼,用本地代碼替換線上代碼進(jìn)行運(yùn)行調(diào)試。
- 多學(xué)多做多看,大佬就是大佬,爭(zhēng)取自己早日成為大佬。??????
