iOS應(yīng)用間跳轉(zhuǎn)詳解

一、應(yīng)用場(chǎng)景

單點(diǎn)授權(quán)登錄,第三方分享,第三方登錄

二、跳轉(zhuǎn)方法

例如手機(jī)有兩個(gè)應(yīng)用,app1和app2,app1跳轉(zhuǎn)到app2,步驟如下:

  1. app2中設(shè)置URL Schemes


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

白名單設(shè)置方法如下所示:


白名單設(shè)置方法
  • 注意,白名單的設(shè)置只會(huì)影響canOpenURL這個(gè)方法,對(duì)openURL無(wú)影響,網(wǎng)上很多文章對(duì)這塊描述有誤導(dǎo)。

三、應(yīng)用間傳值

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

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

app1成功跳轉(zhuǎn)到app2后,需要在app2的AppDelegate的代理方法中對(duì)URL作參數(shù)解析,示例如下:

// 方法一
// 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 打印結(jié)果
     {
     UIApplicationOpenURLOptionsOpenInPlaceKey = 0;
     UIApplicationOpenURLOptionsSourceApplicationKey = "com.epoint.app1"; // 可獲取Bundle id 
     }
     */
    
    //將url轉(zhuǎn)為字符串
     NSString * urlString = url.absoluteString;
    //判斷是通過(guò)什么跳轉(zhuǎn)過(guò)來(lái)的
    if ([urlString containsString:@"app2"]) {
        NSLog(@"在這里執(zhí)行頁(yè)面跳轉(zhuǎn)即可。");
        ViewController *vc = (ViewController *)self.window.rootViewController;
        vc.label.text = url.absoluteString;
    }
    
    return YES;
}
  • app1跳轉(zhuǎn)到app2,如果app2是后臺(tái)徹底殺死狀態(tài)打開(kāi),也會(huì)執(zhí)行上述代理方法。
  • 在 iOS 9 及 iOS 10 中,如果同時(shí)實(shí)現(xiàn)了上面三個(gè)方法,那么只會(huì)調(diào)用方法三
  • 在 iOS 9 及 iOS 10 中,如果僅實(shí)現(xiàn)了方法一與方法二,那么僅調(diào)用方法二
  • 在 iOS 9 及 iOS 10 中,如果僅實(shí)現(xiàn)了方法一,那么就調(diào)用方法一
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容