在iOS開發的過程當中,咱們常常會遇到須要從一個應用程序A跳轉到另外一個應用程序B的場景。這就須要咱們掌握iOS應用程序之間的相互跳轉知識。html
下面來看看咱們在開發過程當中遇到的應用場景。ios
那麼咱們如何實現應用間的相互跳轉呢?先來看下原理。數組
在iOS中打開一個應用程序只須要拿到這個應用程序的協議頭便可,因此咱們只需配置應用程序的協議頭便可。微信
假設有應用A和應用B兩個應用,如今須要從應用A跳轉到應用B中。app
具體怎麼作呢,下面一步步來教你,先來個簡單點的:從應用A跳轉到應用B。ide
選擇項目App-B -> TARGETS -> Info -> URL Types -> URL Schemes,設置App-B的URL Schemes爲AppB。學習
在應用程序App-A中添加一個用來點擊跳轉的Button,並監聽點擊事件,添加跳轉代碼。
- (IBAction)jumpToAppB:(id)sender { // 1.獲取應用程序App-B的URL Scheme NSURL *appBUrl = [NSURL URLWithString:@"AppB://"]; // 2.判斷手機中是否安裝了對應程序 if ([[UIApplication sharedApplication] canOpenURL:appBUrl]) { // 3. 打開應用程序App-B [[UIApplication sharedApplication] openURL:appBUrl]; } else { NSLog(@"沒有安裝"); } }
若是是iOS9以前的模擬器或是真機,那麼在相同的模擬器中前後運行App-B、App-A,點擊按鈕,就能夠實現跳轉了。
若是是iOS9以後的模擬器或是真機,那麼則須要再在應用程序App-A中將App-B的URL Schemes添加到白名單中,緣由和作法以下。
canOpenURL:
方法,該方法所涉及到的 URL Schemes 必須在"Info.plist"中將它們列爲白名單,不然不能使用。key叫作LSApplicationQueriesSchemes ,鍵值內容是對應應用程序的URL Schemes。
蘋果爲何要這麼作?
在 iOS9 以前,你可使用 canOpenURL: 監測用戶手機裏到底裝沒裝微信,裝沒裝微博。可是也有一些別有用心的 App ,這些 App 有一張經常使用 App 的 URL scheme,而後他們會屢次調用canOpenURL: 遍歷該表,來監測用戶手機都裝了什麼 App ,好比這個用戶裝了叫「大姨媽」的App,你就能夠知道這個用戶是女性,你就能夠只推給這個用戶女性用品的廣告。這是侵犯用戶隱私的行爲。
具體作法就是在App-A的Info文件中,添加LSApplicationQueriesSchemes數組,而後添加鍵值爲AppB的字符串。
添加白名單以後在相同的模擬器中前後運行App-B、App-A,點擊按鈕,就能夠實現跳轉了。
具體效果以下圖所示。
下邊學習如下從應用A跳轉到應用B的特定界面。
不少時候,咱們作應用程序之間的跳轉並不僅是跳轉到其餘程序就能夠了,而是要跳轉到其餘程序的特定頁面上。好比咱們在瀏覽網頁時,會有分享到微信朋友圈或是分享給微信朋友,這就須要跳轉到微信朋友圈界面或是微信朋友選擇界面。
具體如何作呢?
Page1
和Page2
。這裏用導航控制器Push兩個ViewController,經過Storyboard Segue設置兩個ViewController的標識符綁定,分別爲"homeToPage1"和"homeToPage2"。- (IBAction)jumpToAppBPage1:(id)sender { // 1.獲取應用程序App-B的Page1頁面的URL NSURL *appBUrl = [NSURL URLWithString:@"AppB://Page1"]; // 2.判斷手機中是否安裝了對應程序 if ([[UIApplication sharedApplication] canOpenURL:appBUrl]) { // 3. 打開應用程序App-B的Page1頁面 [[UIApplication sharedApplication] openURL:appBUrl]; } else { NSLog(@"沒有安裝"); } } - (IBAction)jumpToAppBPage2:(id)sender { // 1.獲取應用程序App-B的Page2頁面的URL NSURL *appBUrl = [NSURL URLWithString:@"AppB://Page2"]; // 2.判斷手機中是否安裝了對應程序 if ([[UIApplication sharedApplication] canOpenURL:appBUrl]) { // 3. 打開應用程序App-B的Page2頁面 [[UIApplication sharedApplication] openURL:appBUrl]; } else { NSLog(@"沒有安裝"); } }
3.在應用App-B中經過AppDelegate
監聽跳轉,進行判斷,執行不一樣頁面的跳轉
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // 1.獲取導航欄控制器 UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController; // 2.得到主控制器 ViewController *mainVc = [rootNav.childViewControllers firstObject]; // 3.每次跳轉前必須是在跟控制器(細節) [rootNav popToRootViewControllerAnimated:NO]; // 4.根據字符串關鍵字來跳轉到不一樣頁面 if ([url.absoluteString containsString:@"Page1"]) { // 跳轉到應用App-B的Page1頁面 // 根據segue標示進行跳轉 [mainVc performSegueWithIdentifier:@"homeToPage1" sender:nil]; } else if ([url.absoluteString containsString:@"Page2"]) { // 跳轉到應用App-B的Page2頁面 // 根據segue標示進行跳轉 [mainVc performSegueWithIdentifier:@"homeToPage2" sender:nil]; } return YES; }
具體效果以下:
協議頭://應用B的URL Schemes?應用A的URL Schemes
。即:AppB://Page1?AppA
。AppDelegate
執行不一樣頁面的跳轉。在對應方法中咱們能夠拿到完整的URL,在主控制器ViewController中設定一個屬性,將該URL保存在主控制器中。- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
方法獲取將要跳轉的頁面控制器。@"AppB://?AppA"
、@"AppB://Page1?AppA"
、@"AppB://Page2?AppA"
@property (nonatomic, copy) NSString *urlString;
,並在App-B中經過AppDelegate
中保存完整的URL。@property (nonatomic, copy) NSString *urlString;
,用於接受、截取出跳轉回的應用(即App-A)的URL Schemes,執行跳轉。- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
方法。- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"homeToPage1"]) { // 得到將要跳轉的界面Page1的控制器 Page1ViewController *Page1Vc = segue.destinationViewController; // 保存完整的App-A的URL給跳轉界面Page1 Page1Vc.urlString = self.urlString; } else if ([segue.identifier isEqualToString:@"homeToPage2"]) { // 得到將要跳轉的界面Page2的控制器 Page2ViewController *Page2Vc = segue.destinationViewController; // 保存完整的App-A的URL給跳轉界面Page1 Page2Vc.urlString = self.urlString; } }
- (IBAction)page1BackToAppA:(id)sender { // 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]; } }
- Page2ViewController.m
- (IBAction)page2BackToAppA:(id)sender { // 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]; } }
具體效果以下: