1. 程式人生 > >兩個app應用之間的跳轉

兩個app應用之間的跳轉

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

一般的配置

下面我們進入正題的為什麼這麼配置:
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 ->填寫協議

配置

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之間的跳轉只需要配置一個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;
}

參考部分文章