iOS應用之間的跳轉解析

ppsheep發表於2019-02-28

歡迎大家關注我的公眾號,我會定期分享一些我在專案中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來

iOS應用之間的跳轉解析

文章也會同步更新到我的部落格:
ppsheep.com

我們先來看一下效果圖

這是從一個APP直接跳到另外一個APP的效果

iOS應用之間的跳轉解析
1

這是從一個APP跳到另一個APP的指定頁面

iOS應用之間的跳轉解析

說明

在開發之中我們經常遇到需要從我們當前程式跳入到另外一個程式中,下面我們來說明一下這實現的過程

常見的跳轉場景

  • 使用第三方登入時,需要跳轉社交APP,比如常見的QQ、微信、淘寶、支付寶等
  • 分享我們的訊息到其他APP,最常見的就是分享到QQ和微信,推廣我們的APP
  • 第三方支付,微信和支付寶
  • 導航,跳轉到地圖類應用
  • 跳轉到系統的APP,打電話,發簡訊,發郵件等

實現原理

我們想要開啟iOS中的一個應用,只需要拿到這個應用的協議頭,我們就可以實現從一個APP跳到另外一個APP

假設我們現在有兩個APP,APP-1和APP-2,需要從APP-1跳到APP-2
那麼我們就需要給APP-2繫結一個URL Schemes(自定義的應用協議頭),在APP-1中我們就可以實現用這個協議頭跳到APP-2

一個APP直接跳到另外一個APP實現

建立兩個專案APP-1和APP-2

在APP-2中,我們來繫結URL Schemes

iOS應用之間的跳轉解析
3

在APP2的target中繫結協議頭為 APP2

然後我們在APP-1中新增一個按鈕 來實現,點選跳轉

注意,這兩個APP得在手機上都安裝上,才能跳轉

[btn1 addTarget:self action:@selector(jumpToApp2) forControlEvents:UIControlEventTouchUpInside];複製程式碼

跳轉方法

- (void)jumpToApp2{
    //獲取APP2的URL Scheme
    NSURL *appURL = [NSURL URLWithString:@"APP2://"];

    //判斷手機中是否安裝了APP2
    if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
        //開啟APP2
        [[UIApplication sharedApplication] openURL:appURL];
    }else{
        NSLog(@"沒有安裝APP2");
    }
    // ---------------如果是iOS9之前,上面程式碼就可以實現跳轉了---------------------
    // ---------------iOS9之後需要在應用程式中加上白名單,即在APP-1中加上APP-2的白名單---------
    // ----------------在APP-1的Info中 新增鍵值對LSApplicationQueriesSchemes---------------------------------

}複製程式碼

在iOS9之後,跳轉 我們需要在APP中設定需要跳轉的URL Schemes才能實現跳轉 即在Info中新增LSApplicationQueriesSchemes鍵值對

iOS應用之間的跳轉解析
5

然後我們就可以實現跳轉了

看一下效果

iOS應用之間的跳轉解析
1

一個APP跳到另一個APP的指定頁面

這個實現起來也很簡單的,首先在APP2中新建兩個ViewController

然後在APP-1中新增兩個按鈕分別是跳轉到不同的頁面

UIButton *btn1 = [[UIButton alloc] initWithFrame:CGRectMake(50, 150, 200, 30)];
[btn1 setTitle:@"跳轉到第一個介面" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(jumpToApp2_1) forControlEvents:UIControlEventTouchUpInside];
btn1.backgroundColor = [UIColor redColor];
[self.view addSubview:btn1];

UIButton *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(50, 200, 200, 30)];
[btn2 setTitle:@"跳轉到第二個介面" forState:UIControlStateNormal];
[btn2 addTarget:self action:@selector(jumpToApp2_2) forControlEvents:UIControlEventTouchUpInside];
btn2.backgroundColor = [UIColor redColor];複製程式碼

跳轉方法


- (void)jumpToApp2_1{
    //獲取APP2的URL Scheme
    NSURL *appURL = [NSURL URLWithString:@"APP2://VC1"];

    //判斷手機中是否安裝了APP2
    if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
        //開啟APP2的ViewController1
        [[UIApplication sharedApplication] openURL:appURL];
    }else{
        NSLog(@"沒有安裝APP2");
    }
// ---------------如果是iOS9之前,上面程式碼就可以實現跳轉了---------------------
// ---------------iOS9之後需要在應用程式中加上白名單,即在APP-1中加上APP-2的白名單---------
// ----------------在APP-1的Info中 新增鍵值對LSApplicationQueriesSchemes---------------------------------

}

- (void)jumpToApp2_2{
    //獲取APP2的URL Scheme
    NSURL *appURL = [NSURL URLWithString:@"APP2://VC2"];

    //判斷手機中是否安裝了APP2
    if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
        //開啟APP2ViewController2
        [[UIApplication sharedApplication] openURL:appURL];
    }else{
        NSLog(@"沒有安裝APP2");
    }
    // ---------------如果是iOS9之前,上面程式碼就可以實現跳轉了---------------------
    // ---------------iOS9之後需要在應用程式中加上白名單,即在APP-1中加上APP-2的白名單---------
    // ----------------在APP-1的Info中 新增鍵值對LSApplicationQueriesSchemes---------------------------------

}複製程式碼

通過對跳轉的協議頭新增不同的描述,來實現不同的跳轉

然後我們在APP-2的delegate中 實現方法

// 因為現在xcode8 最低支援8.0 所以  我還是用這個方法吧
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{

    //獲取根控制器
    UINavigationController *nvc = (UINavigationController *)self.window.rootViewController;
//    ViewController *vc = nvc.childViewControllers.firstObject;

    //每次跳轉都必須要在根控制器 這一點比較重要
    [nvc popToRootViewControllerAnimated:YES];

    //根據url判斷需要展示的VC
    if ([url.absoluteString containsString:@"VC1"]) {
        ViewController1 *vc1 = [[ViewController1 alloc] init];
//        [vc presentViewController:vc1 animated:YES completion:nil];
        [nvc pushViewController:vc1 animated:YES];
    }else if([url.absoluteString containsString:@"VC2"]){
        ViewController2 *vc2 = [[ViewController2 alloc] init];
        [nvc pushViewController:vc2 animated:YES];
    }

    return YES;
}複製程式碼

實現跳轉監聽,這樣就能跳轉到不同的頁面了

iOS應用之間的跳轉解析

原始碼放在了

github.com/yangqian111…

github.com/yangqian111…

相關文章