本篇博文將涉及到以下知識點:
- app應用跳轉的原理解析
- 如何實現兩個app應用之間的跳轉
- 如何實現兩個app之間跳轉到指定界面
二、應用跳轉原理
相信從一個應用跳轉到另一個應用大家並不陌生,最常見的莫過於第三方登錄,支付寶支付等等。這些東西大家都耳熟能詳,集成進來也很簡單,跟着第三方sdk集成文檔一步步走下來就是了,通常sdk集成文檔都需要你在工程中配置一堆堆的東西,但是配置的這些東西,你真的明白了嗎?比如下面這個,第三方登錄或分享需要你配置的URL Schemes:

不明白呢沒關系,開始我也不明白,但是這篇博文看完后,相信你會明白的,下面正式進入主題:
1、一些概念的補充
- 協議:雙方互相遵守的一種規范,只有遵守共同的協議規范才能進行彼此的通信。比如我們最熟悉的網絡協議——http協議。
- URL:資源的路徑或地址。在IOS中有一個專門用於包裝資源路徑的類——NSURL。
- 一個完整URL的組成
例如:http://123.0.0.1/path?page=100 “http://”:協議類型 “123.0.0.1”:服務器ip地址 “/path”:資源存放的是路徑 “page=100”:請求的參數
- NSURL包裝一個完整地址
打印結果如下:NSURL *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);
2016-12-02 14:50:38.442 TestDemo[5632:406869] scheme(協議):http 2016-12-02 14:50:38.442 TestDemo[5632:406869] host(域名):123.0.0.1 2016-12-02 14:50:38.442 TestDemo[5632:406869] path(路徑):/path 2016-12-02 14:50:38.442 TestDemo[5632:406869] query(參數):page=100
2、跳轉的原理
在iOS中,從一個app打開另一個app,這必然牽扯到兩個app之間的交互和通信,像這種涉及到整個應用程序層面的事情,蘋果有一個專門的類來管理——UIApplication。在ios中UIApplication其實就是代表着應用程序,這點從它的命名就可以窺之。而我們要打開另一個應用程序,如何實現呢?
很簡單,其實就是UIApplication下面這個 的API
/** 通過應用程序打開一個資源路徑 @param url 資源路徑的地址 @return 返回成功失敗的信息 */ - (BOOL)openURL:(NSURL*)url;
它的一些我們非常熟悉的用法:
//撥打系統電話 NSURL *url = [NSURL URLWithString:@"tel://10086"]; [[UIApplication sharedApplication] openURL:url];
//發送系統短信 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執行跳轉的方法中實現下面方法
-(void)touchesBegan:(NSSet<UITouch *> *)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://"協議后面的域名加上一些字段用來標記需要跳轉的界面
//進入更多界面 - (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:
//當應用程序將要被其他程序打開時,會先執行此方法,並傳遞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點擊進入更多界面打印如下:
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點擊進入設置界面打印如下:
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] 進入設置界面
原文鏈接:http://www.jianshu.com/p/6b746f95b568
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。