一.原理:
在iOS中打開一個應用程序只需要拿到這個應用程序的協議頭即可,也就是在應用中info下面
URL Types
的URL Schemes
如下圖
二.實例之ApplicationA跳轉至ApplicationB(以下簡稱A B).
(一).先敲重點總結,再去驗證
A跳轉到B,需要做幾個準備條件, 拿到B的URL Schemes,保證A和B都已經安裝,在A中的info.plist給B添加白名單,最后加上openUrl的代碼就行了.
現在開始操作:
應用間跳轉,所以首先一定要有兩個應用,我這里是ApplicationA和ApplicationB,然后布局需要的頁面,布局完的頁面長下圖的樣子,足以滿足需求
1.首先A->B 首先要知道B的URl Scheme,所以先去B里面設置自己的協議頭,設置為
AppB
- 原理上知道了B的URl Scheme就可以訪問B了,那繼續編寫訪問代碼,看是否可以,在A 的
跳轉至ApplicationB
按鈕的點擊事件里面寫
- (IBAction)applicationBAction:(id)sender {
// 訪問ApplicationB的URLSchemes
NSURL *url = [NSURL URLWithString:@"AppB://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
NSLog(@"跳轉成功");
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
NSLog(@"跳轉失敗");
}
}
3.A中添加白名單.
結果如上:"This app is not allowed to query for scheme appb"
跳轉失敗,提示無權限.這個原因是因為為了提高安全性,在iOS9后,如果使用 canOpenURL:方法,該方法所涉及到的 URL Schemes 必須在"Info.plist"中將它們列為白名單,否則不能使用。key叫做LSApplicationQueriesSchemes ,鍵值內容是對應應用程序的URL Schemes.既然如此就操作起來 在A中的info.plist加白名單,如下圖
4.記得安裝應用B
添加完白名單又出現"The operation couldn’t be completed. (OSStatus error -10814.)"
的錯誤,是因為忘記安裝B應用了.安裝后展示結果如下
二.實例之A跳轉至B的指定頁面
(二)
下面要實現A跳轉到B的blue頁,總過程是在A的跳轉方法里寫openUrl,在B的delegate的openURl方法里監聽截取到的url并做頁面跳轉.不多說直接貼代碼和結果圖
// A中`跳轉至ApplicationB blue頁`按鈕的點擊方法
- (IBAction)jumpAppBBlue:(id)sender {
NSURL *url = [NSURL URLWithString:@"AppB://blue"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
}
}
// B中Appdelegate.m中的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// 1.獲取導航欄控制器
UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;
// 2.獲得主控制器
ViewController *mainVc = [rootNav.childViewControllers firstObject];
// 3.每次跳轉前必須是在根控制器(細節)
[rootNav popToRootViewControllerAnimated:NO];
// 4.根據字符串關鍵字來跳轉到不同頁面
if ([url.absoluteString containsString:@"blue"]) { // 跳轉到應用App-B的blue頁面
BlueViewController *blue = [[BlueViewController alloc] init];
//進行跳轉
[mainVc.navigationController pushViewController:blue animated:YES];
}
return YES;
}
二.實例之A跳轉至B的指定頁面, B跳轉至A
(三) 若想B跳轉回A ,大體流程是這樣的:首先 A要添加自己的URL Schemes例如為
AppA
,其次要在B的info.plist添加為A添加白名單這是準備工作,最后要在A跳轉至B的時候將A的URLSchemes攜帶過去,在B的openURl方法中監聽到A的URLSchemes,并在跳轉到指定blue頁時候將URLSchemes,傳到blue頁,再在blue頁的跳轉至ApplicationA
的點擊方法中訪問A
- 準備工作: A要添加自己的URL Schemes為
AppA
,在B的info.plist添加為A添加白名單,此處不貼圖
2.在A跳轉B的方法中,攜帶A的URLSchemes
// A中`跳轉至ApplicationB blue頁`按鈕的點擊方法
- (IBAction)jumpAppBBlue:(id)sender {
// url中攜帶A的UrlSchemes-->AppA
NSURL *url = [NSURL URLWithString:@"AppB://blue?AppA"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
}
}
- 在B的Appdelegate中的openUrl中將傳遞的整個url也就是
AppB://blue?AppA
,傳遞到blue頁
// B中Appdelegate.m中的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// 1.獲取導航欄控制器
UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;
// 2.獲得主控制器
ViewController *mainVc = [rootNav.childViewControllers firstObject];
// 3.每次跳轉前必須是在根控制器(細節)
[rootNav popToRootViewControllerAnimated:NO];
// 4.根據字符串關鍵字來跳轉到不同頁面
if ([url.absoluteString containsString:@"blue"]) { // 跳轉到應用App-B的blue頁面
BlueViewController *blue = [[BlueViewController alloc] init];
// 將整個url也就是 `AppB://blue?AppA`,傳遞到blue頁
blue.urlString = url.absoluteString;
//進行跳轉
[mainVc.navigationController pushViewController:blue animated:YES];
}
return YES;
}
- 在B的blue頁中,截取到url中的
AppA
,進而點擊跳轉到應用A
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
// Do any additional setup after loading the view.
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 200, 50)];
[btn setTitle:@"跳轉至 Application A" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
- (void)btnAction {
// 1.拿到對應應用程序的URL Scheme
NSString *urlSchemeString = [[self.urlString componentsSeparatedByString:@"?"] lastObject];
NSString *urlString = [urlSchemeString stringByAppendingString:@"://"];
// 2.獲取對應應用程序的URL
NSURL *url = [NSURL URLWithString:urlString];
// 3.判斷是否可以打開
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}
}
5.結果如下圖
實例之A跳轉至B的指定頁面, B跳轉至A.gif