iOS 應用之間跳轉傳輸資料以及跳回源程式

ppsheep發表於2019-03-02

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

iOS 應用之間跳轉傳輸資料以及跳回源程式

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

之前寫了一篇關於APP之間跳轉的文章,期間有同學說能否出一個類似於微信登入或者支付寶支付之類的,跳轉到支付寶獲得訊息再調回源程式,並且帶上資訊。今天我們就再來聊聊,實現這樣一種效果,沒看過之前應用跳轉的,請移步:
ppsheep.com/2016/10/27/…

之前我們說到APP之間的跳轉,其實就是通過一個URL Schemes進行跳轉,APP之間的傳值,其實也是通過這個URL進行傳值。

再有我們想跳回原來程式,那麼我們還需要知道源程式的URL Schemes,這樣我們才能跳回到源程式,所以在傳遞引數的時候 我們還需要把源程式的URL Schemes傳遞過去。

我們需要傳遞的引數:

  • 當前APP的 URL Schemes
  • 我們需要傳遞的實際引數

還有一個重要的事情,因為我們需要從APP2跳回APP1,所以我們還需要設定APP1的URL Schemes,怎麼設定,我這裡就不寫出來了,具體可以看上一篇跳轉解析

我們之前知道 開啟另一個APP,是開啟一個URL
APP2://類似於這種,那我們會想到一般我們http有一種方式攜帶引數 http://url?name=?&age=?

我們APP之間的傳遞引數方式其實也是這樣的方式

  //獲取APP2的URL Scheme 還需要帶上當前App的APP1
    NSString *URLScheme = @"APP2://APP1";

    //我們引數需要穿name age
    NSString *params = @"name=yq&age=23";
    //接下來加上我們需要攜帶的引數
    NSString *realURL = [NSString stringWithFormat:@"%@?%@",URLScheme,params];

    NSURL *appURL = [NSURL URLWithString:realURL];

    //判斷手機中是否安裝了APP2
    if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
        //開啟APP2ViewController2
        [[UIApplication sharedApplication] openURL:appURL];
    }else{
        NSLog(@"沒有安裝APP2");
    }複製程式碼

我們最終的appURL 是:

 APP2://APP1?name=yq&age=23複製程式碼

我們在APP2中處理這個跳轉的URL

 -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
     if ([url.absoluteString containsString:@"APP1"]){
        NSLog(@"%@",url);

        //拿到源程式的
        NSString * urlschemes = [[url.absoluteString componentsSeparatedByString:@"//"][1] componentsSeparatedByString:@"?"][0];

        //拿到引數
        NSRange range = [url.absoluteString rangeOfString:@"?"];
        NSString *paramStr = [url.absoluteString substringFromIndex:range.location+1];//去除問號
        NSArray *params = [paramStr componentsSeparatedByString:@"&"];
        NSLog(@"%@",params);

        //跳回源程式
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            // 延時3s模擬處理後回撥指定的 URL Schemes並傳遞結果

            if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"APP2://"]]) {

                NSLog(@"跳轉成功");

                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@://back?name=back&code=200",urlschemes]]];

            }else{
                NSLog(@"跳轉失敗");
                NSLog(@"未安裝應用!");
            }
        });
    }

 }複製程式碼

在APP2中 我們拿到了APP1傳遞的引數 放在了params陣列中,同樣的 我們在APP1中再處理從APP2跳回來的資訊

  /**
 跳轉回來
 */
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<uiapplicationopenurloptionskey,id> *)options{
    if ([url.absoluteString containsString:@"back"]) {
        //拿到引數
        NSRange range = [url.absoluteString rangeOfString:@"?"];
        NSString *paramStr = [url.absoluteString substringFromIndex:range.location+1];//去除問號
        NSArray *params = [paramStr componentsSeparatedByString:@"&"];
        NSLog(@"%@",params);
    }
    return YES;
}

相關文章