iOS_應(yīng)用間相互跳轉(zhuǎn)

資料來源 & Demo
CocoaChina 一個(gè)強(qiáng)大的學(xué)習(xí)網(wǎng)址?。?!

1. 應(yīng)用間相互跳轉(zhuǎn)簡介

在 iOS 開發(fā)的過程中,我們經(jīng)常會(huì)遇到需要從一個(gè) 應(yīng)用程序A 跳轉(zhuǎn)到另一個(gè) 應(yīng)用程序B 的場景。這就需要我們掌握 iOS 應(yīng)用程序之間的相互跳轉(zhuǎn)知識。

2. 應(yīng)用間相互跳轉(zhuǎn)應(yīng)用場景

使用第三方用戶登錄,跳轉(zhuǎn)到需授權(quán)的App。如QQ登錄,微信登錄等。
需要用戶授權(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,如支付寶支付,微信支付。
內(nèi)容分享,跳轉(zhuǎn)到分享App的對應(yīng)頁面,如分享給微信好友、分享給微信朋友圈、分享到微博。
顯示位置、地圖導(dǎo)航,跳轉(zhuǎn)到地圖應(yīng)用。
使用系統(tǒng)內(nèi)置程序,跳轉(zhuǎn)到打電話、發(fā)短信、發(fā)郵件、Safari打開網(wǎng)頁等內(nèi)置App中。

3. 應(yīng)用間相互跳轉(zhuǎn)實(shí)現(xiàn)原理

在 iOS 中打開一個(gè)應(yīng)用程序只需要拿到這個(gè)應(yīng)用程序的 ** 協(xié)議頭 ** 即可,所以我們只需配置應(yīng)用程序的協(xié)議頭即可。
假設(shè)有 應(yīng)用A 和 應(yīng)用B 兩個(gè)應(yīng)用,現(xiàn)在需要從 應(yīng)用A 跳轉(zhuǎn)到 應(yīng)用B 中。
原理: 通過設(shè)置跳轉(zhuǎn)到應(yīng)用B的URL Schemes(自定義的協(xié)議頭),應(yīng)用B將其自身“綁定”到一個(gè)自定義 URL Schemes 上,就可以從 應(yīng)用A 中利用 應(yīng)用B 的 URL Schemes 啟動(dòng)應(yīng)用B了。

4. 應(yīng)用A跳轉(zhuǎn)到應(yīng)用B

1、首先我們用Xcode創(chuàng)建兩個(gè)iOS應(yīng)用程序項(xiàng)目,項(xiàng)目名稱分別為AppA、AppB。
2、選擇項(xiàng)目AppB -> TARGETS -> Info -> URL Types -> URL Schemes,設(shè)置AppB的URL Schemes為 AppB。

3、在應(yīng)用程序App-A中添加一個(gè)用來點(diǎn)擊跳轉(zhuǎn)的Button,并監(jiān)聽點(diǎn)擊事件,添加跳轉(zhuǎn)代碼。

相關(guān)代碼

- (IBAction)jumbToAPPB:(id)sender {
    // 1、獲取應(yīng)用程序APPB 的 URL Scheme
    NSURL *appBUrl = [NSURL URLWithString:@"APPB://"];
    // 2、判斷手機(jī)中是否安裝了對應(yīng)的程序
    if ([[UIApplication sharedApplication] canOpenURL:appBUrl]) {
        // 3、打開應(yīng)用程序 APPB
        [[UIApplication sharedApplication] openURL:appBUrl options:@{} completionHandler:nil];
    } else {
        NSLog(@"沒有安裝");
    }
}

4、如果是 iOS 9 之前的模擬器或是真機(jī),那么在相同的模擬器中先后運(yùn)行 AppB、AppA,點(diǎn)擊按鈕,就可以實(shí)現(xiàn)跳轉(zhuǎn)了。
5、如果是 iOS 9 之后的模擬器或是真機(jī),那么則需要再在應(yīng)用程序 AppA 中將 AppB 的 URL Schemes 添加到白名單中,原因和做法如下:
iOS 9 引入了白名單的概念。
在 iOS 9 中,如果使用 canOpenURL: 方法,該方法所涉及到的 URL Schemes 必須在"Info.plist"中將它們列為白名單,否則不能使用。key叫做LSApplicationQueriesSchemes ,鍵值內(nèi)容是對應(yīng)應(yīng)用程序的 URL Schemes。

具體做法就是在 AppA 的 Info 文件中,添加 LSApplicationQueriesSchemes 數(shù)組,然后添加鍵值為 AppB 的字符串。

添加 LSApplicationQueriesSchemes 數(shù)組,然后添加鍵值為 AppB 的字符串
添加白名單之后在相同的模擬器中先后運(yùn)行 AppB、AppA,點(diǎn)擊按鈕,就可以實(shí)現(xiàn)跳轉(zhuǎn)了。
具體效果如下圖所示。

5. 應(yīng)用A 跳轉(zhuǎn)到 應(yīng)用B 的特定界面

很多時(shí)候,我們做應(yīng)用程序之間的跳轉(zhuǎn)并不只是跳轉(zhuǎn)到其他程序就可以了,而是要跳轉(zhuǎn)到其他程序的特定頁面上。比如我們在瀏覽網(wǎng)頁時(shí),會(huì)有分享到微信朋友圈或是分享給微信朋友,這就需要跳轉(zhuǎn)到微信朋友圈界面或是微信朋友選擇界面。

具體如何做呢?

1、首先我們先來為 AppB 搭建兩個(gè)頁面 Page1 和 Page2。這里用導(dǎo)航控制器 Push 兩個(gè)ViewController,通過 Storyboard Segue設(shè)置兩個(gè) ViewController 的標(biāo)識符綁定,分別為 "homeToPage1" 和 "homeToPage2"。

搭建兩個(gè)頁面Page1和Page2

設(shè)置Page1ViewController的標(biāo)識符

2、在應(yīng)用程序AppA中添加兩個(gè)用來點(diǎn)擊跳轉(zhuǎn)的 Button,一個(gè)跳轉(zhuǎn)到Page1,一個(gè)跳轉(zhuǎn)到 Page2,并監(jiān)聽點(diǎn)擊事件,添加跳轉(zhuǎn)代碼。

添加兩個(gè)跳轉(zhuǎn)按鈕
- (IBAction)jumbToAPPBPage1:(id)sender {
    // 1、獲取應(yīng)用程序APPB 的 URL Scheme
    NSURL *appBUrl = [NSURL URLWithString:@"APPB://Page1"];
    // 2、判斷手機(jī)中是否安裝了對應(yīng)的程序
    if ([[UIApplication sharedApplication] canOpenURL:appBUrl]) {
        // 3、打開應(yīng)用程序 APPB
        [[UIApplication sharedApplication] openURL:appBUrl options:@{} completionHandler:nil];
    } else {
        NSLog(@"沒有安裝");
    }
}

- (IBAction)jumbToAPPBPage2:(id)sender {
    // 1、獲取應(yīng)用程序APPB 的 URL Scheme
    NSURL *appBUrl = [NSURL URLWithString:@"APPB://Page2"];
    // 2、判斷手機(jī)中是否安裝了對應(yīng)的程序
    if ([[UIApplication sharedApplication] canOpenURL:appBUrl]) {
        // 3、打開應(yīng)用程序 APPB
        [[UIApplication sharedApplication] openURL:appBUrl options:@{} completionHandler:nil];
    } else {
        NSLog(@"沒有安裝");
    }
}

3、在應(yīng)用App-B中通過AppDelegate監(jiān)聽跳轉(zhuǎn),進(jìn)行判斷,執(zhí)行不同頁面的跳轉(zhuǎn)

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    
    // 1.獲取導(dǎo)航欄控制器
    UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;
    // 2.獲得主控制器
    ViewController *mainVc = [rootNav.childViewControllers firstObject];
    
    // 3.每次跳轉(zhuǎn)前必須是在跟控制器(細(xì)節(jié))
    [rootNav popToRootViewControllerAnimated:NO];
    
    // 4.根據(jù)字符串關(guān)鍵字來跳轉(zhuǎn)到不同頁面
    if ([url.absoluteString containsString:@"Page1"]) { // 跳轉(zhuǎn)到應(yīng)用AppB的Page1頁面
        // 根據(jù)segue標(biāo)示進(jìn)行跳轉(zhuǎn)
        [mainVc performSegueWithIdentifier:@"homeToPage1" sender:nil];
    } else if ([url.absoluteString containsString:@"Page2"]) { // 跳轉(zhuǎn)到應(yīng)用AppB的Page2頁面
        // 根據(jù)segue標(biāo)示進(jìn)行跳轉(zhuǎn)
        [mainVc performSegueWithIdentifier:@"homeToPage2" sender:nil];
    }
    return YES;
}

具體效果如下:

AppA 跳轉(zhuǎn)到 AppB 的特定界面


6、從 應(yīng)用B 跳轉(zhuǎn)回 應(yīng)用A

1. 步驟分析:

我們想要從 應(yīng)用B 再跳轉(zhuǎn)回 應(yīng)用A,那么在跳轉(zhuǎn)到 應(yīng)用B 的時(shí)候,還應(yīng)將 應(yīng)用A 的URL Schemes 傳遞過來。這樣我們才能判斷應(yīng)該 跳轉(zhuǎn)回 哪個(gè)應(yīng)用程序。
這樣我們指定一個(gè)傳遞 URL的規(guī)則:協(xié)議頭:// 應(yīng)用B 的URL Schemes? 應(yīng)用A的URL Schemes。即:AppB://Page1?AppA
說明:
AppB 是跳轉(zhuǎn)過來的 應(yīng)用AppB 的URL Schemes;
Page1 是用來區(qū)別跳轉(zhuǎn)頁面的標(biāo)識;
? 是分割符;
AppA 是跳轉(zhuǎn)回的 應(yīng)用 AppA 的 URL Schemes

2、我們根據(jù)傳遞來的數(shù)據(jù),進(jìn)行反跳回去。

2.1、之前我們在 應(yīng)用AppB 中通過 AppDelegate 執(zhí)行不同頁面的跳轉(zhuǎn)。在對應(yīng)方法中我們可以拿到完整的 URL,在主控制器ViewController中設(shè)定一個(gè)屬性,將該URL保存在主控制器中。
2.1、在主控制器中我們可以通過 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender; 方法獲取將要跳轉(zhuǎn)的頁面控制器。
2.3、在將要跳轉(zhuǎn)的頁面控制器中定義一個(gè)屬性,用于接受、截取出跳轉(zhuǎn)回的應(yīng)用(即AppA)的URL Schemes,執(zhí)行跳轉(zhuǎn)。

3、具體步驟:

3.1、準(zhǔn)備步驟:
3.1.1、因?yàn)槲覀兿胍D(zhuǎn)回 應(yīng)用A,首先我們要先設(shè)置應(yīng)用AppA的URL Schemes,將其設(shè)置為AppA。同時(shí)在應(yīng)用AppB中添加白名單。具體操作和之前相似。
3.1.2、在AppB項(xiàng)目中的Page1和Page2兩個(gè)頁面各添加一個(gè)Button,用于跳轉(zhuǎn)回 AppA。同時(shí)添加 Page1 和 Page2 的頁面控制器 Page1ViewController 和Page2ViewController。



添加Page1和Page2的頁面控制器Page1ViewController和Page2ViewController

4、 實(shí)現(xiàn)步驟

4.1、在 應(yīng)用AppA 中修改傳遞的URL。
分別修改為:@"APPB://?APPA"、@"APPB://Page1?APPA"、@"APPB://Page2?APPA"

4.2、在 AppB 的主控制器 ViewController中增加一條屬性 @property (nonatomic, copy) NSString *urlString;,并在AppB中通過AppDelegate中保存完整的URL。

4.3、在將要跳轉(zhuǎn)的頁面控制器 Page1ViewController 和 Page2ViewController 中定義一個(gè)屬性@property (nonatomic, copy) NSString *urlString;,用于接受、截取出跳轉(zhuǎn)回的應(yīng)用(即AppA)的 URL Schemes,執(zhí)行跳轉(zhuǎn)。

4.4、重寫App-B的主控制器的- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if ([segue.identifier isEqualToString:@"homeToPage1"]) {
       // 獲得將要跳轉(zhuǎn)的界面Page1的控制器
       Page1ViewController *Page1Vc = segue.destinationViewController;
       // 保存完整的App-A的URL給跳轉(zhuǎn)界面Page1
       Page1Vc.urlString = self.urlString;
   } else if ([segue.identifier isEqualToString:@"homeToPage2"]) {
       // 獲得將要跳轉(zhuǎn)的界面Page2的控制器
       Page2ViewController *Page2Vc = segue.destinationViewController;
       // 保存完整的App-A的URL給跳轉(zhuǎn)界面Page1
       Page2Vc.urlString = self.urlString;
   }
}
5、在對應(yīng)界面控制器Page1ViewController和Page2ViewController中實(shí)現(xiàn)跳轉(zhuǎn)代碼
- Page1ViewController.m
- (IBAction)page1BackToAppA:(id)sender {
   // 1.拿到對應(yīng)應(yīng)用程序的URL Scheme
   NSString *urlSchemeString = [[self.urlString componentsSeparatedByString:@"?"] lastObject];
   NSString *urlString = [urlSchemeString stringByAppendingString:@"://"];

   // 2.獲取對應(yīng)應(yīng)用程序的URL
   NSURL *url = [NSURL URLWithString:urlString];

   // 3.判斷是否可以打開
   if ([[UIApplication sharedApplication] canOpenURL:url]) {
       [[UIApplication sharedApplication] openURL:url];
   }
}
- Page2ViewController.m
- (IBAction)page2BackToAppA:(id)sender {
   // 1.拿到對應(yīng)應(yīng)用程序的URL Scheme
   NSString *urlSchemeString = [[self.urlString componentsSeparatedByString:@"?"] lastObject];
   NSString *urlString = [urlSchemeString stringByAppendingString:@"://"];

   // 2.獲取對應(yīng)應(yīng)用程序的URL
   NSURL *url = [NSURL URLWithString:urlString];

   // 3.判斷是否可以打開
   if ([[UIApplication sharedApplication] canOpenURL:url]) {
       [[UIApplication sharedApplication] openURL:url];
   }
}

具體效果如下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容