背景:目前公司維護2個App,一個電商類項目惰帽,一個金融類項目橡淆;類似淘寶和支付寶召噩,很多時候需要在App之間進行通信,多次使用以后逸爵,查閱相關(guān)資料具滴,記錄相關(guān)信息,文章所描述的內(nèi)容如一下列表
- App間常用的通信方式
- 各種方式的優(yōu)缺點
URL Scheme
做iOS開發(fā)的都應該知道师倔,蘋果選擇沙盒的方式來保障用戶的隱私和安全构韵,App只能訪問自己的沙盒,同事禁止其他非系統(tǒng)的應用訪問App沙盒趋艘,大概意思就是疲恢,只有自己才能訪問自己的沙盒(蘋果系統(tǒng)除外)。因此蘋果需要提供了一個或多個可以在App之間跳轉(zhuǎn)的方法:URL Scheme就是其中一種瓷胧。如果你的App有被別的App訪問的功能或者數(shù)據(jù)显拳,那么你必須在你的App定義一個相對應的URL Scheme,這就是訪問你App的橋梁搓萧。當別的App使用一個URL Scheme進行訪問時杂数,系統(tǒng)會根據(jù)URL Scheme進行匹配,執(zhí)行相應的操作瘸洛。
優(yōu)點
- 這種跳轉(zhuǎn)方式是很靈活的揍移,只需要在.plist文件里面做簡單的處理,然后本地只需要需要進行簡單邏輯處理反肋,也可以用使用openURL來打開App對應的控制器那伐,而這個你想要打開的URL Scheme是可以動態(tài)的從服務器動態(tài)獲取的。那么這樣就很簡單的實現(xiàn)了動態(tài)跳轉(zhuǎn)囚玫。
- URL Scheme傳遞參數(shù)的方式也與URL一致喧锦,只需要簡單的在URL里附加上對應的參數(shù)即可。
- 這種頁面跳轉(zhuǎn)是無差別的抓督,通過URL Scheme跳轉(zhuǎn)可以無縫的在H5頁面和原生頁面之間跳轉(zhuǎn)傳值燃少,而無非做更多的邏輯判斷。
缺點
- 寫在info.plist文件中的Scheme可能會被一些反編譯手段獲取到铃在。
- URL Scheme可能會被劫持調(diào)來安全隱患
建議
蘋果可以限制 iOS 應用不能注冊別的應用的 Bundle ID 作為 URL Scheme阵具。這樣的話碍遍,使用自己的 Bundle ID 作為 URL Scheme 的接收器就會變的安全很多。
第三方應用可以通過①給自己發(fā)送 URL Scheme 請求來證明沒有被劫持阳液,如果沒有收到自己的 URL Scheme怕敬,就可以及時給用戶發(fā)送提醒;②利用 MobileCoreServices 服務中的 applicationsAvailableForHandlingURLScheme() 來查看所有注冊了該 URL Schemes 的應用和處理順序帘皿,從而檢測自己东跪、或者別人的 URL Scheme 是否被劫持。
Keychain
iOS系統(tǒng)的Keychain是一個安全的存儲容器鹰溜,它本質(zhì)上就是一個sqllite數(shù)據(jù)庫虽填,它的位置存儲在/private/var/Keychains/keychain-2.db,不過它所保存的所有數(shù)據(jù)都是經(jīng)過加密的曹动,可以用來為不同的app保存敏感信息斋日,比如用戶名,密碼等墓陈。iOS系統(tǒng)自己也用keychain來保存VPN憑證和Wi-Fi密碼。它是獨立于每個App的沙盒之外的贡必,所以即使App被刪除之后兔港,Keychain里面的信息依然存在。
基于安全和獨立于app沙盒的兩個特性仔拟,Keychain主要用于給app保存登錄和身份憑證等敏感信息押框,這樣只要用戶登錄過,即使用戶刪除了app重新安裝也不需要重新登錄理逊。
那Keychain用于App間通信的一個典型場景也和app的登錄相關(guān),就是統(tǒng)一賬戶登錄平臺盒揉。使用同一個賬號平臺的多個app晋被,只要其中一個app用戶進行了登錄,其他app就可以實現(xiàn)自動登錄不需要用戶多次輸入賬號和密碼刚盈。一般開放平臺都會提供登錄SDK羡洛,在這個SDK內(nèi)部就可以把登錄相關(guān)的信息都寫到keychain中,這樣如果多個app都集成了這個SDK藕漱,那么就可以實現(xiàn)統(tǒng)一賬戶登錄了欲侮。
Keychain的使用比較簡單,使用iOS系統(tǒng)提供的類KeychainItemWrapper肋联,并通過keychain access groups就可以在應用之間共享keychain中的數(shù)據(jù)的數(shù)據(jù)了
優(yōu)缺點
- 數(shù)據(jù)并不存放在App的Sanbox中威蕉,即使刪除了App,資料依然保存在keychain中橄仍。如果重新安裝了app韧涨,還可以從keychain獲取數(shù)據(jù)牍戚。
- keychain的數(shù)據(jù)可以用過group方式,讓程序可以在App間共享虑粥。不過得要相同TeamID
- keychain的數(shù)據(jù)是經(jīng)過加密的
UIPasteboard
在iOS的UI系統(tǒng)中如孝,有3個控件自帶剪切板操作,分別是UITextField娩贷、UITextView與UIWebView第晰。在這些控件的文字交互處進行長按手勢可以在屏幕視圖上喚出系統(tǒng)的剪切板控件,用戶可以進行復制彬祖、粘貼茁瘦,剪切等操作
UIPasteboard典型的使用場景就是淘寶跟微信/QQ的鏈接分享。由于騰訊和阿里的公司戰(zhàn)略涧至,騰訊在微信和qq中都屏蔽了淘寶的鏈接腹躁。那如果淘寶用戶想通過QQ或者微信跟好友分享某個淘寶商品,怎么辦呢南蓬? 阿里的工程師就巧妙的利用剪貼板實現(xiàn)了這個功能纺非。首先淘寶app中將鏈接自定義成淘口令,引導用戶進行復制赘方,并去QQ好友對話中粘貼烧颖。然后QQ好友收到消息后再打開自己的淘寶app,淘寶app每次從后臺切到前臺時窄陡,就會檢查系統(tǒng)剪切板中是否有淘口令炕淮,如果有淘口令就進行解析并跳轉(zhuǎn)到對于的商品頁面
去年面試螞蟻金服的時候還被問到這個問題,當時只是回到了了前面的URL Scheme和Keychain跳夭,現(xiàn)在終于有機會做一次這方面的只是整理涂圆,彌補自己在知識儲備方面的不足。
優(yōu)點
通用性币叹,只要需要識別特定的標識润歉,可以不受APP之間通信的影響
缺點
需要用戶手動處理
UIDocumentInteractionController
由于沙盒的嚴格限制,導致程序之間共享數(shù)據(jù)比較麻煩颈抚。一般在程序間共享文檔可以通過UIDocumentInteractionController類實現(xiàn)通訊踩衩。它支持在你的app中用其他app預覽和顯示文檔。同時也支持文件關(guān)聯(lián)贩汉,允許其他app通過你的程序打開文件驱富。這些技術(shù)包括了UIKit中提供的UIDocumentInteractionController類(UIDocumentInteractionController Class Reference),以及Quick Look框架(Quick Look Framework Reference)匹舞。
如果你的app需要打開它不支持的文件(PDF文件褐鸥、圖像文件,等等)策菜,或者需要將app的文件傳輸給另外一個允許接收此類型文件的app時晶疼【票幔可以使用文件交互控制器(UIDocumentInteractionController類的實例)為用戶提供可接收程序來處理文件,說的簡單點就是通過Quick Look框架判斷文檔是否能被另一個app打開和預覽翠霍。目前我們公司的文檔處理就是通過這來解決的锭吨。
//創(chuàng)建實例
NSURL *filePath = [NSURL fileURLWithPath:path];
UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];
//顯示窗口
BOOL b = [documentController presentPreviewAnimated:YES];
local socket
這種我是提一次聽說,是翻閱了好多資料后才看到的寒匙,完全陌生零如。
這種方式不太常見,也是很容易被iOS開發(fā)者所忽略但是特別實用的一種方法锄弱。它的原理很簡單考蕾,一個App1在本地的端口port1234進行TCP的bind和listen,另外一個App2在同一個端口port1234發(fā)起TCP的connect連接会宪,這樣就可以建立正常的TCP連接肖卧,進行TCP通信了,那么就想傳什么數(shù)據(jù)就可以傳什么數(shù)據(jù)了掸鹅。
這種方式最大的特點就是靈活塞帐,只要連接保持著,隨時都可以傳任何相傳的數(shù)據(jù)巍沙,而且?guī)捵銐虼罂选K娜秉c就是因為iOS系統(tǒng)在任意時刻只有一個app在前臺運行,那么就要通信的另外一方具備在后臺運行的權(quán)限句携,像導航或者音樂類app榔幸。
它是常用使用場景就是某個App1具有特殊的能力,比如能夠跟硬件進行通信矮嫉,在硬件上處理相關(guān)數(shù)據(jù)削咆。而App2則沒有這個能力,但是它能給App1提供相關(guān)的數(shù)據(jù)蠢笋,這樣APP2跟App1建立本地socket連接态辛,傳輸數(shù)據(jù)到App1,然后App1在把數(shù)據(jù)傳給硬件進行處理挺尿。
參考資料
http://www.cocoachina.com/ios/20171229/21709.html
https://www.25pp.com/news/news_71805.html
http://www.reibang.com/p/d3185c70cc44
http://www.reibang.com/p/bf6b42470bba
https://developer.apple.com/documentation/uikit/uidocumentinteractioncontroller