解析分享SDK怎样传图片数据给分享平台

来源:互联网 发布:淘宝闲鱼怎么搜索 编辑:程序博客网 时间:2024/06/06 01:51
今天看了下ShareSDK,一直比较好奇它是怎样把分享的图片数据传到要分享的平台中去的, 用UIApplication openUrl:这个方法是可以通过urlscheme传数据,但传的是字符串,长度也有限制,把图片转为字符串来传递不会超长?

带着疑问,首先,用真机调试,我在Debug area那里,暂停程序,出来lldb控制台后,输入命令:
dis -n "-[UIApplication openURL:]"



看到UIApplication openUrl: 方法地址是 0x18effb840, 

然后调用 breakpoint set -a 0x18effb840 在函数开始点打个断点,

接下来,正常调用ShareSdk来分享(我这里是分享到手机QQ),记得要传入图片数据,

接着,发现ShareSDK果然调用了UIApplication openUrl:,断点执行了。 




可以看到上一步是UIApplication(SSDK) SSDKOpenURL: , 嗯,是ShareSdk在调用

我们知道,objective-c调用函数,其实用objc_msgSend机制(有兴趣的同学请自行参考其它资料),在真正被调用的函数中,第一个参数是调用者, 而寄存器x0保存的就是第一个参数了。

看右边的 General purpose Registers, 查看系统寄存器,我们看下
先在x0那里点右键,选择Pring Description of “x0” , 


看到调用者确实是 UIApplication的一个实例

同理,打印x1,第二个参数是CMD, 指示传递的是哪个消息 

获得地址,继续调用下面的方法打印对应内存
memory read -c100 0x000000010151bd0c



发现竟然不是openURL: 而是  SSDKOpenURL: ,出现这种情况,其实就是ShareSDK用了method_exchangeImplementations来替换掉原来的UIApplication openUrl:方法,然后发消息SSDKOpenURL:调回原来的openURL:函数(有兴趣的同学请自行参考Objective-c Method Swizzling相关资料),

再打印x2寄存器,也就我们写[UIApplication openUrl: (url) ]调用中的那个url参数了, 


ok, 发现这段字符串是手机QQ的urlscheme,后面所带的数据也不长, 发现了description, title,这些字段,应该就是分享内容跟标题了,但字符串乱码,应该是经过了加密。
可惜上面没有发现跟分享图片相关的。

再仔细看,字符串中有这段 


pasteboard指的是剪切板,难道图片数据在剪切板里?
继续在控制台中打印。
尝试打印了好几次后,终于发现 


看到了  [UIPasteboard generalPasteboard].items
中有 tencent.mqq关键字,明显就是手机QQ用到的数据,后面的apiLargeData,跟着一大段二制数据,那这些明显就是分享的图片数据了。

在控制台Variables view中,用Add Expression: [UIPasteboard generalPasteboard].items[0]  方法打印这个items, 获取这个数据的地址,0x00000001704590e0,



但继续在控制台中这样打印



发现无法生成图片,可能这个图片不能直接变成UIImage类型,而是需要经过处理;有知道详情的同学,请告诉我怎样处理这个数据吧。


阅读全文
0 0
原创粉丝点击