天天看點

兩個app應用之間的跳轉

一,應用跳轉的原理

從一個應用跳轉到另一個應用,作為APP開發者,最熟悉的莫過于第三方登入,支付寶,微信支付時,那時候我們可能僅僅按照內建文檔一步一步操作,在文檔中配置很多類似URL Schemes,如下圖:

兩個app應用之間的跳轉

一般的配置

下面我們進入正題的為什麼這麼配置:

1、一些概念的補充

協定:雙方互相遵守的一種規範,隻有遵守共同的協定規範才能進行彼此的通信。比如我們最熟悉的網絡協定——http協定。

URL:資源的路徑或位址。在IOS中有一個專門用于包裝資源路徑的類——NSURL。

一個完整URL的組成

例如:http://123.0.0.1/path?page=100

“http://”:協定類型

“123.0.0.1”:伺服器ip位址

“/path”:資源存放的是路徑

“page=100”:請求的參數

NSURL包裝一個完整位址

NSURL *url = [NSURL URLWithString:@"http://123.0.0.1/path?page=100"];

NSLog(@"scheme(協定):%@",url.scheme);

NSLog(@"host(域名):%@",url.host);

NSLog(@"path(路徑):%@",url.path);

NSLog(@"query(參數):%@",url.query);

列印結果如下:

2016-12-02 14:50:38.442 TestDemo[5632:406869] scheme(協定):http

2016-12-02 14:50:38.442 TestDemo[5632:406869] host(域名):123.0.0.1

2016-12-02 14:50:38.442 TestDemo[5632:406869] path(路徑):/path

2016-12-02 14:50:38.442 TestDemo[5632:406869] query(參數):page=100

2、跳轉的原理

在iOS中,從一個app打開另一個app,這必然牽扯到兩個app之間的互動和通信,像這種涉及到整個應用程式層面的事情,蘋果有一個專門的類來管理——UIApplication。在ios中UIApplication其實就是代表着應用程式,這點從它的命名就可以窺之。而我們要打開另一個應用程式,如何實作呢?很簡單,其實就是UIApplication下面這個 的API

/**

通過應用程式打開一個資源路徑

@param url 資源路徑的位址

@return 傳回成功失敗的資訊

*/

  • (BOOL)openURL:(NSURL*)url;

    它的一些我們非常熟悉的用法:

//撥打系統電話

NSURL *url = [NSURL URLWithString:@"tel://10086"];

[[UIApplication sharedApplication] openURL:url];

//發送系統短信

NSURL *url = [NSURL URLWithString:@"sms://1383838438"];

[[UIApplication sharedApplication] openURL:url];

上面打電話和發短信的實作代碼大同小異,唯一的差別是傳遞的NSURL參數不一樣,導緻他們跳轉到不同的應用場景。

總結:一個應用能打開另一個應用的必然條件是,另一個應用必須配置一個scheme(協定),這樣應用程式才能根據協定找到需要打開的應用。

二、實作兩個app間的跳轉

建立兩個示例Demo,Test1Demo和Test2Demo,現在需要實作從Test2Demo跳轉到Test1Demo中.

1、在被跳轉的Test1Demo配置一個協定scheme,這裡命名為test(名字最好是英文并且跟你項目相關)

targets -> info -> URL Types ->URL Scheme ->填寫協定

兩個app應用之間的跳轉

配置

2、在Test2Demo執行跳轉的方法中實作下面方法

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSURL *url = [NSURL URLWithString:@"test://"];

    if ([[UIApplication sharedApplication] canOpenURL:url]) {

        [[UIApplication sharedApplication] openURL:url];

    }else{
        NSLog(@"沒有安裝應用");
    }
}           

複制

ok,到這裡如果你的系統是ios9.0以下,已經大大功告成了。但是,如果是9.0以後,請看下一步。

3、配置協定白名單

在Test2Demo的info.plist檔案中增加一個LSApplicationQueriesSchemes字段,把它設定為數組類型,并配置需要跳轉的協定名單

兩個app應用之間的跳轉

配置

三、跳轉到指定界面

想要跳轉到指定界面,必然是上一個app告訴下一個app(被跳轉的app)需要跳轉到哪個界面,而如何告訴它這裡便涉及到兩個app的通信。我們從上面可以知道,兩個app之間的跳轉隻需要配置一個scheme,然後通過UIApplication調用它的對象方法openURL:即可實作,除此之外再也沒有實作任何代碼了。而這之間是如何通信的呢?

答案依然是協定,請看下面步驟:

1、在"test://"協定後面的域名加上一些字段用來标記需要跳轉的界面

//進入更多界面

- (IBAction)intoMore:(id)sender {
    NSURL *url = [NSURL URLWithString:@"test://more"];

    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [application openURL:URL options:@{} completionHandler:nil];
    }else{
        NSLog(@"沒有安裝應用");
    }

}

//進入設定界面
- (IBAction)intoSet:(id)sender {

    NSURL *url = [NSURL URLWithString:@"test://set"];

    if ([[UIApplication sharedApplication] canOpenURL:url]) {

        [[UIApplication sharedApplication] openURL:url];
    }else{
        NSLog(@"沒有安裝應用");
    }

}           

複制

2、來到被跳轉的應用TestDemo的AppDelegate類的.m檔案中,監聽其代理方法application:handleOpenURL:

//當應用程式将要被其他程式打開時,會先執行此方法,并傳遞url過來

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
    NSLog(@"url:%@",url.absoluteString);
    NSLog(@"host:%@",url.host);
    if ([url.host isEqualToString:@"more"]) {
        NSLog(@"進入更多界面");
        //到此做界面的跳轉
    }

    if ([url.host isEqualToString:@"set"]) {
        NSLog(@"進入設定界面");
        //到此做界面的跳轉
    }

    return YES;
}           

複制

由于參考别人,讓自己明白的,借此作為記錄,以友善更多人明白。