您的位置:首页 > 其它

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

2017-08-14 16:43 363 查看
今天看了下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类型,而是需要经过处理;有知道详情的同学,请告诉我怎样处理这个数据吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  控制台 调试