iOS兩個(gè)獨(dú)立的App之間的跳轉(zhuǎn)實(shí)現(xiàn):
URL
一個(gè)完整的URL組成包括:協(xié)議類(lèi)型、服務(wù)地址、資源路徑、請(qǐng)求參數(shù),如果不是通過(guò)第三方平臺(tái)的SDK來(lái)進(jìn)行應(yīng)用間的跳轉(zhuǎn),就需要開(kāi)發(fā)者自己在鏈接中拼接對(duì)應(yīng)需要傳遞的參數(shù)。一個(gè)NSURL封裝的一個(gè)完整地址包括:協(xié)議、域名、路徑、參數(shù)。
跳轉(zhuǎn)原理
兩個(gè)獨(dú)立的App,從一個(gè)App跳轉(zhuǎn)打開(kāi)另外一個(gè)App,涉及到的是這兩個(gè)App之間的通信交互功能,蘋(píng)果有個(gè)一專(zhuān)門(mén)的管理類(lèi)UIApplication,這個(gè)類(lèi)其實(shí)就代表應(yīng)用程序。在UIApplication類(lèi)有一個(gè)方法:
- (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");
這個(gè)方法是通過(guò)應(yīng)用程序打開(kāi)一個(gè)資源路徑。比如一些我們經(jīng)常用到的打電話、發(fā)短信、發(fā)郵件等等都會(huì)用到這個(gè)方法。
一個(gè)App能打開(kāi)另外一個(gè)App的必然條件就是:另外一個(gè)App必須配置一個(gè)scheme協(xié)議,這樣應(yīng)用才能根據(jù)協(xié)議找到需要打開(kāi)的應(yīng)用。
兩個(gè)應(yīng)用之間的跳轉(zhuǎn)
創(chuàng)建兩個(gè)測(cè)試應(yīng)用:OpenURLFirst和OpenURLSecond。我們實(shí)現(xiàn)通過(guò)URL從OpenURLFirst跳轉(zhuǎn)到OpenURLSecond的某個(gè)頁(yè)面并傳遞信息。
首先OpenURLFirst如果能跳轉(zhuǎn)到OpenURLSecond,要在被跳轉(zhuǎn)的應(yīng)用配置一個(gè)scheme協(xié)議,然后隨便命名一個(gè)名字,這里我命名為zcNightelf(貌似不區(qū)分大小寫(xiě))。


配置完成后運(yùn)行,可以直接在Safari中輸入zcnightelf:// 來(lái)打開(kāi)應(yīng)用。
在OpenURLFirst中使用如下代碼進(jìn)行跳轉(zhuǎn):
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"zcNightelf://"]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"zcNightelf://"] options:nil completionHandler:nil];
}
如果需要回跳至第一個(gè)應(yīng)用,也需要在第一個(gè)應(yīng)用配置scheme,然后在第二個(gè)應(yīng)用中調(diào)用跳轉(zhuǎn)的代碼。方法相同。
如果需要跳轉(zhuǎn)到第二個(gè)應(yīng)用的某個(gè)頁(yè)面,需要設(shè)置跳轉(zhuǎn)的URL。例如,需要跳轉(zhuǎn)到第二個(gè)應(yīng)用的第一個(gè)頁(yè)面,url可以改為zcnightelf://one。然后在第二個(gè)應(yīng)用的AppDelegate.m中,實(shí)現(xiàn)如下代碼進(jìn)行判斷跳轉(zhuǎn)至某個(gè)頁(yè)面:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{
// 通過(guò)url的host判斷需要跳轉(zhuǎn)的頁(yè)面進(jìn)行處理
if ([url.host isEqualToString:@"one"]) {
}
if ([url.host isEqualToString:@"two"]) {
}
return YES;
}
附上Demo