應(yīng)用間跳轉(zhuǎn)
?app應(yīng)用的跳轉(zhuǎn)的原理
?如何實現(xiàn)兩個app應(yīng)用之間的跳轉(zhuǎn)
?如何實現(xiàn)兩個app之間跳轉(zhuǎn)到指定的頁面
一:應(yīng)用的跳轉(zhuǎn)原理
從一個應(yīng)用跳轉(zhuǎn)到另一個應(yīng)用并不陌生,常見于第三方登錄,分享,支付等。集成起來也很簡單,跟著第三方sdk集成文檔,通常sdk集成都需要在工程中配置一堆東西,需要配置的URL Schemes:

1、概念補充
?協(xié)議:雙方互相遵守的一種規(guī)范,只有遵守共同的協(xié)議規(guī)范才能進行彼此的通信。比如最熟悉的網(wǎng)絡(luò)協(xié)議--NSURL
?URL:資源的路徑或地址。在IOS中有一個專門用于包裝資源路徑的類--NSURL
?一個完整URL的組成
例如:http://123.0.0.1/path?page=100
“http://”:協(xié)議類型
“123.0.0.1”:服務(wù)器ip地址
“/path”:資源存放的是路徑
“page=100”:請求的參數(shù)
?NSURL包裝一個完整地址
NSURL *url = [NSURL URLWithString:@"http://123.0.0.1/path?page=100"];
NSLog(@"scheme(協(xié)議):%@",url.scheme);
NSLog(@"host(域名):%@",url.host);
NSLog(@"path(路徑):%@",url.path);
NSLog(@"query(參數(shù)):%@",url.query);
打印結(jié)果如下:
2016-12-0214:50:38.442 TestDemo[5632:406869] scheme(協(xié)議):http2016-12-0214:50:38.442 TestDemo[5632:406869] host(域名):123.0.0.12016-12-0214:50:38.442 TestDemo[5632:406869] path(路徑):/path2016-12-0214:50:38.442 TestDemo[5632:406869] query(參數(shù)):page=100
2:跳轉(zhuǎn)的原理
在iOS中,從一個app打開另一個app,必然牽扯到兩個app之間的通信和交互,像這種涉及到整個應(yīng)用程序?qū)用娴氖虑椋O果有一個專門的類來管理--UIApplication。在ios中UIApplication其實代表的應(yīng)用程序。我們要打開另一個應(yīng)用程序,如何實現(xiàn)呢?
/** 通過應(yīng)用程序打開一個資源路徑@param url 資源路徑的地址@return 返回成功失敗的信息 */
- (BOOL)openURL:(NSURL*)url;
它的一些我們非常熟悉的用法:
//撥打系統(tǒng)電話
NSURL *url = [NSURL URLWithString:@"tel://10086"];?
[[UIApplication sharedApplication] openURL:url];
//發(fā)送系統(tǒng)短信
NSURL *url = [NSURL URLWithString:@"sms://1383838438"];
?[[UIApplication sharedApplication] openURL:url];
只要執(zhí)行以上兩個方法就會從你當(dāng)前的應(yīng)用跳轉(zhuǎn)到系統(tǒng)的撥打電話界面、發(fā)送短信界面,這就是應(yīng)用間的跳轉(zhuǎn)??梢赃@樣理解:撥打電話、發(fā)送短信他兩就是手機自帶的兩個app頁面。
我們仔細分析下傳給它們的NSURL參數(shù),就會發(fā)現(xiàn)NSURL的scheme(協(xié)議)不一樣,打電話時"tel://"協(xié)議,發(fā)短信時"sms://"協(xié)議
一個總結(jié):一個應(yīng)用可以打開另一個應(yīng)用的必然條件是,另一個應(yīng)用必須配置scheme(協(xié)議),這樣應(yīng)用程序才能根據(jù)協(xié)議找到需要打開的應(yīng)用。
二、實現(xiàn)兩個app間的跳轉(zhuǎn)
創(chuàng)建兩個示例demo,TestDemo和Test2Demo,現(xiàn)在需要實現(xiàn)從Test2Demo跳轉(zhuǎn)到TestDemo中
1、在被跳轉(zhuǎn)的TestDemo中配置一個協(xié)議scheme,這里命名為test(名字可以隨意配置,最好是英文并且和項目相關(guān))
targets -> info -> URL Types ->URL Scheme ->填寫協(xié)議

配置協(xié)議
注意:不需要填寫成"test://"
2、在Test2Demo執(zhí)行跳轉(zhuǎn)的方法中實現(xiàn)下面的方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
? ? ? ? ? ?NSURL *url = [NSURL URLWithString:@"test://"];
? ? ? ? ? ?if ([[UIApplication sharedApplication] canOpenURL:url]) { ? ?
? ? ? ? ? ? ? ? ? ?[[UIApplication sharedApplication] openURL:url];??
? ? ? ? ? ?}else{
? ? ? ? ? ? ? ? ? ?NSLog(@"沒有安裝應(yīng)用");
? ? ? ? ? }
}
如果是iOS9.0以下,已經(jīng)大功告成了。但是,如果是iOS9.0以后,請看下一步。
3、配置協(xié)議的白名單
在Test2Demo的info.plist文件中增加一個LSApplicationQueriesSchemes字段,把它設(shè)置為數(shù)組類型,并配置需要跳轉(zhuǎn)的協(xié)議名單

配置協(xié)議的白名單
到此,兩個應(yīng)用間的跳轉(zhuǎn)已經(jīng)完全實現(xiàn),總結(jié)其實只有三步。很多情況下,我們需要跳轉(zhuǎn)到另一個應(yīng)用的指定頁面,如何處理請往下看。
三、跳轉(zhuǎn)到指定的界面
想要跳轉(zhuǎn)到指定的界面,必然是上一個app告訴下一個app(被跳轉(zhuǎn)的app)需要跳轉(zhuǎn)到哪個界面,如何告訴它便涉及到兩個app間的通信。從上面可以知道,兩個app之間的跳轉(zhuǎn)只需要配置一個scheme,然后通過UIApplication調(diào)用它的對象方法openURL:即可實現(xiàn),除此之外再也沒有任何代碼了。而這之間是如何通信的呢?
1、在"test://"協(xié)議后面的域名加上一些字段用來標記需要跳轉(zhuǎn)的界面
//進入更多界面
- (IBAction)intoMore:(id)sender {
NSURL *url = [NSURL URLWithString:@"test://more"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {??
? ? ? [[UIApplication sharedApplication] openURL:url];? ?
?}else{
? ? ? NSLog(@"沒有安裝應(yīng)用");
}
}
//進入設(shè)置界面
- (IBAction)intoSet:(id)sender {
NSURL *url = [NSURL URLWithString:@"test://set"];
??if ([[UIApplication sharedApplication] canOpenURL:url]) { ? ? ?
? ? ? ? ?[[UIApplication sharedApplication] openURL:url];? ? }
else{
? ? ? ? ?NSLog(@"沒有安裝應(yīng)用");
}
}
2、來到被跳轉(zhuǎn)的應(yīng)用TestDemo的AppDelegate類的.m文件中,監(jiān)聽其代理方法application:handleOpenURL:
//當(dāng)應(yīng)用程序?qū)⒁黄渌绦虼蜷_時,會先執(zhí)行此方法,并傳遞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(@"進入更多界面");//到此做界面的跳轉(zhuǎn)?
?? }
if ([url.host isEqualToString:@"set"]) {
? ? ?NSLog(@"進入設(shè)置界面");//到此做界面的跳轉(zhuǎn)? ??
}
returnYES;
}
當(dāng)Test2Demo點擊進入更多界面打印如下:
2016-12-0217:11:17.680 TestDemo[6507:495044] url:test://more2016-12-0217:11:17.681 TestDemo[6507:495044] host:more2016-12-0217:11:17.681 TestDemo[6507:495044] 進入更多界面
當(dāng)Test2Demo點擊進入設(shè)置界面打印如下:
2016-12-0217:10:38.745 TestDemo[6507:495044] url:test://set2016-12-0217:10:38.745 TestDemo[6507:495044] host:set2016-12-0217:10:38.745 TestDemo[6507:495044] 進入設(shè)置界面