通過URLSchemes建立應用間通訊機制(例:支付寶)

深發發表於2016-11-02

導語

大家都知道,應用間無法直接通訊,所以即使是同公司的應用也無法直接在裝置端直接通訊和共享資料。
但是通過URLSchemes可以調起其它應用,他的官方格式為”識別符號://”,這個識別符號就是你給應用定義的URLSchemes,在”//”後面,可以通過類似於http連結的引數傳遞方式來在應用間傳遞少量資料進行互動,話不多說,擼程式碼。

 

1.建立兩個應用並互相呼叫

1.1 首先建立應用bradley和johnson,bradley是我們的被呼叫應用,johnson則是我們的主動呼叫應用。

11544169-ad4ee8ec43635e93
建立應用

1.2 在bradley應用中找到TARGETS-Info-URL Types,新增一項,將其URL Schemes填寫為bradley,同理也在johnson應用中找到TARGETS-Info-URL Types,新增一項,將其URL Schemes填寫為johnson。

12544169-06d5fae0f3f7525e
bradley應用
13544169-f9017ae4610bb39e
johnson應用

1.3 在bradley的AppDelegate.m中新增如下方法及語句:

14544169-246ed43fc241915e
調起App回撥方法

1.4 在johnson的主介面我們新增一個按鈕,並執行跳轉程式碼,但是為了嚴謹(參照微信支付),我們必須判斷當前裝置是否安裝目標App,所以我們需要在info.plist檔案中新增URL Schemes白名單:

15544169-b83d6d79d0fe8da7
URL Schemes白名單

只需將綠色框框內的資訊加入即可。
跳轉程式碼如下:

16544169-189c7c95a81c911b
跳轉程式碼

1.5 執行除錯,我們先執行bradley應用,再執行johnson應用,在johnson應用中點選按鈕調起bradley應用,檢視log資訊:

17544169-3d7ca1a75db15b92
log資訊

很明顯我們成功的在johnson中調起了bradley應用,並列印出了日誌,可以看到我們通過開啟一個”bradley://”的url即可調起bradley應用。
那麼我們可以在safari中調起bradley麼?
答案是可以的:

18544169-f83b772be4c26c57
輸入braley://
19544169-598d36fd20bb9fb1
詢問開啟
20544169-7f9bb60a8cc73731
log日誌

所以在某種程度上,我們並不能阻止別人開啟我們的應用,只能儘量避免自己應用URL Schemes的洩露,並在回撥方法中做出一些判斷取捨。

 

2.應用間的資訊傳遞

2.1 大家都上過網,都知道上網需要網址,如:
https://ww.baidu.com?ceo=liyanhong&yewu=kengqian
在這裡,”https://” 就類似於我們的識別符號”bradley://”,我們通過在”//”後面加鍵值對來傳遞我們的引數,以達到應用間資訊傳遞的目的。
下面我們來嘗試傳遞一下幾個引數:

21544169-dc522a955903b47c
引數傳遞

可見我們成功的將引數傳遞了過來,通過一些簡單字串處理我們就能組裝成完整的引數字典。那麼問題又來了,這個引數字串能夠經受的最大長度是多少呢?
起碼1K的length是經得起的:

22544169-68337f302ade7c11
1000字串傳遞
23544169-14caac07cbad4467
1000字串傳遞成功

而且即使到1W也是OK的,所以大家可以放心使用。

 

3.應用間的資訊傳遞處理完成後並跳轉回來

3.1 資訊傳遞是為了處理,處理完成後總有個結果,並需要把結果回傳回來,這就是支付寶和微信支付的處理邏輯。
如何回撥回來呢?
答:被調起的應用並不知道調起它的應用的URL Schemes,所以我們需要把自身應用的URL Schemes也傳遞過去,由被調起應用處理完成,重新調回來並將處理結果作為引數回傳回來。
如下:

24544169-9aa9abbbb0b9ba92
johnson點選傳遞引數
25544169-65bab097a19e2707
bradley模擬處理後並回撥
26544169-bd35d0f87d728cfe
bradley列印log
27544169-7c7f1342eba7fc09
johnson列印log

4.模擬支付寶案例(僅思路及簡易程式碼)

小Demo連結

相關文章