問題描述
微信的小程序在跳轉(zhuǎn)App時(shí)刀荒,是可用通過app-parameter
來傳遞一些額外信息
<button open-type="launchApp" app-parameter="additionalInfoxxxxx" binderror="launchAppError">打開APP</button>
但我們?cè)?AppDelegate
中的 - (BOOL)application:openURL:sourceApplication:annotation:
中打斷點(diǎn)后代嗤,可以看到,只有沒什么信息量的url和為nil的annotation:
url的scheme為App注冊(cè)的固定的微信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
。那么問題來了绅喉,我們?cè)谏厦婵梢钥吹角耄艘粋€(gè)很簡短的url,沒有任何其他信息了柴罐,這個(gè) messageExt
的內(nèi)容是從哪里獲取的呢徽缚?
猜測
經(jīng)過和同事討論,猜測了幾種可能性:
- 可能是微信SDK發(fā)了個(gè)網(wǎng)絡(luò)請(qǐng)求來處理這個(gè)事情革屠。但抓包后并沒有
- 微信向目標(biāo)App中的進(jìn)程做了什么事情那婉。但iOS的保護(hù)機(jī)制應(yīng)該沒那么容易做到,起碼目前沒想到可以繞開權(quán)限的
- App間進(jìn)行socket通信,但考慮到需要起服務(wù)呻率、保活等因素感覺也不是太可能
調(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,破案翅雏。