一、前言
涉及到以下知識點:
- 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(@"沒有安裝應用");
}
}
如果是9.0以上,請看下一步。
3、配置協議白名單
在Test2Demo的info.plist文件中增加一個LSApplicationQueriesSchemes字段,把它設置爲數組類型,並配置需要跳轉的協議名單
配置協議白名單
到此,兩個應用間的跳轉已經完全實現,但如果需要跳轉到某個應用的指定界面,想知道怎麼處理請接着往下看。
四、跳轉到指定界面
想要跳轉到指定界面,必然是上一個app告訴下一個app(被跳轉的app)需要跳轉到哪個界面,依然是通過協議來實現,請看下面步驟:
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] 進入設置界面
這就實現了從一個app跳轉到另一個app指定的界面了