一、應用跳轉原理
應用跳轉到另一個應用應該是很常見的需求,比如第三方登錄,微信或者支付寶支付,就需要用到應用間跳轉的技術,做過的可能知道我們需要配置一個URL Schemes:
其實這個URL Schemes就是應用間的一個通訊協議,如同http協議一樣。
舉個栗子:"http://127.0.0.1/path?parameter=參數"
“http://”:協議類型
127.0.0.1:服務器ip地址
“ parameter =參數”:請求的參數
iOS中蘋果是如何管理應用跳轉的呢?其實就是UIApplication下面這個 的API
<pre>
- (BOOL)openURL:(NSURL*)url;
</pre>
它的一些我們非常熟悉的用法:
//撥打系統電話
<pre>
NSURL *url = [NSURL URLWithString:@"tel://10086"];
[[UIApplication sharedApplication] openURL:url];
</pre>
//發送系統短信
<pre>
NSURL *url = [NSURL URLWithString:@"sms://1383838438"];
[[UIApplication sharedApplication] openURL:url];
</pre>
二、實現兩個app間的跳轉
創建兩個示例應用,Test1和Test2,現在需要實現從Test1跳轉到Test2中
1、在被跳轉的TestDemo配置一個協議scheme,這里命名為test(名字可隨意配置,當然最好是英文并且跟你項目相關)
targets -> info -> URL Types ->URL Scheme ->填寫協議
注意:不需要填寫成“test://”可能會導致不可用
2、在Test2中實現一個跳轉方法,方法內部代碼如下:
<pre>
NSURL *url = [NSURL URLWithString:@"myTest://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
else{
NSLog(@"沒有安裝應用");
}
</pre>
針對iOS9.0以后,需要配置協議白名單,用過微信或支付寶支付的肯定很清楚,也都配過。
在Test2的info.plist文件中增加一個LSApplicationQueriesSchemes
字段,把它設置為數組類型,并配置需要跳轉的協議名單
三、跳轉到指定界面
想要跳轉到指定界面,必然是上一個app告訴下一個app(被跳轉的app)需要跳轉到哪個界面,而如何告訴它這里便涉及到兩個app的通信。我們從上面可以知道,兩個app之間的跳轉只需要配置一個scheme,然后通過UIApplication
調用它的對象方法openURL:
即可實現,除此之外再也沒有實現任何代碼了。而這之間是如何通信的呢?
答案依然是協議,請看下面步驟:
- 1、在"myTest://"協議后面的域名加上一些字段用來標記需要跳轉的界面
進入測試界面方法體如下
<pre>
NSURL *url = [NSURL URLWithString:@"myTest://test"];
if ([[UIApplication sharedApplication] canOpenURL:url])
{
[[UIApplication sharedApplication] openURL:url];
}else{
NSLog(@"沒有安裝應用"); }
</pre>
- 2、來到被跳轉的應用Test的AppDelegate監聽其代理方法
application:handleOpenURL:
//當應用程序將要被其他程序打開時,會先執行此方法,并傳遞url過來
iOS9.0之前用下面的方法
application:openURL:options:
//注意適配:9.0后用這個方法:
<pre>
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
NSLog(@"url:%@",url.absoluteString);
NSLog(@"host:%@",url.host);
if ([url.host isEqualToString:@"test"])
{
NSLog(@"進入測試界面");
}
return YES;
}
</pre>