Cordova与前端的交互大概是这样,主要通过一个callbackId进行标识
self.commandDelegate sendPluginResult:commandResult callbackId:callbackId];
问题记录:在进行了热更新之后,微信分享到第三方,这个时候是有callbackId,然后回调的时候callbackId=nil.,交互无效。
因为其中涉及到热更新和Cordova插件的一些机制,而且是接别人的二手码,感觉这个bug出来的毫无头绪
断点看了下堆栈信息,发现这个函数走了俩次
这个就是Cordova初始化插件的一个函数。
这个时候我想到了是不是因为初始化了俩次微信插件的原因,然后我打印了下插件初始化和分享前后地址
0x174095180 //更新之前
0x17009cb10. // 更新完之后
0x17009cb10. //分享到第三方
0x174095180 //分享的回调
果然,罪魁祸首就是这,实例化了俩个微信插件, 分享的时候是A,A的callbackId是存在的,在onResp回调的函数里面就是B的地址了,所以就是nil了,发现了根源问题就好解决了。
因为我的根视图控制器继承的是 CDVViewController,所以根视图控制器调用init初始化的时候,插件也会初始化
我在更新完之后需要重新设置 root 界面,所以又初始化了一次根视图控制器,导致实例化了俩个插件。
解决办法:直接获取到一开始初始化的那个根视图控制器就行了,避免二次初始化。 用单例应该也是个解决办法。