踩坑---一个不是坑的难以言喻的坑,有关企业微信在iOS端上传文件的坑
起因
今早一去公司,被组长远程发过来一个Bug,据说是用户反馈的一个iOS的问题,在我们的业务中,有一个有关图片上传的问题。我们的业务代码是在自己的客户端、微信、钉钉、企业微信四个地方跑的同一套代码。
Bug描述
Bug的具体描述是企业微信用户在使用上传图片时,无反应。但是在安卓下运行正常。在其他平台运行正常。
找测试复现该问题时,发现在安卓平台下一切正常,但是在iOS端测试发现,在iOS8上运行正常,在iOS9往上的系统中,会弹出一个报错
a.oldWXObj.invoke not a function
解决过程
- 因为是在iOS端有问题,所以我初步怀疑是因为我们自己对企业微信的相关SDK进行二次封装的时候出现了问题,所以我在自己的业务代码中找到了调用
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
里面的问题啊。
- 然后把
wx.chooseImage
进行alert
,发现这个函数是存在的,但是发现还是有问题,代码大概是这样的
a.oldWXObj.invoke("chooseImage",params,callback)
然后我一直在想这个a.oldWXObj
是什么东东,看源码,并没有找到这个东西,然后查看我们的sdk版本是1.0.0,最新的sdk版本是1.2.0。以为是因为sdk版本的原因,然后把项目中的sdk升级,问题还是存在,看来不是sdk的原因,继续探索。
- 后来没有思路,去请教大佬,大佬给了个思路,在企业微信中开启一个别的第三方的业务,看看他们的图片上传是否也存在相同的问题,OK,照着这个思路往下继续。我去,第三方的图片上传是没有问题的,OK,那么肯定是我们自己的业务代码的问题,然后把业务剥离出来,在新建两个文件,一个采用我们自己封装的sdk,一个不用自己封装过后的sdk,直接调用
wx
的sdk,然后我把相关的wx.config
给 复制 了过去,发现图片上传还是有问题,然后考虑是不是免登没有通过呢? 试着调用其他的方法,发现获取当前位置、扫描二维码、开始录音这三个方法都可以成功调用,确定免登是通过了的,不是免登的问题。 - 大佬说换个思路,用
Charles
开始抓包查看第三方的实现,这一部分才是写这个 踩坑记录的重点 ,主要是看这个调试的过程,最开始用Mac自带的Safari尝试调试,发现企业微信并没有把调试开放出来,只能通过抓包来一点点尝试了,OK,在简书上搜索Charles抓包,按照步骤,发现第三方是https
,然后再万能的简书,抓包https
,一切完成后。发现第三方也是调用的wx.chooseImage
,那么说明我们调用的业务代码没问题啊,然后通过这种方式,用本地文件代替线上的文件进行调试,把我们的相关业务代码代替第三方的相关代码,发现我们的代码在第三方的应用里面是正常运行的。我去!!!这就奇怪了呀,这时,一天的时间不知不觉都过去了,还没有解决问题,心中真的是,一言难尽!!! - 最后,开始从头梳理代码,从第三方最开始调用企业微信的sdk开始一点点对比,把我们的相关信息跑在第三方平台里,来,把
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
这个配置,加上,试一下,
相关推荐
郑贺腾讯社交广告 2020-11-06
moldy0 2020-09-10
柳峰 2020-10-07
4.启动命令windows:chrome --remote-debugging-port=9222启动命令mac:Google\ Chrome --remote-debugging-port=9222
maowenbei 2020-09-18
cbqstars 2020-08-16
郴州小程序 2020-05-29
sucheng 2020-04-20
戴翔的技术 2020-04-20
老和山下的小学童 2020-03-26
zengfanpei 2020-03-05
郴州小程序 2020-02-19
cdkey 2020-02-10
cdkey 2020-01-31
cdkey 2020-01-12
郴州小程序 2020-01-03
zengfanpei 2019-12-31