解析分享SDK怎样传图片数据给分享平台
2017-08-14 16:43
363 查看
今天看了下ShareSDK,一直比较好奇它是怎样把分享的图片数据传到要分享的平台中去的, 用UIApplication openUrl:这个方法是可以通过urlscheme传数据,但传的是字符串,长度也有限制,把图片转为字符串来传递不会超长?
带着疑问,首先,用真机调试,我在Debug area那里,暂停程序,出来lldb控制台后,输入命令:
dis -n "-[UIApplication openURL:]"
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/6ff62c6c8b6e377e48dae1d628a32368)
看到UIApplication openUrl: 方法地址是 0x18effb840,
然后调用
breakpoint set -a 0x18effb840 在函数开始点打个断点,
接下来,正常调用ShareSdk来分享(我这里是分享到手机QQ),记得要传入图片数据,
接着,发现ShareSDK果然调用了UIApplication openUrl:,断点执行了。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/2699f8e32d5aa85a3571c21c703a91c2)
可以看到上一步是UIApplication(SSDK) SSDKOpenURL: , 嗯,是ShareSdk在调用
我们知道,objective-c调用函数,其实用objc_msgSend机制(有兴趣的同学请自行参考其它资料),在真正被调用的函数中,第一个参数是调用者, 而寄存器x0保存的就是第一个参数了。
看右边的 General purpose Registers, 查看系统寄存器,我们看下
先在x0那里点右键,选择Pring Description of “x0” ,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/448500af685e59d1b226babe24d9b7dd)
看到调用者确实是 UIApplication的一个实例
同理,打印x1,第二个参数是CMD, 指示传递的是哪个消息
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/0db33a77e6bf8b09741a4392c7dc5bb3)
获得地址,继续调用下面的方法打印对应内存
memory read -c100 0x000000010151bd0c
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/f5585000e0c1e92c19943b99d8901a35)
发现竟然不是openURL: 而是 SSDKOpenURL: ,出现这种情况,其实就是ShareSDK用了method_exchangeImplementations来替换掉原来的UIApplication
openUrl:方法,然后发消息SSDKOpenURL:调回原来的openURL:函数(有兴趣的同学请自行参考Objective-c Method Swizzling相关资料),
再打印x2寄存器,也就我们写[UIApplication openUrl: (url) ]调用中的那个url参数了,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/c5b39f658bdaf447d20a8a6ecb5099f9)
ok, 发现这段字符串是手机QQ的urlscheme,后面所带的数据也不长, 发现了description, title,这些字段,应该就是分享内容跟标题了,但字符串乱码,应该是经过了加密。
可惜上面没有发现跟分享图片相关的。
再仔细看,字符串中有这段
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/1c29451ce5d8ae3128abe99410901b17)
pasteboard指的是剪切板,难道图片数据在剪切板里?
继续在控制台中打印。
尝试打印了好几次后,终于发现
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/ea3f5d8e4666a1504c3c30be88b1909e)
看到了
[UIPasteboard generalPasteboard].items
中有 tencent.mqq关键字,明显就是手机QQ用到的数据,后面的apiLargeData,跟着一大段二制数据,那这些明显就是分享的图片数据了。
在控制台Variables view中,用Add Expression: [UIPasteboard generalPasteboard].items[0] 方法打印这个items, 获取这个数据的地址,
0x00000001704590e0,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/189559f45ae041bc4bb4ca74563bcfb8)
但继续在控制台中这样打印
![](https://oscdn.geek-share.com/Uploads/Images/Content/201708/14/0441d25b761e1d72dc0eaeeaf330c169)
发现无法生成图片,可能这个图片不能直接变成UIImage类型,而是需要经过处理;有知道详情的同学,请告诉我怎样处理这个数据吧。
带着疑问,首先,用真机调试,我在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类型,而是需要经过处理;有知道详情的同学,请告诉我怎样处理这个数据吧。
相关文章推荐
- 【干货分享】深入浅出解析大数据平台架构
- 从数据仓库到大数据,数据平台这25年是怎样进化的?
- Android 微信SDK图片分享(checkArgs fail, thumbData is invalid)
- 阿里内部分享:大数据业务平台两年发展历程-pefect,大数据的一些经验
- Android开发-数据绑定-DataBinding-AndroidStudio(四)Glide解析图片
- iOS开发-----json解析的数据有图片的数据流导致解析失败
- 解析带图片的htlm数据
- 数据库中的图片数据怎样在Image中显示
- 怎样用asp.net存取并显示sql sever2000中的图片数据呀?(转)
- WebAPI返回数据类型解惑 以及怎样解决Extjs无法解析返回的xml
- ContentProvider(4):怎样获取其他APP分享的数据
- 请求解析数据 SDWebImage请求图片
- 【分享】车牌图片数据样例
- Android配置文件分享和JSON数据生成与解析
- 轻松搞定Ajax(分享下自己封装ajax函数,其实Ajax使用很简单,难是难在你得到数据后来怎样去使用这些数据)
- iOS ShardSDK-如何自定义分享菜单中的平台列表
- android 不调用微信,易信等SDK实现实现一键分享图片文字到微信,易信,以及全部可选app
- 使用友盟社会化分享IOS版SDK分享纯图片到微信
- 图片懒加载插件实例分享(含解析)
- ViewPager+Fragment切换时无法更新数据问题解析(源代码分享)