iOS應用間跳轉詳解

一、應用場景

單點授權登錄,第三方分享,第三方登錄

二、跳轉方法

例如手機有兩個應用,app1和app2,app1跳轉到app2,步驟如下:

  1. app2中設置URL Schemes


    URL Schemes設置方法
  2. 從app1中跳轉到app2的代碼
// 方法1 openURL (iOS2 ~ iOS10)
 NSURL *url = [NSURL URLWithString:@"app2://"];
 [[UIApplication sharedApplication] openURL:url];
// 方法2 openURL:options:completionHandler: (iOS10 ~)
  • openURL這個方法iOS10開始已經失效,不過在Xcode8 iOS10測試仍然有效
  • 執行方法1或方法2后,手機中如果裝了app2,那么直接跳轉到app2
  • 手機中如果沒有裝app2(打開了一個不存在的URL Schemes),應用不會閃退也沒有發現有何異常
  • openURL:options:completionHandler:這個方法中,options中如果傳一個空的字典,那么跳轉的效果與openURL一樣。
  • openURL:options:completionHandler: 這個方法中是異步的,并且沒有返回值,completionHander 這個回調block是在主線程中執行的。
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"跳轉成功");
        } else {
            NSLog(@"跳轉失敗");
        }
    }];
  • 應用跳轉就這么簡單~~
  1. 關于白名單的設置和說明
    一般從app1跳轉到app2,跳轉前需要判斷手機中app2是否存在,如果存在才進行跳轉,如果不存在,需要提示用戶,否則點擊跳轉后沒任何效果的話可能會被蘋果拒絕上架,判斷手機中的某個應用是否存在的方法如下:
NSURL *url = [NSURL URLWithString:@"app2://"];
 [[UIApplication sharedApplication] canOpenURL:url];
  • iOS9開始,如果要正確執行canOpenURL這個方法,必須要在Info.plist中設置白名單,如果沒有設置白名單,Xcode控制臺會輸出如下錯誤日志
- canOpenURL: failed for URL: "app2://" - error: "This app is not allowed to query for scheme app2"

白名單設置方法如下所示:


白名單設置方法
  • 注意,白名單的設置只會影響canOpenURL這個方法,對openURL無影響,網上很多文章對這塊描述有誤導。

三、應用間傳值

傳值主要通過URL的方式,URL示例如下:

@"app2://oauth?param1=xxxxx&param2=yyyy"

app1成功跳轉到app2后,需要在app2的AppDelegate的代理方法中對URL作參數解析,示例如下:

// 方法一
// NS_DEPRECATED_IOS(2_0, 9_0)
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return YES;
}

// 方法二
// NS_DEPRECATED_IOS(2_0, 9_0)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return YES;
}

// 方法三
// NS_AVAILABLE_IOS(9_0)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    NSLog(@"%@", options);
    /* options 打印結果
     {
     UIApplicationOpenURLOptionsOpenInPlaceKey = 0;
     UIApplicationOpenURLOptionsSourceApplicationKey = "com.epoint.app1"; // 可獲取Bundle id 
     }
     */
    
    //將url轉為字符串
     NSString * urlString = url.absoluteString;
    //判斷是通過什么跳轉過來的
    if ([urlString containsString:@"app2"]) {
        NSLog(@"在這里執行頁面跳轉即可。");
        ViewController *vc = (ViewController *)self.window.rootViewController;
        vc.label.text = url.absoluteString;
    }
    
    return YES;
}
  • app1跳轉到app2,如果app2是后臺徹底殺死狀態打開,也會執行上述代理方法。
  • 在 iOS 9 及 iOS 10 中,如果同時實現了上面三個方法,那么只會調用方法三
  • 在 iOS 9 及 iOS 10 中,如果僅實現了方法一與方法二,那么僅調用方法二
  • 在 iOS 9 及 iOS 10 中,如果僅實現了方法一,那么就調用方法一
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容