一、前言
泰國渡了半個月的假,回來發現有段時間沒更新部落格了,頓時感到渾身焦慮啊,而這段時間也不斷有小夥伴關注我的簡書賬號,讓我感到欣慰的同時心理也是沉甸甸的壓力,唯有寫出高質量、好的博文作為回報了。昨天專案經理問我:能不能從我們的app應用跳轉到合作商的app應用?我回答說:完全可以啊,這個不是問題。他聽完後非常滿意高興的去合作商進一步商談了。留下身後的我趕緊谷歌相關資料(開玩笑,哥也不可能什麼都去記,很早以前做過也忘的七七八八了),但是谷歌一通下來發現網上五花八門的博文並沒有幾篇講的清晰明瞭、深入淺出的,而且大部分年代久遠。於是花了點時間專門研究了下,經過實踐和總結,本篇博文將涉及到以下知識點:
- app應用跳轉的原理解析
- 如何實現兩個app應用之間的跳轉
- 如何實現兩個app之間跳轉到指定介面
二、應用跳轉原理
相信從一個應用跳轉到另一個應用大家並不陌生,最常見的莫過於第三方登入,支付寶支付等等。這些東西大家都耳熟能詳,整合進來也很簡單,跟著第三方sdk整合文件一步步走下來就是了,通常sdk整合文件都需要你在工程中配置一堆堆的東西,但是配置的這些東西,你真的明白了嗎?比如下面這個,第三方登入或分享需要你配置的URL Schemes:
不明白呢沒關係,開始我也不明白,但是這篇博文看完後,相信你會明白的,下面正式進入主題:
1、一些概念的補充
- 協議:雙方互相遵守的一種規範,只有遵守共同的協議規範才能進行彼此的通訊。比如我們最熟悉的網路協議——http協議。
- URL:資源的路徑或地址。在IOS中有一個專門用於包裝資源路徑的類——NSURL。
- 一個完整URL的組成
12345例如:http://123.0.0.1/path?page=100“http://”:協議型別“123.0.0.1”:伺服器ip地址“/path”:資源存放的是路徑“page=100”:請求的引數 - NSURL包裝一個完整地址
12345NSURL *url = [NSURL URLWithString:@"http://123.0.0.1/path?page=100"];NSLog(@"scheme(協議):%@",url.scheme);NSLog(@"host(域名):%@",url.host);NSLog(@"path(路徑):%@",url.path);NSLog(@"query(引數):%@",url.query);
列印結果如下:
12342016-12-02 14:50:38.442 TestDemo[5632:406869] scheme(協議):http2016-12-02 14:50:38.442 TestDemo[5632:406869] host(域名):123.0.0.12016-12-02 14:50:38.442 TestDemo[5632:406869] path(路徑):/path2016-12-02 14:50:38.442 TestDemo[5632:406869] query(引數):page=100
2、跳轉的原理
在iOS中,從一個app開啟另一個app,這必然牽扯到兩個app之間的互動和通訊,像這種涉及到整個應用程式層面的事情,蘋果有一個專門的類來管理——UIApplication。在ios中UIApplication其實就是代表著應用程式,這點從它的命名就可以窺之。而我們要開啟另一個應用程式,如何實現呢?
很簡單,其實就是UIApplication下面這個 的API
1 2 3 4 5 6 |
/** 通過應用程式開啟一個資源路徑 @param url 資源路徑的地址 @return 返回成功失敗的資訊 */ - (BOOL)openURL:(NSURL*)url; |
它的一些我們非常熟悉的用法:
1 2 3 |
//撥打系統電話 NSURL *url = [NSURL URLWithString:@"tel://10086"]; [[UIApplication sharedApplication] openURL:url]; |
1 2 3 |
//傳送系統簡訊 NSURL *url = [NSURL URLWithString:@"sms://1383838438"]; [[UIApplication sharedApplication] openURL:url]; |
看到這裡也許有人會有疑問:撥打系統電話、傳送系統簡訊跟我本篇要講的應用間的跳轉有什麼關係呢?
呵呵,不要著急,重點來了:你難道不覺得撥打系統電話、傳送系統簡訊其實就是應用間的跳轉嗎?只要一執行以上兩個方法就會從你當前的應用跳轉到系統的撥打電話介面、傳送簡訊介面,這難道還不夠應用間的跳轉嗎?其實你也可以這麼理解:撥打系統電話、傳送簡訊它倆就是手機本身自帶的兩個app應用。
寫到這裡答案已經呼之欲出,上面打電話和發簡訊的實現程式碼大同小異,唯一的區別是傳遞的NSURL引數不一樣,導致他們跳轉到不同的應用場景。我們再仔細分析下傳給它們的NSURL引數,就會發現NSURL的scheme(協議)不一樣,打電話時“tel://”協議,發簡訊是“sms://”協議。(對協議有疑問的童鞋可以拉上去看)
一個總結:一個應用能開啟另一個應用的必然條件是,另一個應用必須配置一個scheme(協議),這樣應用程式才能根據協議找到需要開啟的應用。
三、實現兩個app間的跳轉
建立兩個示例Demo,TestDemo和Test2Demo,現在需要實現從Test2Demo跳轉到TestDemo中
1、在被跳轉的TestDemo配置一個協議scheme,這裡命名為test(名字可隨意配置,當然最好是英文並且跟你專案相關)
targets -> info -> URL Types ->URL Scheme ->填寫協議
注意:不需要填寫成“test://”
2、在Test2Demo執行跳轉的方法中實現下面方法
1 2 3 4 5 6 7 8 9 10 11 12 |
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSURL *url = [NSURL URLWithString:@"test://"]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; }else{ NSLog(@"沒有安裝應用"); } } |
ok,到這裡如果你的系統是ios9.0以下,已經大大功告成了。但是,如果是9.0以後,請看下一步。
3、配置協議白名單
在Test2Demo的info.plist檔案中增加一個LSApplicationQueriesSchemes
欄位,把它設定為陣列型別,並配置需要跳轉的協議名單
到此,兩個應用間的跳轉已經完全實現,其實說穿了就三步,so easy!但是,很多時候,我不僅要跳轉到一個應用上,而且還需要跳轉到應用的指定介面,想知道怎麼處理請接著往下看。
四、跳轉到指定介面
想要跳轉到指定介面,必然是上一個app告訴下一個app(被跳轉的app)需要跳轉到哪個介面,而如何告訴它這裡便涉及到兩個app的通訊。我們從上面可以知道,兩個app之間的跳轉只需要配置一個scheme,然後通過UIApplication
呼叫它的物件方法openURL:
即可實現,除此之外再也沒有實現任何程式碼了。而這之間是如何通訊的呢?
答案依然是協議,請看下面步驟:
1、在”test://”協議後面的域名加上一些欄位用來標記需要跳轉的介面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//進入更多介面 - (IBAction)intoMore:(id)sender { NSURL *url = [NSURL URLWithString:@"test://more"]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; }else{ NSLog(@"沒有安裝應用"); } } //進入設定介面 - (IBAction)intoSet:(id)sender { NSURL *url = [NSURL URLWithString:@"test://set"]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; }else{ NSLog(@"沒有安裝應用"); } } |
2、來到被跳轉的應用TestDemo的AppDelegate
類的.m檔案中,監聽其代理方法application:handleOpenURL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//當應用程式將要被其他程式開啟時,會先執行此方法,並傳遞url過來 //注:下面這個方法9.0後就過期了,請注意適配,9.0後用這個方法:application:openURL:options: -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { NSLog(@"url:%@",url.absoluteString); NSLog(@"host:%@",url.host); if ([url.host isEqualToString:@"more"]) { NSLog(@"進入更多介面"); //到此做介面的跳轉 } if ([url.host isEqualToString:@"set"]) { NSLog(@"進入設定介面"); //到此做介面的跳轉 } return YES; } |
當Test2Demo點選進入更多介面列印如下:
1 2 3 |
2016-12-02 17:11:17.680 TestDemo[6507:495044] url:test://more 2016-12-02 17:11:17.681 TestDemo[6507:495044] host:more 2016-12-02 17:11:17.681 TestDemo[6507:495044] 進入更多介面 |
當Test2Demo點選進入設定介面列印如下:
1 2 3 |
2016-12-02 17:10:38.745 TestDemo[6507:495044] url:test://set 2016-12-02 17:10:38.745 TestDemo[6507:495044] host:set 2016-12-02 17:10:38.745 TestDemo[6507:495044] 進入設定介面 |
五、結束語
到此本篇博文要講的基本結束,由於自身水平所限,如有疏漏之處望海涵和斧正。寫技術部落格真的不易,需要消耗大量的時間和精力,喜歡的請點贊和加關注支援,本人會持續更新一些自認為有用的技術點。