一乎芳、應(yīng)用間跳轉(zhuǎn)介紹
- 1.1蘸际、什么是應(yīng)用間跳轉(zhuǎn),有什么作用? 如下
- <1>、使用第三方用戶登錄箍铭,需要用戶授權(quán)绎晃,還需要"返回到調(diào)用的程序蜜唾,同時(shí)返回授權(quán)的用戶名"
- <2>、應(yīng)用程序推廣箕昭,設(shè)置-推薦應(yīng)用-有很多應(yīng)用程序圖標(biāo)如果本機(jī)已經(jīng)安裝過(guò)灵妨,會(huì)直接跳轉(zhuǎn)到另外一個(gè)應(yīng)用程序, 軟件的廣告,我們?cè)诙兑艋蛘哌M(jìn)入頭條都可以看到很多的點(diǎn)擊事件進(jìn)去其他的app或者去下載appstore下載app
- <3>落竹、平時(shí) 支付寶和微信 的支付 等等
- 1.2泌霍、如何實(shí)現(xiàn)應(yīng)用程序間跳轉(zhuǎn) ?
-
<1>述召、跳轉(zhuǎn)appstore進(jìn)入自己的app: 在我們自己的app里面有時(shí)候我們會(huì)有更新提醒朱转,其實(shí)也就是打開我們自己 app 的
url
,以itms-apps://
或https://
開頭的應(yīng)用詳情頁(yè)鏈接积暖,跳轉(zhuǎn)到AppStore,如下,其中url要進(jìn)行轉(zhuǎn)碼藤为,下面我就不再轉(zhuǎn)碼了
OC 版本:NSURL *url = [NSURL URLWithString:@"itms-apps://itunes.apple.com/app/id1129144823"]; // 注意: 跳轉(zhuǎn)之前, 可以使用 canOpenURL: 判斷是否可以跳轉(zhuǎn) if (![[UIApplication sharedApplication]canOpenURL:url]) { // 不能跳轉(zhuǎn)就不要往下執(zhí)行了 return; } if (@available(iOS 10.0, *)){ [[UIApplication sharedApplication]openURL:url options:@{UIApplicationOpenURLOptionsSourceApplicationKey:@YES} completionHandler:^(BOOL success) { if (success) { NSLog(@"10以后可以跳轉(zhuǎn)url"); }else{ NSLog(@"10以后不可以跳轉(zhuǎn)url"); } }]; }else{ BOOL success = [[UIApplication sharedApplication]openURL:url]; if (success) { NSLog(@"10以前可以跳轉(zhuǎn)url"); }else{ NSLog(@"10以前不可以跳轉(zhuǎn)url"); } }
Swift 版本:
let url = URL(string: "itms-apps://itunes.apple.com/app/id1129144823") // 注意: 跳轉(zhuǎn)之前, 可以使用 canOpenURL: 判斷是否可以跳轉(zhuǎn) if !UIApplication.shared.canOpenURL(url!) { // 不能跳轉(zhuǎn)就不要往下執(zhí)行了 return } if #available(iOS 10.0, *) { UIApplication.shared.open(url!, options: [:]) { (success) in if (success) { print("10以后可以跳轉(zhuǎn)url") }else{ print("10以后不能完成跳轉(zhuǎn)") } } } else { // Fallback on earlier versions let success = UIApplication.shared.openURL(url!) if (success) { print("10以下可以跳轉(zhuǎn)") }else{ print("10以下不能完成跳轉(zhuǎn)") } }
<2>、打電話:
tel://電話號(hào)碼
夺刑,代碼和上面的一樣<3>缅疟、發(fā)短信:
sms://電話號(hào)碼
,代碼和上面的一樣<4>遍愿、發(fā)郵件:
mailTo://郵箱號(hào)
存淫,代碼和上面的一樣
提示:
itms-apps、https沼填、tel桅咆、sms、mailTo
都是協(xié)議坞笙,app之間跳轉(zhuǎn)的協(xié)議是:Scheme
岩饼,如果想要跳轉(zhuǎn)到不同app,就要打開對(duì)應(yīng)的 URL(協(xié)議是:scheme
), scheme是一個(gè)具體的字符串荚虚,并不是scheme這幾個(gè)字母,在下面會(huì)詳細(xì)的介紹 -
-
1.3籍茧、
URL
: 統(tǒng)一資源定位符-
<1>版述、我們以淘寶網(wǎng)的一個(gè)鏈接為例:
https://www.taobao.com/markets/bao/xiangbao?spm=a21bo.2017.201867-main.5.5af911d9blzLlJ
Swift版本let url = URL(string: "https://www.taobao.com/markets/bao/xiangbao?spm=a21bo.2017.201867-main.5.5af911d9blzLlJ") print("協(xié)議=",url!.scheme ?? "","IP或者是域名=",url!.host ?? "","路徑=",url!.path ,"參數(shù)=",url!.query ?? "")
打印結(jié)果:
協(xié)議= https IP或者是域名= www.taobao.com 路徑= /markets/bao/xiangbao 參數(shù)= spm=a21bo.2017.201867-main.5.5af911d9blzLlJ
OC版本NSURL *url = [NSURL URLWithString:@"https://www.taobao.com/markets/bao/xiangbao?spm=a21bo.2017.201867-main.5.5af911d9blzLlJ"]; NSLog(@"協(xié)議=%@ IP或者是域名=%@ 路徑=%@ 參數(shù)=%@",url.scheme,url.host,url.path,url.query);
打印結(jié)果和上面的一樣
-
<2>、一個(gè)
url
分為以下部分協(xié)議:https IP或者是域名:www.taobao.com 路徑:/markets/bao/xiangbao 參數(shù):spm=a21bo.2017.201867-main.5.5af911d9blzLlJ
-
二硕糊、應(yīng)用間跳轉(zhuǎn)實(shí)現(xiàn)
2.1院水、我們先以自己創(chuàng)建的app實(shí)現(xiàn)來(lái)回的跳轉(zhuǎn):
Test1
與Test2
兩個(gè)項(xiàng)目-
2.2、給Test2項(xiàng)目設(shè)置一個(gè)
URL Scheme
简十,用來(lái)其他的app跳轉(zhuǎn)到Test2
提示:設(shè)置 URL Scheme時(shí), 不要加
://
,比如上面直接設(shè)置:test2
一個(gè)字符串就好- 再說(shuō)一下不一定根據(jù)
URL Scheme
進(jìn)入不同的界面的,也可以在Scheme后拼接參數(shù)螟蝙,比如:test2://1234
-
URL scheme
的作用:我們可以將應(yīng)用“綁定”到一個(gè)自定義URL scheme
上恢恼,該scheme
用于從瀏覽器或其他應(yīng)用中啟動(dòng)本應(yīng)用,同時(shí)跳轉(zhuǎn)時(shí)也可以傳遞參數(shù)胰默。比如场斑,可以在網(wǎng)頁(yè)上添加一個(gè)鏈接,點(diǎn)擊這個(gè)鏈接后會(huì)自動(dòng)打開對(duì)應(yīng)的APP上牵署÷┮或者從一個(gè) APP 跳轉(zhuǎn)到另一個(gè) APP,用的也是URL scheme
奴迅。比如微博或者微信的登錄或者分享之類的青责。在選擇登錄時(shí)就會(huì)跳到微信或者微博里,等登錄了以后就可以跳轉(zhuǎn)回去取具。
- 再說(shuō)一下不一定根據(jù)
-
2.3脖隶、在Test1項(xiàng)目里面設(shè)置白名單
-
<1>、解釋一下什么是白名單:其實(shí)白名單是在
iOS9.0
以后提出的,它就是一個(gè)數(shù)組
暇检,里面放的是其他app的URL Scheme
名字,在iOS9以前
是不需要設(shè)置的产阱,可以直接用canOpenURL
判斷是否可以跳轉(zhuǎn),但是在iOS9.0之后如果不添加白名單块仆,openURL
是無(wú)法判斷判斷是否可以跳轉(zhuǎn)的构蹬。提示:不想添加白名單是可以的,其他的app分享到微信悔据,它確信你的app存在庄敛,就不需要在白名單添其他app的
URL Scheme
,也就是不需要使用 canOpenURL判斷是否可以跳轉(zhuǎn) 是否可以跳轉(zhuǎn) -
<2>、設(shè)置白名單蜜暑,如果你要跳轉(zhuǎn)其他的app铐姚,就要在自己的app的
info.plist
設(shè)置白名單策肝,添加其他app的URL Scheme
,白名單的字段是:LSApplicationQueriesSchemes
,下面我們?cè)?Test1
添加白名單
-
-
2.4肛捍、在Test1項(xiàng)目跳轉(zhuǎn)到Test2項(xiàng)目測(cè)試隐绵,代碼如下
我們把上面 1.2中的<1>里面的url換為下面,在同一個(gè)手機(jī)上運(yùn)行 Test1 和 Test2 兩個(gè)項(xiàng)目
-
OC 版本:后面的代碼都是
1.2
中的<1>
里面的代碼NSURL *url = [NSURL URLWithString:@"test2://"]; // 注意: 跳轉(zhuǎn)之前, 可以使用 canOpenURL: 判斷是否可以跳轉(zhuǎn) if (![[UIApplication sharedApplication]canOpenURL:url]) { // 不能跳轉(zhuǎn)就不要往下執(zhí)行了 return; } ------后面的代碼都是 1.2中的<1>里面的代碼
-
Swift 版本:后面的代碼都是
1.2
中的<1>
里面的代碼let url = URL(string: "test2://") // 注意: 跳轉(zhuǎn)之前, 可以使用 canOpenURL: 判斷是否可以 if !UIApplication.shared.canOpenURL(url!) { // 不能跳轉(zhuǎn)就不要往下執(zhí)行了 return } -----后面的代碼都是 1.2中的<1>里面的代碼
拓展:看到上面效果,我們就簡(jiǎn)單的完成了app之間的跳轉(zhuǎn)拙毫,這也是一些三方在分享的時(shí)候要求我們app設(shè)置白名單依许,你要分享到哪些平臺(tái),你就要添加其他平臺(tái)的 URL Scheme,這個(gè)不是隨便填寫的缀蹄,其他平臺(tái)設(shè)置的URL Scheme是什么峭跳,就在白名單就要添加什么,可不是自己隨意寫的
-
-
2.5缺前、如果你想在
Test2
app再返回到Test1
app,其實(shí)也就是反過(guò)來(lái)蛀醉,在Test2
的白名單里面添加Test1
的URL Scheme
,在跳轉(zhuǎn)Test1
的使用根據(jù)Test1的schmem
用openURL返回衅码,記得先用canOpenURL
判斷一下提示:在做分享的時(shí)候我們會(huì)檢測(cè)微信是不是安裝了拯刁,跳到微信后把微信給的URL Scheme也帶了過(guò)去,在從微信返回的時(shí)候不用再判斷 自己的app是否安裝了逝段,直接用OpenURL返回即可垛玻,添加白名單的目的是為了檢測(cè)其他的app是否安裝,可不可以跳轉(zhuǎn)奶躯;在自己的app跳轉(zhuǎn)其他的app的一定要用canOpenURL檢測(cè)一下帚桩,微信不在白名單添加其他app的URL Scheme的原因是它確信你的app存在,不需要用
canOpenURL
判斷 -
2.6嘹黔、常用白名單字段(更多的白名單字段在mob平臺(tái)iOS開發(fā)文檔查看)
-
新浪
sinaweibo, sinaweibohd, sinaweibosso, sinaweibohdsso, weibosdk, weibosdk2.5
-
微信
wechat, weixin
-
支付寶
alipay, alipayshare
-
QQ
mqqOpensdkSSoLogin, mqqopensdkapiV2, mqqopensdkapiV3, wtloginmqq2, mqq, mqqapi timapi
提示:微信账嚎,新浪,QQ它們?cè)O(shè)置很多的Scheme的原因是要根據(jù)這些不同的Scheme做什么操作,比如根據(jù)
Scheme
跳轉(zhuǎn)到不同的界面等等 -
三参淹、怎樣跳轉(zhuǎn)到不同界面?
-
3.1醉锄、再建立一個(gè)項(xiàng)目
Test3
,給它添加一個(gè)URL Scheme
浙值,再給Test3添加兩個(gè)控制器ViewController2
與ViewController3
提示: 一個(gè)項(xiàng)目可以添加多個(gè)
URL Scheme
,舉個(gè)例子开呐,你在用支付寶支付烟勋,支付寶會(huì)給你一個(gè)URL Scheme
字符串,讓你添加到自己URL Types
里面,到時(shí)候你在調(diào)用支付寶支付,在支付寶界面返回的時(shí)候用這個(gè)支付寶給你的 URL Scheme 返回筐付;同樣卵惦,微信也會(huì)給你一個(gè)URL Scheme
字符串,當(dāng)你跳轉(zhuǎn)到微信里面瓦戚,微信里面根據(jù)微信給你的URL Scheme
返回到你的app沮尿;- 再解釋一下:為什么微信或者支付寶會(huì)給一個(gè)唯一的
URL Scheme
字符串,其目的是為了防止,從他們的應(yīng)用返回到自己的應(yīng)用時(shí)出錯(cuò)畜疾,根據(jù)URL Scheme
字符串返回到自己的app的赴邻,如果手機(jī)里面有兩個(gè)程序都有相同的一個(gè)URL Scheme
字符串,那么就出問(wèn)題了啡捶,它就不知道返回哪個(gè)app了,其實(shí)如果遇到相同的URL Scheme
姥敛,誰(shuí)的app先安裝的,就返回到誰(shuí)的app,這個(gè)我測(cè)試了
- 再解釋一下:為什么微信或者支付寶會(huì)給一個(gè)唯一的
-
3.2瞎暑、在
Test3
處理其他Test1(或者其他的app通過(guò)openURL
)進(jìn)來(lái)的判斷- OC 版本
// 即將過(guò)期,不建議使用(建議把這3個(gè)方法同時(shí)實(shí)現(xiàn)) - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { [self dealopenURL:url]; return YES; } -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{ [self dealopenURL:url]; return YES; } -(void)dealopenURL:(NSURL *)url{ NSLog(@"協(xié)議=%@ IP或者是域名=%@ 路徑=%@ 參數(shù)=%@",url.scheme,url.host,url.path,url.query); // 1.獲取主控制器 UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController; // 拿到棧底的控制器 ViewController *mainVc = [rootNav.childViewControllers firstObject]; // 返回主控制器彤敛,防止多次進(jìn)入錯(cuò)亂 [rootNav popToRootViewControllerAnimated:NO]; // 利用 URL : 統(tǒng)一資源定位符來(lái)判斷 if ([url.path isEqualToString:@"/vc2"]) { ViewController2 *vc2 = [ViewController2 new]; vc2.urlString = url.host; [mainVc.navigationController pushViewController:vc2 animated:YES]; } else if ([url.path isEqualToString:@"/vc3"]) { ViewController3 *vc3 = [ViewController3 new]; vc3.urlString = url.host; [mainVc.navigationController pushViewController:vc3 animated:YES]; } }
-
Swift 版本
// 最新的 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { dealopenURL(url: url as NSURL) return true } // 被遺棄的(最好兩個(gè)都用) func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { dealopenURL(url: url as NSURL) return true } // MARK:跳轉(zhuǎn)的處理 func dealopenURL(url:NSURL){ let nav: UINavigationController! = window?.rootViewController as? UINavigationController nav.popToRootViewController(animated: false) let rootVC = nav.children[0] if url.path == "/vc2" { let vc2 = ViewController2() vc2.urlString = url.host rootVC.navigationController?.pushViewController(vc2, animated: true) }else if url.path == "/vc3"{ let vc3 = ViewController3() vc3.urlString = url.host rootVC.navigationController?.pushViewController(vc3, animated: true) } }
提示:上面跳轉(zhuǎn)是利用 URL的path(
統(tǒng)一資源定位符
)來(lái)判斷,我是把 帶過(guò)來(lái)的URL Scheme
放到了IP或者是域名
的位置 -
3.3、在
Test1
里面的跳轉(zhuǎn)代碼- OC 版本
// 跳轉(zhuǎn)Test3的ViewController2 [self jumpUrl:@"test3://test1/vc2"]; // 跳轉(zhuǎn)Test3的ViewController3 [self jumpUrl:@"test3://test1/vc3"]; -(void)jumpUrl:(NSString *)urlStr{ NSURL *url = [NSURL URLWithString:urlStr]; // 注意: 跳轉(zhuǎn)之前, 可以使用 canOpenURL: 判斷是否可以跳轉(zhuǎn) if (![[UIApplication sharedApplication]canOpenURL:url]) { return; } if (@available(iOS 10.0, *)){ [[UIApplication sharedApplication]openURL:url options:@{UIApplicationOpenURLOptionsSourceApplicationKey:@YES} completionHandler:^(BOOL success) { if (success) { NSLog(@"10以后可以跳轉(zhuǎn)url"); }else{ NSLog(@"10以后不可以跳轉(zhuǎn)url"); } }]; }else{ BOOL success = [[UIApplication sharedApplication]openURL:url]; if (success) { NSLog(@"10以前可以跳轉(zhuǎn)url"); }else{ NSLog(@"10以前不可以跳轉(zhuǎn)url"); } } }
-
Swift 版本
jumpUrl(url: NSURL(string: "test3://test1/vc2")!) jumpUrl(url: NSURL(string: "test3://test1/vc3")!) func jumpUrl(url:NSURL){ if !UIApplication.shared.canOpenURL(url as URL) { return } if #available(iOS 10.0, *) { UIApplication.shared.open(url as URL, options: [:]) { (success) in if (success) { print("10以后可以跳轉(zhuǎn)url") }else{ print("10以后不能完成跳轉(zhuǎn)") } } } else { // Fallback on earlier versions let success = UIApplication.shared.openURL(url as URL) if (success) { print("10以下可以跳轉(zhuǎn)") }else{ print("10以下不能完成跳轉(zhuǎn)") } } }
四了赌、總結(jié)
-
4.1墨榄、實(shí)現(xiàn)兩個(gè)app之間跳轉(zhuǎn)的步驟
- <1>、在各自的app里面設(shè)置
URL scheme
- <2>勿她、在各自app的info.plist里面添加字段
LSApplicationQueriesSchemes
渠概,類型為數(shù)組,數(shù)組中添加對(duì)方的 scheme 字符串(白名單的作用僅僅是iOS9.0方法canOpenURL
要求的嫂拴,因?yàn)槲覀冊(cè)谔D(zhuǎn)前需要檢查下設(shè)備有沒(méi)有安裝將要跳轉(zhuǎn)的應(yīng)用) - <3>播揪、通過(guò)
openURL
跳轉(zhuǎn)對(duì)方的URL Scheme
即可
- <1>、在各自的app里面設(shè)置
4.2、在最后我重復(fù)一下很多app跳轉(zhuǎn)到微信筒狠、支付寶猪狈、微博等等后,它們是怎么做到再回到我們的app的辩恼,首先我們知道這些app里面的白名單肯定是沒(méi)有我們的
URL Scheme
答:首選我們?cè)谄渌脚_(tái)注冊(cè)自己的應(yīng)用的時(shí)候雇庙,都會(huì)給我們一個(gè) URL Scheme 字符串,這個(gè)字符串我們需要添加到我們的URL Scheme里面
灶伊,想必大家也知道了疆前,我們需要添加多個(gè)URL Scheme
,因?yàn)槲⒉⑿牌溉Ц秾毝紩?huì)給我們一個(gè)唯一的URL Scheme
字符串竹椒,唯一是為了防止我們跳轉(zhuǎn)到他們的app后再返回的時(shí)候出錯(cuò),還有其他設(shè)備的URL Scheme
與我們的一樣就會(huì)造成返回錯(cuò)亂的情況米辐;再說(shuō)支付寶微信在返回我們的app的時(shí)候他們不去白名單里面添加我們的URL Scheme
胸完,那是因?yàn)樗麄冎牢覀兊脑O(shè)備肯定有我們的app,不然怎么會(huì)進(jìn)入到微信和支付寶的翘贮?又有人說(shuō)了我先進(jìn)到微信赊窥,在彈出返回自己app和留在微信的界面彈出,我進(jìn)入后臺(tái)去把自己的app卸載狸页,再去微信點(diǎn)擊返回自己的app,其實(shí)我也是這么測(cè)試的锨能,但是只要離開微信,返回自己app和留在微信的按鈕就會(huì)消失,所以微信返回其他的app是不需要在白名單添加其他app的URL Scheme
址遇。