
前言
iOS開發(fā)過程中,遇到的應(yīng)用間跳轉(zhuǎn)的情景大體是下面的情況
- 使用第三方用戶登錄,跳轉(zhuǎn)到需授權(quán)的App或跳轉(zhuǎn)到分享app的對應(yīng)頁面
需要用戶授權(quán),還需要"返回到調(diào)用的程序,同時(shí)返回授權(quán)的用戶名、密碼";- 應(yīng)用程序推廣,跳轉(zhuǎn)到另一個(gè)應(yīng)用程序(本機(jī)已經(jīng)安裝);
- 跳轉(zhuǎn)到iTunes并顯示應(yīng)用程序下載頁面(本機(jī)沒有安裝);
- 第三方支付,跳轉(zhuǎn)到第三方支付App,如支付寶支付,微信支付;
- 使用系統(tǒng)內(nèi)置程序,如跳轉(zhuǎn)到打電話、發(fā)短信、發(fā)郵件、Safari等
那么應(yīng)用之間的跳轉(zhuǎn)到底有哪些值得注意的地方呢,本文做一個(gè)簡單的歸納。
原理
在應(yīng)用A跳轉(zhuǎn)到應(yīng)用B,則給A、B自身自定義URL Schemes(自定義的協(xié)議頭)后,通過在A中處理B的URL Schemes,就可以在A中啟動B了。
不過值得注意的是:iOS9之后,應(yīng)用間跳轉(zhuǎn)需要在Info.plsit中設(shè)置白名單。以 ‘LSApplicationQueriesSchemes’為Key值,對應(yīng)數(shù)組value中添加白名單應(yīng)用的URL Schemes即可。若未設(shè)置白名單,會報(bào)錯。
Xcode error
-canOpenURL: failed for URL: "應(yīng)用B的URL Schemes://" - error: "This app is not allowed to query for scheme 應(yīng)用B"
在info.plist中這樣設(shè)置即可.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>nihao</string>
</array>
栗子一:應(yīng)用A跳轉(zhuǎn)到應(yīng)用B
需要在B應(yīng)用中如此設(shè)置

A中如此跳轉(zhuǎn)設(shè)置
if ( [[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"nihao://"]]) {
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"nihao://"]];
}else{
NSLog(@"未安裝");
}
栗子二:應(yīng)用A跳轉(zhuǎn)到應(yīng)用B指定界面
A中如此跳轉(zhuǎn)設(shè)置
if ( [[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"nihao://one"]]) {
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"nihao://one"]];
}else{
NSLog(@"未安裝");
}
B中如此的設(shè)置
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
UINavigationController *nav = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([url.absoluteString containsString:@"one"]) {
ONEVC *subV = [[ONEVC alloc]init];
[nav pushViewController:subV animated:YES];
}
return YES;
}
此處的nihao://one 中的 one 只是一種標(biāo)示。
栗子三:應(yīng)用B反跳轉(zhuǎn)回應(yīng)用A
步驟分析:從A跳到B再跳轉(zhuǎn)回A,那么在A跳轉(zhuǎn)到B的時(shí)候,還應(yīng)將應(yīng)用A的URL Schemes傳遞過來。這樣我們才能指定返回哪個(gè)應(yīng)用程序(iOS9之后,該應(yīng)用一定要添加到白名單內(nèi))
指定一個(gè)傳遞URL的規(guī)則:協(xié)議頭://應(yīng)用B的URL Schemes?應(yīng)用A的URL Schemes。即:AppB://One?AppA。
說明
AppB是跳轉(zhuǎn)過來的應(yīng)用App-B的URL Schemes;
One是用來區(qū)別跳轉(zhuǎn)頁面的標(biāo)識;
? 是分割符;
AppA是跳轉(zhuǎn)回的應(yīng)用App-A的URL Schemes
2、我們根據(jù)傳遞來的數(shù)據(jù),進(jìn)行反跳回去。跳轉(zhuǎn)頁面設(shè)置一個(gè)屬性保存?zhèn)鬟f的字符串
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
UINavigationController *nav = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([url.absoluteString containsString:@"one"]) {
ONEVC *subV = [[ONEVC alloc]init];
subV.urlStr = url.absoluteString; //保存 傳過來的跳轉(zhuǎn)信息
[nav pushViewController:subV animated:YES];
}
return YES;
}
在B應(yīng)用的ONEVC的需要反跳轉(zhuǎn)的地方
NSString *oneUrlScheme = [[[self.urlStr componentsSeparatedByString:@"?"] lastObject] stringByAppendingString:@"://"];
if ( [[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:oneUrlScheme]]) {
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:oneUrlScheme]];
}else{
NSLog(@"無法跳轉(zhuǎn)");
}
調(diào)用的iPhone本機(jī)上的應(yīng)用
-
調(diào)用自帶郵件
[[UIApplicationsharedApplication] openURL :[NSURLURLWithString:@“mailto://admin@hzlzh.com” ]];
-
調(diào)用電話
[[UIApplication sharedApplication ] openURL :[NSURLURLWithString:@“tel:// 8008808888” ]];
-
調(diào)用短信
[[UIApplicationsharedApplication] openURL :[NSURL URLWithString :@“sms:// 800888” ]]; -
調(diào)用自帶瀏覽器safari
[[UIApplicationsharedApplication] openURL :[NSURLURLWithString:@“http://www.hzlzh.com” ]]; -
調(diào)用遠(yuǎn)程
[[UIApplicationsharedApplication] openURL :[NSURL URLWithString :@“remote:// fff” ]];