iOS分享内容到微信,微信是如何回传结果的

最近(2018年6月)微信要取消用户从第三方App分享内容到微信后的结果了,也就是不再回传分享结果,就突然想看看微信是怎么回传结果的。

首先想到的是在appDelegate的application:openURL:sourceApplication:annotation方法加断点,查看url参数里面是否有带数据,但是居然没有在url发现任何和分享结果相关的数据。就这奇怪了,微信是怎么回传结果的呢?

然后回过来看一下iOS进程间共享/发送数据有哪些方式呢?

  1. UIDocumentInteractionController 或者 UIActivityViewController,这个不适合这儿
  2. App Groups和Shared keychain access,但是这两个都要求共享数据的App属于同一个group,微信和其他第三方App明显不可能属于同一个group
  3. UIPasteboard(粘贴板) 既然微信想办法隐藏数据,首先想到namedPasteboard,但由于微信和第三方App不属于同一个team,所以不行,只能使用generalPasteboard

然后接下来就在application:openURL:sourceApplication:annotation处去查看generalPasteboard, 但没有发现什么异常,但是却发现WXApiDelegate的onResp:方法偶尔被调用,偶尔没有被调用,真是奇怪(后面才意识到是微信给回传数据的粘贴板item设置了一个较短的过期时间,在断点处停留的时间稍微长一点,这个item就失效消失了,所以也就看不到了)。但是偶尔又能看到一个item中有一个key为"content"的二进制数据,猜测是NSData,便取出来看一下。


iOS分享内容到微信,微信是如何回传结果的_第1张图片
image.png

image.png

不出所料,果然是NSData。(OS_dispatch_data是什么,百度一下就知道了)

然后就想怎么解析NSData数据呢,首先想到的是转成NSString。先用NSUTF8StringEncoding转换,结果为nil,失败了。然后用NSASCIIStringEncoding转换,依然不太成功,但是能看到一些东西,AppID以及SendMessageToWXResp类的成员country、language、result什么的,我知道自己接近了,就是这个,而且看起来像是序列化之类的方法产生的二进制数据。


image.png

然后我便尝试使用NSKeyedUnarchiver反序列化,可是怎么都不成功,然后我便尝试搜索上面那张截图里面的关键字,returnFromAppR-2S1.5U,bplist啥的,终于发现bplist是文件头标记,binary plist。接下来就是怎么解析binary plist文件啦,根据网上搜索到的命令 plutil -convert binary1 a.plist
然后就看到结果啦


iOS分享内容到微信,微信是如何回传结果的_第2张图片
image.png

你可能感兴趣的:(iOS分享内容到微信,微信是如何回传结果的)