iOS App之間通信(iOS Deeplink 一)

我們經(jīng)常會(huì)碰到一個(gè)情況,就是需要一個(gè)呼起另外一個(gè)App,比如我們想要呼起微信,去分享一些東西,同時(shí)在微信分享完成之后,又希望微信能夠給我們一些反饋信息,告訴我們是否成功。在iOS9之前,能夠來(lái)呼起一個(gè)App的只有通過(guò)URL Schemes。從一個(gè)很不專(zhuān)業(yè)的角度講,scheme其實(shí)就可以代表一個(gè)app的稱(chēng)呼,同時(shí)又是一個(gè)url的頭部。

1.什么是URL

Scheme://Host:Port/Path?Queryprams

通常port只會(huì)在直接用IP地址訪問(wèn)時(shí)才會(huì)用到:

例:http://search.jd.com/Search?keyword=哈利波特8&enc=utf-8

在這個(gè)例子中http是scheme,search.jd.com是host,Search是path,enc是queryparam
在iOS中(其實(shí)不僅iOS,Android,甚至Mac中也是這樣),一個(gè)scheme是由一個(gè)app開(kāi)發(fā)者自己確定,比如微信的scheme有wechat和weixin兩種。

可以打開(kāi)Xcode,在Info -> URL Types 中,點(diǎn)擊+ ,即可為自己的App添加一個(gè)自己的Scheme

添加scheme

添加完了后,你可以在safari中輸入 Mescheme://做一下測(cè)試,你會(huì)發(fā)現(xiàn)會(huì)提示你是否需要呼起 your app。

在這里有幾點(diǎn)需要注意:

1.由于scheme完全是用戶(hù)自添加行為,蘋(píng)果不參與干涉,所以可能出現(xiàn)多個(gè)app設(shè)置相同的scheme,之前看到的蘋(píng)果稱(chēng)這種情況是未知的,我這邊測(cè)試完之后,感覺(jué)這個(gè)跟bundle id相關(guān)。

2.在判斷 和 呼起 另外一個(gè)app時(shí),蘋(píng)果對(duì)scheme的大小寫(xiě)是不敏感的。!但是!在被呼起的App內(nèi)部獲取scheme的時(shí)候,會(huì)獲得原始的scheme拼寫(xiě)值,這個(gè)時(shí)候就不能保證這個(gè)app在處理的時(shí)候是否對(duì)大小寫(xiě)敏感了。

2.如何通過(guò)URL呼起

1.手動(dòng)測(cè)試,在safari中輸入,但是這種情況如果url中存在反斜杠,可能出現(xiàn)一種能呼起,但是不能在呼起的app中做預(yù)期的操作
2.使用UIWebView來(lái)Load,注意只能用UIWebView,WKWebView不行。
[糾正],在iOS10以下時(shí),Scheme URL可以當(dāng)做HTTP URL一樣來(lái)通過(guò)UIWebview load,并呼起對(duì)應(yīng)Scheme的App,但是iOS 10上測(cè)試發(fā)現(xiàn)已經(jīng)不行。
3.推薦使用的是調(diào)用原生的Code:
NSURL *url = [NSURL URLWithString:@"weixin://"]; [[UIApplication sharedApplication] openURL:url];
openURL這個(gè)方法會(huì)返回一個(gè)BOOL來(lái)通知是否正常呼起,而在iOS 10中,已經(jīng)不建議使用該方法了,推薦使用
- (void)openURL:(NSURL*)url options:(NSDictionary*)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");
新的方法將會(huì)使用異步的方式執(zhí)行,同時(shí)會(huì)在主線程進(jìn)行completion操作。

options其實(shí)內(nèi)容與接收端的openUrl方法是對(duì)應(yīng),我還沒(méi)有用到過(guò),因?yàn)槠渲杏袃蓚€(gè)參數(shù)其實(shí)跟我們現(xiàn)在講的這種case關(guān)系不大,而對(duì)于空的options,執(zhí)行相當(dāng)于老方法。

3.如何處理URL

在接收端也有多個(gè)方法,但是推薦使用下面這個(gè)方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options NS_AVAILABLE_IOS(9_0);
其中URL與2中的呼起的URL是一致的。

當(dāng)你嵌入了多個(gè)SDK的時(shí)候,可以先通過(guò)url的scheme來(lái)判斷是哪個(gè)SDK的App回呼的時(shí)候傳來(lái)的URL,因?yàn)椴皇敲總€(gè)SDK都會(huì)對(duì)于不是自己可操作的URL返回一個(gè)NO。
另外options種有一個(gè)Key UIApplicationOpenURLOptionsSourceApplicationKey可以得知對(duì)方的bundle id。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容