應用間跳轉
?app應用的跳轉的原理
?如何實現(xiàn)兩個app應用之間的跳轉
?如何實現(xiàn)兩個app之間跳轉到指定的頁面
一:應用的跳轉原理
從一個應用跳轉到另一個應用并不陌生,常見于第三方登錄霸褒,分享,支付等盈蛮。集成起來也很簡單废菱,跟著第三方sdk集成文檔,通常sdk集成都需要在工程中配置一堆東西,需要配置的URL Schemes:
1殊轴、概念補充
?協(xié)議:雙方互相遵守的一種規(guī)范衰倦,只有遵守共同的協(xié)議規(guī)范才能進行彼此的通信。比如最熟悉的網絡協(xié)議--NSURL
?URL:資源的路徑或地址梳凛。在IOS中有一個專門用于包裝資源路徑的類--NSURL
?一個完整URL的組成
例如:http://123.0.0.1/path?page=100
“http://”:協(xié)議類型
“123.0.0.1”:服務器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);
打印結果如下:
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:跳轉的原理
在iOS中耿币,從一個app打開另一個app,必然牽扯到兩個app之間的通信和交互梳杏,像這種涉及到整個應用程序層面的事情韧拒,蘋果有一個專門的類來管理--UIApplication。在ios中UIApplication其實代表的應用程序十性。我們要打開另一個應用程序叛溢,如何實現(xiàn)呢?
/** 通過應用程序打開一個資源路徑@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í)行以上兩個方法就會從你當前的應用跳轉到系統(tǒng)的撥打電話界面劲适、發(fā)送短信界面楷掉,這就是應用間的跳轉∠际疲可以這樣理解:撥打電話烹植、發(fā)送短信他兩就是手機自帶的兩個app頁面。
我們仔細分析下傳給它們的NSURL參數(shù)愕贡,就會發(fā)現(xiàn)NSURL的scheme(協(xié)議)不一樣草雕,打電話時"tel://"協(xié)議,發(fā)短信時"sms://"協(xié)議
一個總結:一個應用可以打開另一個應用的必然條件是固以,另一個應用必須配置scheme(協(xié)議)墩虹,這樣應用程序才能根據(jù)協(xié)議找到需要打開的應用。
二憨琳、實現(xiàn)兩個app間的跳轉
創(chuàng)建兩個示例demo,TestDemo和Test2Demo诫钓,現(xiàn)在需要實現(xiàn)從Test2Demo跳轉到TestDemo中
1、在被跳轉的TestDemo中配置一個協(xié)議scheme,這里命名為test(名字可以隨意配置篙螟,最好是英文并且和項目相關)
targets -> info -> URL Types ->URL Scheme ->填寫協(xié)議
配置協(xié)議
注意:不需要填寫成"test://"
2菌湃、在Test2Demo執(zhí)行跳轉的方法中實現(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(@"沒有安裝應用");
? ? ? ? ? }
}
如果是iOS9.0以下,已經大功告成了遍略。但是惧所,如果是iOS9.0以后,請看下一步墅冷。
3纯路、配置協(xié)議的白名單
在Test2Demo的info.plist文件中增加一個LSApplicationQueriesSchemes字段,把它設置為數(shù)組類型寞忿,并配置需要跳轉的協(xié)議名單
配置協(xié)議的白名單
到此驰唬,兩個應用間的跳轉已經完全實現(xiàn),總結其實只有三步。很多情況下叫编,我們需要跳轉到另一個應用的指定頁面辖佣,如何處理請往下看。
三搓逾、跳轉到指定的界面
想要跳轉到指定的界面卷谈,必然是上一個app告訴下一個app(被跳轉的app)需要跳轉到哪個界面,如何告訴它便涉及到兩個app間的通信霞篡。從上面可以知道世蔗,兩個app之間的跳轉只需要配置一個scheme,然后通過UIApplication調用它的對象方法openURL:即可實現(xiàn),除此之外再也沒有任何代碼了朗兵。而這之間是如何通信的呢污淋?
1、在"test://"協(xié)議后面的域名加上一些字段用來標記需要跳轉的界面
//進入更多界面
- (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文件中寸爆,監(jiān)聽其代理方法application:handleOpenURL:
//當應用程序將要被其他程序打開時,會先執(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(@"進入更多界面");//到此做界面的跳轉?
?? }
if ([url.host isEqualToString:@"set"]) {
? ? ?NSLog(@"進入設置界面");//到此做界面的跳轉? ??
}
returnYES;
}
當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] 進入更多界面
當Test2Demo點擊進入設置界面打印如下:
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] 進入設置界面