1、需求說(shuō)明
應(yīng)用間跳轉(zhuǎn):通過(guò)一個(gè)AppA內(nèi)的某一個(gè)操作打開(kāi)另外一個(gè)一個(gè)AppB,AppB若下載則直接跳轉(zhuǎn)過(guò)去,若未下載則跳到應(yīng)用商店讓用戶(hù)下載;
網(wǎng)頁(yè)跳轉(zhuǎn)App:手機(jī)打開(kāi)網(wǎng)頁(yè),通過(guò)網(wǎng)頁(yè)上的某一個(gè)操作打開(kāi)App,若已安裝App則跳轉(zhuǎn)App,若未安裝App則跳到應(yīng)用商店讓用戶(hù)下載;
2野哭、使用方法
應(yīng)用間跳轉(zhuǎn)可以通過(guò)URL Scheme來(lái)實(shí)現(xiàn),將參數(shù)配置在url scheme后面,喚醒a(bǔ)pp再進(jìn)行頁(yè)面跳轉(zhuǎn)邏輯;
需要特別說(shuō)明的微信和QQ分享內(nèi)容url scheme和Universal Links方式統(tǒng)統(tǒng)被禁用了,除非你是騰訊系的加入他們的白名單;
網(wǎng)頁(yè)跳轉(zhuǎn)App可以通過(guò)meta 標(biāo)簽來(lái)實(shí)現(xiàn);
下面我們對(duì)URL Scheme在塔、meta 標(biāo)簽、Universal Links一一進(jìn)行說(shuō)明.
方法一: URL Scheme
URL Scheme是什么
由于蘋(píng)果的app都是在沙盒中拨黔,相互是不能訪問(wèn)數(shù)據(jù)的蛔溃。但是蘋(píng)果還是給出了一個(gè)可以在app之間跳轉(zhuǎn)的方法:URL Scheme。簡(jiǎn)單的說(shuō)篱蝇,URL Scheme就是一個(gè)可以讓app相互之間可以跳轉(zhuǎn)的協(xié)議贺待。每個(gè)app的URL Scheme都是不一樣的,如果存在一樣的URL Scheme零截,那么系統(tǒng)就會(huì)響應(yīng)先安裝那個(gè)app的URL Scheme麸塞,因?yàn)楹蟀惭b的app的URL Scheme被覆蓋掉了,是不能被調(diào)用的涧衙。
URL Scheme有什么作用
那么app之間的跳轉(zhuǎn)有什么作用呢哪工?我們所使用的每一個(gè)app就相當(dāng)于一個(gè)功能,app的跳轉(zhuǎn)可以使得每個(gè)app就像一個(gè)功能組件一樣弧哎,幫助我們完成需要做的事情雁比,比如三方支付,搜索撤嫩,導(dǎo)航偎捎,分享等等
URL Scheme怎么使用
要跳轉(zhuǎn)到別人的app,就要知道別人的app的跳轉(zhuǎn)協(xié)議是什么序攘,需要傳入什么參數(shù)茴她,我們常見(jiàn)的跳轉(zhuǎn)協(xié)議有下面這些:
1.打開(kāi)email
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"mailto://info@icloud.com"]]
2.打開(kāi)電話
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"tel://18688886666"]];
3.打開(kāi)SMS
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"sms:18688886666"]];
所以,如果我們希望別人打開(kāi)我們的app程奠,只要在plist文件中配置一下你的跳轉(zhuǎn)協(xié)議即可丈牢,如下圖所示:
“emp601602://”就是我的跳轉(zhuǎn)協(xié)議了,編譯一下app梦染,在safari中輸入“emp601602:// ”就可以跳轉(zhuǎn)到我的app中赡麦。
但是在Xcode 9 下,新建的工程帕识,在plist文件中注冊(cè)URL Schemes泛粹,是無(wú)法從safari啟動(dòng)app的。
需要在如下位置注冊(cè)URL Schemes肮疗,
“emp601602:// ”只能讓用戶(hù)跳轉(zhuǎn)到我們的app晶姊,之后的處理是在appDelegate的代理中,代理方法如下:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
在這個(gè)方法里伪货,可以獲取到觸發(fā)這個(gè)方法的 URL们衙,可以通過(guò)對(duì)這個(gè) URL 進(jìn)行判斷钾怔,例如根據(jù)不同的 Host,不同的 Query String 來(lái)執(zhí)行不同的動(dòng)作蒙挑。
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
NSLog(@"%@", [url absoluteString]);
// 在 host 等于 item.taobao.com 時(shí)宗侦,說(shuō)明一個(gè)寶貝詳情的 url,
// 那么就使用本地的 TBItemDetailViewController 來(lái)顯示
if ([[url host] isEqualToString:@"item.taobao.com"]) {
// 這里只是簡(jiǎn)單地假設(shè) url 形式為 taobao://item.taobao.com/item.htm?id=12345678
// 先獲取要查看的寶貝詳情的 itemId
NSString *itemId = [[url query] substringFromIndex:[[url query] rangeOfString:@"id="].location+3];
// 使用本地 ViewController 來(lái)顯示淘寶商品詳情
TBItemDetailViewController *controller = [[TBItemDetailViewController alloc] initWithItemId:itemId];
[self.navigationController pushViewController:controller animated:YES];
}
}
在你的動(dòng)作執(zhí)行完成了之后忆蚀,有可能時(shí)需要返回到原有app的矾利,這樣就需要你的app跳轉(zhuǎn)協(xié)議的url里面應(yīng)該能傳入調(diào)用者app的跳轉(zhuǎn)協(xié)議,這樣用戶(hù)跳轉(zhuǎn)到你的app完成動(dòng)作后就能跳轉(zhuǎn)回去了馋袜。
方法二 :meta標(biāo)簽
現(xiàn)需要添加URL Scheme為 WideSchooliphoneApp,同時(shí)添加已上線的app-id以便于跳轉(zhuǎn)AppStore
<!DOCTYPE html>
<html>
<head>
<title>IOS 通過(guò)瀏覽器打開(kāi)App(小闊學(xué)堂)</title>
<meta charset="UTF-8" name="apple-itunes-app" content="app-id=xxxxxxx, affiliate-data=myAffiliateData, app-argument=WideSchooliphoneApp://">
</head>
<body>
<div class="back">
<p>
<font size="20px">
實(shí)時(shí)互動(dòng)<br>
直播課堂<br>
<a href="WideSchooliphoneApp://courseId=1234" >打開(kāi)小闊學(xué)堂PP</a><br>
大數(shù)據(jù)分析<br>
</font>
</p>
</div>
</body>
</html>
點(diǎn)擊頁(yè)面上的打開(kāi)小闊學(xué)堂
方法三 : Universal Links
什么是Universal Links
Universal Links就是一個(gè)通用鏈接男旗,iOS9以上的用戶(hù),可以通過(guò)點(diǎn)擊這個(gè)鏈接無(wú)縫的重定向到一個(gè)app應(yīng)用欣鳖,而不需要通過(guò)safari打開(kāi)跳轉(zhuǎn)察皇。
如果用戶(hù)沒(méi)有安裝這個(gè)app,則會(huì)在safari中打開(kāi)這個(gè)鏈接指向的網(wǎng)頁(yè)泽台。
如何支持Universal Links
按照蘋(píng)果官方文檔來(lái)說(shuō)什荣,支持通用鏈接非常簡(jiǎn)單喲,只需要三步:
1.創(chuàng)建一個(gè)名字叫做apple-app-site-association师痕,包含固定格式的json文件
2.將這個(gè)文件上傳到你的服務(wù)器溃睹,可以將這個(gè)文件放到服務(wù)器的根目錄下而账,也可以放到.well-known這個(gè)子目錄下胰坟。
3.配置app,然后在app里面添加代理方法
如果已經(jīng)配置過(guò)Universal Links泞辐,那么在用戶(hù)第一次安裝app時(shí)笔横,蘋(píng)果會(huì)發(fā)送一個(gè)請(qǐng)求,請(qǐng)求你服務(wù)器上的apple-app-site-association文件咐吼。
請(qǐng)求apple-app-site-association文件成功之后吹缔,用戶(hù)就可以使用Universal Links喚醒a(bǔ)pp了。
詳細(xì)的配置流程如下
(1) 關(guān)于apple-app-site-association文件的配置
"applinks": {
"apps": [],
"details": [
{
"appID": "C9ANJ7EAW8.com.codyy.iWideSchooliphone",
"paths": ["/h5/course.html*"]
}
]
}
}
創(chuàng)建一個(gè)包含上述格式的json文件锯茄,文件名字必須為apple-app-site-association厢塘,不能帶后綴名,有的電腦設(shè)置的隱藏后綴名肌幽,這點(diǎn)需要注意晚碾。
appID
appID 的 格式為 teamID.bundleId形式。
如何獲取teamID
登錄開(kāi)發(fā)者網(wǎng)站 喂急,找到Membership
選項(xiàng)卡格嘁。
譬如說(shuō)我的teamID是xxxxxxxxxxx,bundleId是com.mytest.app
那么我的appID就是:xxxxxxxxxxx.com.mytest.app
path路徑
paths配置廊移,實(shí)際上就是限制哪些路徑可以喚醒a(bǔ)pp糕簿,哪些路徑不能喚醒a(bǔ)pp探入。格式如下:
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/", "/videos/wwdc/201?/"]
使用*配置,則整個(gè)網(wǎng)站都可以使用
使用特定的URL,例如/wwdc/news/來(lái)指定某一個(gè)特殊的鏈接
在特定URL后面添加跟衅,例如 /videos/wwdc/2015/, 來(lái)指定網(wǎng)站的某一部分
除了使用來(lái)匹配任意字符闷畸,你也可以使用 ?來(lái)匹配單個(gè)字符,你可以在路徑當(dāng)中結(jié)合這兩個(gè)字符使用徒爹,例如 /foo//bar/201?/mypage
需要注意的是:配置的paths路徑,是區(qū)分大小寫(xiě)的
驗(yàn)證apple-app-site-association文件
文件配置完成之后芋类,將其上傳到你的服務(wù)器根目錄或者`.well-known`這個(gè)子目錄下隆嗅。
- 確保使用
https://yourdomain.com/apple-app-site-association
這個(gè)鏈接可以訪問(wèn)到,yourdomain.com
為你的服務(wù)器域名侯繁。 - 也可以使用蘋(píng)果的驗(yàn)證網(wǎng)站胖喳,驗(yàn)證文件是否能被蘋(píng)果請(qǐng)求到。如果是未上線的應(yīng)用贮竟,使用驗(yàn)證網(wǎng)站時(shí)可能出現(xiàn)如下提示:
- 出現(xiàn)該提示為apple-app-site-association文件配置正確丽焊。
- 出現(xiàn)404錯(cuò)誤碼提示,則為apple-app-site-association文件未上傳成功咕别,或者使用https://yourdomain.com/apple-app-site-association路徑無(wú)法訪問(wèn)技健。
(2) 建立web網(wǎng)頁(yè)和app應(yīng)用之間的關(guān)聯(lián) -> app IDs 配置 和 項(xiàng)目配置
app IDs 配置
進(jìn)入開(kāi)發(fā)者網(wǎng)站,找到你自己的bundleId
惰拱,可以點(diǎn)擊edit
按鈕雌贱,開(kāi)啟associate domains
,如下圖:
項(xiàng)目配置:
在項(xiàng)目的Capablities中開(kāi)啟Associated domains偿短,如下圖:
注意domains可以添加多個(gè)欣孤,前綴必須為applinks:,applinks:后為你的服務(wù)器的域名昔逗。
代碼接收Universal Links喚醒
在appdelegate中實(shí)現(xiàn)上面這個(gè)方法降传,當(dāng)使用Universal Links喚醒a(bǔ)pp時(shí)就執(zhí)行這個(gè)方法。
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
NSLog(@"userActivity : %@",userActivity.webpageURL.description);
return YES;
}
(3)驗(yàn)證以上配置
快捷驗(yàn)證勾怒,在備忘錄中輸入https://yourdomain.com/apple-app-site-association婆排,長(zhǎng)按這個(gè)鏈接,出現(xiàn)下圖提示則配置成功
目前知曉的就是以上三種方法,其中的坑還需要一個(gè)個(gè)踩踩.
參考文章:
iOS9 Universal Links踩坑之旅笔链,移動(dòng)應(yīng)用之deeplink喚醒a(bǔ)pp