一. 微信跳轉(zhuǎn)app簡(jiǎn)介
- 能實(shí)現(xiàn)什么樣的跳轉(zhuǎn)? 由webView喚起app.
- webView如果用safari打開, 將喚起app, 這是原生的功能
- webView的按鈕可以喚起app, 這是第三方的功能
- 為什么不能使用URL Scheme 實(shí)現(xiàn)app? 因?yàn)槲⑿沤?
一. Universal Link 基本使用
可參見這篇文章 <a href="http://www.reibang.com/p/96649a73795b">iOS Universal Link(通用鏈接)</a>
三. 第三方網(wǎng)站: LinkedMe
此處我們利用第三方網(wǎng)站來實(shí)現(xiàn)
- linkedMe官網(wǎng)
- 技術(shù)支持QQ群: <em>209222314</em>
四. 集成步驟
- 自己注冊(cè)得到
LinkedME Key
- 此處我使用
cocopods
集成, 在Podfile
中添加:
pod 'LinkedME-iOS-Deep-Linking-SDK_Pod_IDFA',:git=>"https://github.com/WFC-LinkedME/LinkedME-iOS-Deep-Linking-Demo.git"
- 注: 文檔中的
pod
地址不對(duì), 上述地址是我詢問技術(shù)支持
得到.
-
配置
URL Types
:
-
配置
LinkedME Key
到info.plist
:
-
LinkedME Key
來自:
- 配置
Associated Domains
:
- 注: 此處我配置了4值:
- 1與2 是我們的后臺(tái)正式與測(cè)試url
- 3與4 是LinkedMe 要求的配置
- 配置
LinkedMe
官網(wǎng)需要的信息:Bundle ID
,Apple App Prefix
,URI Scheme
-
6.1 相關(guān)配置界面進(jìn)入路徑:
-
6.2 6.2 配置上述三個(gè)值:
Bundle ID
,Apple App Prefix
,URI Scheme
- 集成代碼:
注: 需要
JS
端集成相關(guān)JS SDK
, 幾分鐘即可集成完畢.7.1 在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
集成:
+ (void)yh_setupDeepLinkWithLaunchOptions:(NSDictionary *)launchOptions{
///deep link, 第三方linkedMe
//初始化及實(shí)例
LinkedME *linkedme = [LinkedME getInstance];
//獲取跳轉(zhuǎn)參數(shù)
[linkedme initSessionWithLaunchOptions:launchOptions automaticallyDisplayDeepLinkController:NO deepLinkHandler:^(NSDictionary* params, NSError* error) {
if (!error) {
//防止傳遞參數(shù)出錯(cuò)取不到數(shù)據(jù),導(dǎo)致App崩潰這里一定要用try catch
@try {
YHLinkedMeM *linkedMeM = [YHLinkedMeM mj_objectWithKeyValues:params];
if (linkedMeM.$control.link.length >0) {
//if (title.length >0 && tag.length >0) {
//如果app需要登錄或者注冊(cè)后,才能打開詳情頁结耀,這里可以先把值存起來竭钝,登錄/注冊(cè)完成后净赴,再使用
//自定義跳轉(zhuǎn), 下面是我自己的方法, 不是linkedMe的
[self yh_jumpTriggeredByDeepLinkWithLink:linkedMeM.$control.link];
}
} @catch (NSException *exception) {
} @finally {
}
} else {
YHLog(@"LinkedME failed init: %@", error);
}
}];
}
注:
- 1 )上面是我封裝的一個(gè)方法.
- 因
Deep Link
喚起app, 無論此時(shí)app在后臺(tái)還是前臺(tái), 都會(huì)調(diào)用這個(gè)回調(diào), 所有相關(guān)邏輯要在這個(gè)回調(diào)中處理:
- 因
- 7.2 必須實(shí)現(xiàn)的3個(gè)方法
- 7.2.1 方法一
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
if ([[userActivity.webpageURL description] rangeOfString:@"lkme.cc"].location != NSNotFound) {
return [[LinkedME getInstance] continueUserActivity:userActivity];
}else if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { //safari 跳轉(zhuǎn)處理
NSURL *webpageURL = userActivity.webpageURL;
NSString *urlString = webpageURL.absoluteString;
NSString *host = webpageURL.host;
if ([host isEqualToString:@"app.cuiyuhe.com"] ||
[host isEqualToString:@"apptest.cuiyuhe.com"]) {
//進(jìn)行我們需要的處理
[YHDeepLinkTool yh_jumpTriggeredByDeepLinkWithLink:urlString];
}
}
return YES;
}
- 7.2.2 方法二
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation{
//判斷是否是通過LinkedME的UrlScheme喚起App
if ([[url description] rangeOfString:@"click_id"].location != NSNotFound) {
return [[LinkedME getInstance] handleDeepLink:url];
}
return YES;
}
- 7.2.3 方法三
//判斷url 打開鏈接
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
// 跳轉(zhuǎn)自己控制器, scheme跳轉(zhuǎn)
NSString *kJumpPrefixStr = @"cuiyuhe://";
if ([url.absoluteString hasPrefix:kJumpPrefixStr]) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSString *urlStr = url.absoluteString;
NSString *subString = [urlStr substringFromIndex:kJumpPrefixStr.length];
NSString *ecodeStr=[self URLDecodedString:subString];
FMDetailsView *detailsView = [[FMDetailsView alloc]init];
detailsView.hidesBottomBarWhenPushed = YES;
detailsView.linkUrl = ecodeStr;
[[FMTabBarViewController sharedManager].selectedViewController pushViewController:detailsView animated:YES];
});
return YES;
}
/********* linkedMe --------- begin ********/
//判斷是否是通過LinkedME的UrlScheme喚起App
if ([[url description] rangeOfString:@"click_id"].location != NSNotFound) {
return [[LinkedME getInstance] handleDeepLink:url];
}
/********* linkedMe --------- end *********/
return YES;
}
四. 聲明
我也只是linkedMe
的一個(gè)用戶, 且認(rèn)為解決了我的需求, 沒有任何推銷之意 :)
類似的平臺(tái)還有魔窗mLink
等, 但是我沒用過, 就不說啦.