一帅矗、應(yīng)用場景
單點授權(quán)登錄,第三方分享结缚,第三方登錄
二损晤、跳轉(zhuǎn)方法
例如手機有兩個應(yīng)用,app1和app2红竭,app1跳轉(zhuǎn)到app2尤勋,步驟如下:
-
app2中設(shè)置URL Schemes
- 從app1中跳轉(zhuǎn)到app2的代碼
// 方法1 openURL (iOS2 ~ iOS10)
NSURL *url = [NSURL URLWithString:@"app2://"];
[[UIApplication sharedApplication] openURL:url];
// 方法2 openURL:options:completionHandler: (iOS10 ~)
- openURL這個方法iOS10開始已經(jīng)失效喘落,不過在Xcode8 iOS10測試仍然有效
- 執(zhí)行方法1或方法2后,手機中如果裝了app2最冰,那么直接跳轉(zhuǎn)到app2
- 手機中如果沒有裝app2(打開了一個不存在的URL Schemes)瘦棋,應(yīng)用不會閃退也沒有發(fā)現(xiàn)有何異常
- openURL:options:completionHandler:這個方法中,options中如果傳一個空的字典暖哨,那么跳轉(zhuǎn)的效果與openURL一樣赌朋。
- openURL:options:completionHandler: 這個方法中是異步的,并且沒有返回值篇裁,completionHander 這個回調(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)就這么簡單~~
- 關(guān)于白名單的設(shè)置和說明
一般從app1跳轉(zhuǎn)到app2,跳轉(zhuǎn)前需要判斷手機中app2是否存在达布,如果存在才進(jìn)行跳轉(zhuǎn)团甲,如果不存在,需要提示用戶黍聂,否則點擊跳轉(zhuǎn)后沒任何效果的話可能會被蘋果拒絕上架躺苦,判斷手機中的某個應(yīng)用是否存在的方法如下:
NSURL *url = [NSURL URLWithString:@"app2://"];
[[UIApplication sharedApplication] canOpenURL:url];
- iOS9開始,如果要正確執(zhí)行canOpenURL這個方法产还,必須要在Info.plist中設(shè)置白名單匹厘,如果沒有設(shè)置白名單,Xcode控制臺會輸出如下錯誤日志
- canOpenURL: failed for URL: "app2://" - error: "This app is not allowed to query for scheme app2"
白名單設(shè)置方法如下所示:
- 注意脐区,白名單的設(shè)置只會影響canOpenURL這個方法愈诚,對openURL無影響,網(wǎng)上很多文章對這塊描述有誤導(dǎo)牛隅。
三扰路、應(yīng)用間傳值
傳值主要通過URL的方式,URL示例如下:
@"app2://oauth?param1=xxxxx¶m2=yyyy"
app1成功跳轉(zhuǎn)到app2后倔叼,需要在app2的AppDelegate的代理方法中對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;
//判斷是通過什么跳轉(zhuǎn)過來的
if ([urlString containsString:@"app2"]) {
NSLog(@"在這里執(zhí)行頁面跳轉(zhuǎn)即可宫莱。");
ViewController *vc = (ViewController *)self.window.rootViewController;
vc.label.text = url.absoluteString;
}
return YES;
}
- app1跳轉(zhuǎn)到app2丈攒,如果app2是后臺徹底殺死狀態(tài)打開,也會執(zhí)行上述代理方法授霸。
- 在 iOS 9 及 iOS 10 中巡验,如果同時實現(xiàn)了上面三個方法,那么只會調(diào)用方法三
- 在 iOS 9 及 iOS 10 中碘耳,如果僅實現(xiàn)了方法一與方法二显设,那么僅調(diào)用方法二
- 在 iOS 9 及 iOS 10 中,如果僅實現(xiàn)了方法一辛辨,那么就調(diào)用方法一