一、應(yīng)用場(chǎng)景
單點(diǎn)授權(quán)登錄,第三方分享,第三方登錄
二、跳轉(zhuǎn)方法
例如手機(jī)有兩個(gè)應(yīng)用,app1和app2,app1跳轉(zhuǎn)到app2,步驟如下:
-
app2中設(shè)置URL Schemes
URL Schemes設(shè)置方法 - 從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)單~~
- 關(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¶m2=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)用方法一
