需求
- 用手機打開我們的網頁,點擊打開按鈕或者收藏按鈕,可以直接喚醒app,如果未安裝app,則跳轉到應用商店提示下載。
目前通用的方式有三種:
- Universal Links;
- url schemes;
- meta標簽;
下面就來介紹一下這三種方式
meta標簽
這種方式在國外的網頁和app上好像比較常見,可以在網頁上的meta標簽做手腳,類似下圖的效果:
meta標簽的格式如下:
<meta charset="UTF-8" name="apple-itunes-app" content="app-id=1234567890, affiliate-data=myAffiliateData, app-argument=yourScheme://">
這樣添加meta標簽后,使用Safari打開網頁就會在網頁上方,顯示自己app的信息導航條。
如果沒有安裝app可以點擊跳轉App Store去下載,如果安裝了app就會自動打開app。
url Schemes
步驟如下:在項目里,info最下端,找到URL Types,add一個新的url scheme,這里幾個參數最好都填一下,Url Schemes是必填的,如下圖所示:
這里配置完之后,info.plist文件自動會加入一個配置:
接著在AppDelegate里的handleOpenURL
捕獲跳轉過來的url,獲取參數:
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
if (!url) {
return NO;
}
NSString *urlStr = url.absoluteString;
NSLog(@"handleOpenURL:%@",urlStr);
return YES;
}
接著可以在模擬器的Safari瀏覽器地址欄輸入:TestOC://
格式為URL Schemes
:
//
三部分組成。
點擊open,就會跳轉到app,并且走到handleOpenURL
這個代理方法中。
Universal Links
什么是Universal Links
Universal Links是iOS9之后支持的一個通用鏈接,iOS9以上的用戶可以通過點擊這個鏈接無縫的重定向到一個app應用,而不需要通過Safari打開。
如果用戶沒有安裝這個app,則會再Safari中打開這個鏈接。
詳細的配置流程如下:
一、創建一個名為apple-app-site-association
,包含固定格式的json文件。
關于apple-app-site-association
文件的格式如下:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "teamID.bundleId",
"paths": ["/deaplink","/wwdc/news/","*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
這里需要注意的是,文件名必須為apple-app-site-association
不能有后綴,需要注意。
appID的格式為teamID
.bundle id
,paths就是配置哪些路徑可以喚醒,哪些路徑不能喚醒,可以使用*
?
幫助配置。這里paths配置的路徑是區分大小寫的。
二、驗證apple-app-site-association
文件
文件配置完成之后,需要將文件放到服務器的根目錄下,或者是.well-known
這個子目錄下。
- 確保使用
https://yourDomain.com/apple-app-site-association
這個鏈接可以訪問到,yourDomain就是你的服務器域名。 - 也可以使用蘋果的驗證網站(https://search.developer.apple.com/appsearch-validation-tool/),驗證文件是否能被蘋果請求到。如果是未上線的問題,使用驗證網站可能會提示你
Error no apps with domain entitlements
出現該提示則說明配置正確,出現404則說明配置錯誤。
三、項目和工程配置
使用Universal Links需要給app IDs配置打開 Association Domain
選項,進入開發者網站,找到自己的bundle id,edit,打開Association Domain。
然后就是工程配置。
在工程的Capabilities
中開啟Association Domain
并且可以添加多個domains,格式為applinks:
服務器域名
接著在AppDelegate中實現代理方法,注意跟url schemes的代理方法不是同一個
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
NSLog(@"userActivity : %@",userActivity.webpageURL.description);
return YES;
}
當app通過Universal Link 喚醒是 就會回調到這個方法,獲取信息。
四、驗證以上配置
在備忘錄中,輸入https://yourDomain.com/apple-app-site-association
并點擊,如果出現在***中打開
則說明配置成功。
Universal Links總結
- 服務器必須支持https,且必須是蘋果新人的TSL證書,蘋果支持的根證書列表;
-
apple-app-site-association
文件名千萬不能寫錯,沒有后綴; - 只有在初次安裝時,才會去請求下載
apple-app-site-association
文件,所以可能會出現因為網絡波動導致下載失敗的情況,當工程中修改了Association Domain
配置時,也會重新去請求下載apple-app-site-association
文件。 - 還有一個問題,配置完成之后,備忘錄和Safari都可以成功,但是在其他應用里面不成功,未跨域導致的,如:分享到微信的鏈接是(https://www.mydomain.com/share.html),然后該網頁中的“在app內打開”按鈕配置的通用鏈接為 (https://www.mydomain.com/index.html)。
跨域的意思是說,通用鏈接 和 調用通用鏈接的網頁不要使用同一域名。
即如果通用鏈接域名為“www.mydomain.com”,則通用鏈接所處的網頁域名就不能是“www.mydomain.com”。
ps.之前用Universal Links可以在微信中直接喚起app,目前好像也已經被企鵝和微信給屏蔽了。只能說一句太流氓了。現在大多數app的做法又跟url scheme類似了,如果分享到微信,加一層蒙版,引導在Safari中打開。
覺得有用,請幫忙點亮紅心
Better Late Than Never!
努力是為了當機會來臨時不會錯失機會。
共勉!