踩坑---一個(gè)不是坑的難以言喻的坑,有關(guān)企業(yè)微信在iOS端上傳文件的坑

起因

今早一去公司,被組長(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ò)程

  1. 因?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)題啊。

  1. 然后把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ù)探索。

  1. 后來(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)題。

  2. 大佬說(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ò)

    1.png
    這種方式,用本地文件代替線上的文件進(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)題,心中真的是,一言難盡?。?!

  3. 最后,開(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):

  1. 配置一旦配好后,再?zèng)]動(dòng)過(guò),所以不會(huì)想到是配置的問(wèn)題,直接就奔著調(diào)用的方法去了。下一次,代碼還是要記得從頭捋?。?!
  2. 企業(yè)微信對(duì)前一版本的相關(guān)配置兼容有坑!??!
  3. 學(xué)會(huì)了用第三方的代碼來(lái)檢測(cè)自己的業(yè)務(wù)代碼,用本地代碼替換線上代碼進(jìn)行運(yùn)行調(diào)試。
  4. 多學(xué)多做多看,大佬就是大佬,爭(zhēng)取自己早日成為大佬。??????
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 又到年終總結(jié)時(shí)候,回頭看看今年也跟過(guò)無(wú)數(shù)作家交流學(xué)習(xí)過(guò),我是個(gè)蠻看重第一感覺(jué)的人,第一感覺(jué)喜歡了,就會(huì)執(zhí)著地喜歡下...
    旋子eve閱讀 168評(píng)論 0 1
  • 今年公祭日被一個(gè)名字刷了屏,這也是我第一次聽(tīng)到張純?nèi)绲拿?。說(shuō)實(shí)話,在我看完《張純?nèi)纭暇┐笸罋ⅰ愤@一紀(jì)錄片之后...
    巫馬十六閱讀 2,315評(píng)論 9 29
  • 當(dāng)疲憊了的時(shí)候,當(dāng)不想說(shuō)話的時(shí)候,當(dāng)沮喪了的時(shí)候,當(dāng)……那就到大自然的懷抱里去吧,她會(huì)做你最忠實(shí)的伴侶。 臨摹于微博作品
    糖媽李皖蘇閱讀 1,970評(píng)論 0 1
  • 在朋友(小溪)的推薦下,下載了簡(jiǎn)書(shū),今天是第一次打開(kāi),趁中午休息時(shí)間留下寥寥文字打卡。 昨晚和小溪吃飯聊天,也許太...
    楨簡(jiǎn)閱讀 396評(píng)論 0 2

友情鏈接更多精彩內(nèi)容