一被饿、說在前面的話
Universal Links 針對的是在 Web 中打開 App,Universal Links 比 Scheme 還要牛掰永丝!
二锹漱、MobLink 快速實現(xiàn)
借助 Mob 平臺 簡單實現(xiàn),詳情請見具體 開發(fā)文檔慕嚷。實現(xiàn)還是挺簡單的哥牍,也可以自己創(chuàng)建一個賬號,走一遍流程喝检。
三嗅辣、簡單的 Demo
3.1 簡要介紹
已經(jīng)將我的一個小實驗提交到我的 github UniversalLink8HTML,歡迎下載看看挠说。其中有兩個項目:
UniversalLinkDev:這就是目標項目澡谭。
HTMLDev:模擬的網(wǎng)頁端。
我將代碼打成 zip 包是因為不想做 .gitignore 文件损俭,因為 UniversalLinkDev的 pod 有點難 install蛙奖,我就干脆全部上傳。我 install 的時候重復了好幾次杆兵,不知何故雁仲。應(yīng)該不是 RP 的問題。如果要看具體的現(xiàn)實琐脏,必須要結(jié)合 開發(fā)文檔 來看攒砖。
項目運行
可以先運行 HTMLDev 項目,你能找到這個界面:
底部的條就是我們想要的效果日裙,這個時候點擊 “打開”吹艇,你沒有安裝 UniversalLinkDev 的情況下,你會跳轉(zhuǎn)到 UniversalLinkDev的下載網(wǎng)頁昂拂。但是現(xiàn)在只是一個測試受神,我寫成了一個我的簡書。
關(guān)于上面的這個界面是怎么實現(xiàn)的政钟,主要是根據(jù) Moblink 來實現(xiàn)的一個網(wǎng)頁路克,具體看代碼。
再運行 UniversalLinkDev 項目之后养交,直接關(guān)掉精算,代表在你的設(shè)備上已經(jīng)安裝了 UniversalLinkDev 項目。
再回到 HTMLDev 項目點擊打開碎连,會打開 UniversalLinkDev 項目灰羽,進入指定的界面。
3.2 代碼分析
在 UniversalLinkDev 項目中,有兩個地方值得注意分別如下:
1廉嚼、AppDelegate 文件中的這個方法:
// Universal Link 激活會執(zhí)行這個方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
[ULPlatform continueUserActivity:userActivity];
}
return YES;
}
continueUserActivity:方法可以做類似簡單的操作:
+ (void)continueUserActivity:(NSUserActivity *)userActivity {
NSURL* webpageURL = userActivity.webpageURL;
NSURLComponents* components = [NSURLComponents componentsWithURL:webpageURL resolvingAgainstBaseURL:YES];
// path
NSLog(@"path = %@", components.path);
NSLog(@"參數(shù) = %@", components.query);
for (NSURLQueryItem* item in components.queryItems) {
NSLog(@"key = %@\nvalue = %@", item.name, item.value);
// 僅僅用于測試
if ([item.name isEqualToString:@"info"]) {
UINavigationController* navVC = (UINavigationController*)[UIApplication sharedApplication].keyWindow.rootViewController;
UIViewController* vc = [[UIViewController alloc] init];
vc.title = item.value;
vc.view.backgroundColor = [UIColor blueColor];
[navVC pushViewController:vc animated:YES];
}
}
}
2玫镐、UIViewController+MLSDKRestore 中的這兩個方法
// Universal Link 就是通過這個方法找到對應(yīng)的路勁
+ (NSString *)MLSDKPath {
return @"/demo/a";
}
// Universal Link 通過這個方法將具體的參數(shù)場景傳入控制器
- (instancetype)initWithMobLinkScene:(MLSDKScene *)scene {
self = [super init];
self.scene = scene;
self.title = scene.params[@"title"];
return self;
}
以上的這兩個地方都是屬于通過 Universal Link 進入 APP 的執(zhí)行方法。這里需要注意的是:application: continueUserActivity: restorationHandler: 只要是通過 Universal Links 進來的都會執(zhí)行怠噪,所以需要對已經(jīng)做了MLSDKRestore 的做過濾恐似。
四、apple-app-site-association 的配置
這個文件傍念,理應(yīng)是我們自己生成的一個 JSON 格式的文件矫夷,應(yīng)該放在自己的另外一個(非當前 Web 域名)域名的服務(wù)器。但是在我上面的 Demo 中憋槐,Mob 平臺已經(jīng)自動在 Mob 平臺 生成了一個這樣的文件 apple-app-site-association 双藕。
具體內(nèi)容如下:
{
"applinks": {
"apps": [],
"details": [{
"appID": "D8Y5E9ZUX3.com.CoderHG.UniversalLinkDev",
"paths": ["*"]
}]
}
}
其中 D8Y5E9ZUX3 是我的 itemID, com.CoderHG.UniversalLinkDev 是 Bundle ID。
五阳仔、所謂的 Moblink 中的高級應(yīng)用
其實就是一個 delegate忧陪,可以將其分成兩類:
這兩個方法的執(zhí)行時機是項目一啟動的時候,說明了什么近范?說明 Moblink 在項目剛啟動的時候嘶摊,就會去找整個項目中已經(jīng)實現(xiàn) UIViewController+MLSDKRestore 的控制器,然后保存在內(nèi)存中评矩。這里就暴露了一個問題更卒,如果很多的話,對內(nèi)存就會有影響了稚照。
這個是針對某個場景的操作,也很容易理解俯萌。
六果录、主意事項
6.1 一個大坑
到這里,對 Universal Links 與 Moblink 應(yīng)該有那么一點點的理解了咐熙,接下來介紹一下我遇到的一個大坑:如何測試弱恒?
剛開始的時候,根本不知道如何做測試棋恼,尤其是網(wǎng)頁端返弹。最后從各方得到一個結(jié)論:必須要將自己的網(wǎng)頁提交到網(wǎng)站。厲害了爪飘,于是申請空間义起。最最浪費時間的是 FileZilla, 最后也沒有連接成功师崎。
后來想到使用現(xiàn)在的方式默终,沒想到還 成功 了。
當然還有一個主意點:
<script type="text/javascript" src="https://f.moblink.mob.com/3.0.1/moblink.js?appkey=271db5f52372a"></script>
src 一定要加 https://, 在 Moblink 中是沒有給的齐蔽,后來是我自己加的两疚。
6.2 Moblink 的機密
在調(diào)試的過程中,也發(fā)現(xiàn)使用 Moblink 的 Universal Links含滴,在 application: continueUserActivity: restorationHandler: 中收到的 webpageURL 中的 params 是加密的诱渤。本來不用知道具體是怎么加密的,但是強迫癥就想知道谈况。查看 Moblink 文件發(fā)現(xiàn)一個 Base64勺美, 還以為是 Base64, 但是不對鸦做。后來咨詢了一下官方励烦,他的回復是:不用管,具體如何實現(xiàn)的泼诱,機密不可外露坛掠,不能告訴我。
七治筒、總結(jié)
簡書寫得簡單了屉栓,具體的還得看代碼UniversalLink8HTML。