問題描述
微信的小程序在跳轉(zhuǎn)App時(shí),是可用通過app-parameter來傳遞一些額外信息
<button open-type="launchApp" app-parameter="additionalInfoxxxxx" binderror="launchAppError">打開APP</button>
但我們在 AppDelegate 中的 - (BOOL)application:openURL:sourceApplication:annotation: 中打斷點(diǎn)后,可以看到,只有沒什么信息量的url和為nil的annotation:

url的scheme為App注冊的固定的微信scheme,annotation為nil,可見沒有任何其他消息
接下來,我們按照微信的文檔來實(shí)現(xiàn)獲取參數(shù):
BOOL result = [WXApi handleOpenURL:url delegate:[WechatSDKDelegate sharedInstance]];
// WechatSDKDelegate
- (void)onReq:(BaseReq*)req
{
if ([req isKindOfClass:[LaunchFromWXReq class]]) {
LaunchFromWXReq *launchReq = req;
NSString *appParameter = launchReq.message.messageExt;
// do sth bellow
}
}
可以看到,在 onReq: 竟然能取到結(jié)構(gòu)很復(fù)雜的 req,而 req.message.messageExt 就是我們從小程序中傳過來的 app-parameter。那么問題來了,我們在上面可以看到,除了一個(gè)很簡短的url,沒有任何其他信息了,這個(gè) messageExt 的內(nèi)容是從哪里獲取的呢?
猜測
經(jīng)過和同事討論,猜測了幾種可能性:
- 可能是微信SDK發(fā)了個(gè)網(wǎng)絡(luò)請求來處理這個(gè)事情。但抓包后并沒有
- 微信向目標(biāo)App中的進(jìn)程做了什么事情。但iOS的保護(hù)機(jī)制應(yīng)該沒那么容易做到,起碼目前沒想到可以繞開權(quán)限的
- App間進(jìn)行socket通信,但考慮到需要起服務(wù)、?;畹纫蛩馗杏X也不是太可能
調(diào)查
沒辦法了,只能去調(diào)查下SDK的靜態(tài)庫了,用Hopper打開后,看了幾個(gè)類的方法后,終于找到了一個(gè)方法感覺很像,并且給人豁然開朗的感覺。

就是這個(gè) [WXOMTAOpenUDID _getDictFromPasteboard:] 方法!
有意思,猜測可以通過剪切板將需要的信息傳遞過來,在App中獲取后再做好處理就OK了。那么,接下來就是驗(yàn)證了。
我將 app-parameter 中線傳數(shù)據(jù)A兩次,然后傳一次數(shù)據(jù)B,最后再傳一次A,然后我在App中可以從剪切板中獲取到以下的數(shù)據(jù):

可以看出,第 1、2、4的剪切板數(shù)據(jù)是一樣的,第3次不一樣。這里就可以猜測出來的確是用的剪切板了??
下面將數(shù)據(jù)轉(zhuǎn)換一下:

被圈出來的地方就是我之前小程序中 app-parameter 中傳過來的值。
OK,破案。