為什么使用通用鏈接?
Universal Links 是iOS9以后有的一個系統(tǒng)級功能,可以使我們的應(yīng)用分享到第三方應(yīng)用后點擊鏈接喚醒我們app,不過現(xiàn)在微信禁止了,微信中打開需要在sarfari中打開才可以喚醒.
為何不用scheme
scheme的方式是需要其他軟件中設(shè)有你app的白名單才可以跳轉(zhuǎn),這就不符合我們的要求,我們不可能讓所有的分享軟件都設(shè)有我們app的白名單,這是不合理的.所以不選擇.
實現(xiàn)通用鏈接功能分為三部
1、Developer Settings (開發(fā)者中心配置)
首先,需要在開發(fā)者中心開啟Associated Domains功能,具體操作是:

點擊要修改的 App ID,在列表中勾選 Associated Domains

在彈出框點確定,這個警告是告訴你,你如果啟用該功能,就相當(dāng)于編輯了這個 App ID,那么你現(xiàn)有的用該 App ID 生成的描述文件就得重新生成并導(dǎo)入至 Xcode 中了

點擊確定后,你會發(fā)現(xiàn) Associated Domains 可用了

點擊描述文件,發(fā)現(xiàn)失效了,那是因為你編輯過生成該描述文件用到的 App ID,不急,編輯它就是了

編輯描述文件,只需要重新勾選 App ID 即可,然后保存的描述文件又變成有效的了。下圖注釋中說的很明確了,Download 該描述文件,雙擊安裝即可

開發(fā)跟發(fā)布的描述文件都重新生成并下載安裝之后,開發(fā)者中心的配置就完成了
2、HTTPS Settings
有一個注冊的通過 SSL 訪問的域名(HTTPS)
假設(shè)你的域名為 domain ,例如:www.xxx.com 或 xxx.com 或 xxx.xxx.com 都能當(dāng)做是域名,具體看你后臺怎么給你配,我這里稱之為 domain,domain 代表上述那幾種域名。
支持上傳一個 JSON 文件到你的域名
用文本編輯器寫一個 JSON ,該 JSON 的格式是:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TeamID.BundleIdentifier",
"paths": [ "*" ]
}
]
}
}
這個 JSON 最好去 官方文檔粘貼復(fù)制,防止錯誤
上面的 appID 的組成結(jié)構(gòu)是 TeamID.BundleIdentifier
TeamID 可以去開發(fā)者中心的 Account -> Membership 下去找。如圖:

BundleIdentifier 就是你應(yīng)用的 Bundle Identifier

這個 JSON 其他 key 的作用我就不過多贅述了,具體看官方文檔,** paths** 我這里是用了 *,代表支持該域名下的所有鏈接跳轉(zhuǎn)至 App。
編輯好該 JSON 后,保存,命名為:apple-app-site-association,注意,這里不能給該文件冠以 .json之類的后綴

將保存好的 JSON 文件 apple-app-site-association上傳至HTTPS服務(wù)器域名的 根目錄 或者根目錄下的.well-known文件夾下。例如:https://domain/apple-app-site-association 或者 https://domain/.well-known/apple-app-site-association, 其中 domain 就是你的域名,上面已經(jīng)概述過。
上傳好 JSON 文件后,最簡單的辦法是通過瀏覽器訪問該文件,如果能得到該 JSON 內(nèi)容,說明已經(jīng)可以訪問該文件

3、Xcode 設(shè)置
Targets -> Capabilities -> Associated Domains

這里的操作就是添加 Domains,具體寫 applinks:domain,這里的 domain 跟上一步 Web Settings 里面的 domain 是一致的。
假設(shè)你的域名為 domain ,例如:www.xxx.com 或 xxx.com 或 xxx.xxx.com 都能當(dāng)做是域名,具體看你后臺怎么給你配,我這里稱之為 domain,domain 代表上述那幾種域名。
這里開啟了 Associated Domains 功能后,你的工程會自動創(chuàng)建一個 .entitlements 文件

到這里的時候,你的通用鏈接基本打通了。你可以通過簡單的方法來測試一下。
我的測試方法是
- 刪除已安裝的app,重新安裝;
- 待程序安裝好后,打開備忘錄,在備忘錄里面隨便輸入一個帶域名的鏈接,比如:https://domain/xxx, 點擊右上角完成按鈕;
- 長按該鏈接,如果已接通通用鏈接,底部彈出框會多出一欄,顯示“在xxx中打開”,其中這個xxx就是你應(yīng)用的名字。

4、寫代碼的地方
在AppDelegate.m 文件里 方法-application:continueUserActivity:restorationHandler:接受回掉獲取數(shù)據(jù)跳往對應(yīng)頁面
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *webUrl = userActivity.webpageURL;
NSLog(@"host = %@", webUrl.host);
NSString *urlString = webUrl.absoluteString;
NSArray *arr = [urlString componentsSeparatedByString:@"xxx"];
if (arr.count == 2) {
if ([[arr lastObject] length] > 0) {
NSString *paraString = [arr lastObject];
NSString *schemeStr = @"xxxxxxx";
if ([paraString hasPrefix:schemeStr]) {
NSLog(@"接收到了");
NSLog(@"root = %@", self.window.rootViewController);
id rootVC = self.window.rootViewController;
if ([rootVC isKindOfClass:[LoginNVC class]]) {
NSLog(@"未登錄,請先登錄");
} else {
NSLog(@"已登錄直接跳轉(zhuǎn)至指定頁面");
[self gotoDiffrentVCWithUrl:[NSURL URLWithString:paraString]];
}
}
}
}
return YES;
} else {
return NO;
}
}
當(dāng)跳轉(zhuǎn)我們app的時候,右上角有個返回按鈕,iOS 會記錄你的用戶習(xí)慣,如果用戶點了,那么就會從瀏覽器中打開,后面就不會打開app了,防止用戶點擊,于是我們阻擋右上角用戶交互,代碼如下
/**
添加右上角視圖(覆蓋UIStatusBarOpenInSafariItemView)
*/
- (void)addStatusBarRightView {
UIView *v = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
UIView *b = [[UIView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-100, 0, 100, 20)];
b.backgroundColor = clear();
[v addSubview:b];
}