iOS Universal Link 结合第三方实现微信唤起ap
2017-06-06 本文已影响388人
cyh老崔
一. 微信跳转app简介
- 能实现什么样的跳转? 由webView唤起app.
- webView如果用safari打开, 将唤起app, 这是原生的功能
- webView的按钮可以唤起app, 这是第三方的功能
- 为什么不能使用URL Scheme 实现app? 因为微信禁止.
一. Universal Link 基本使用
可参见这篇文章 <a href="http://www.jianshu.com/p/96649a73795b">iOS Universal Link(通用链接)</a>
三. 第三方网站: LinkedMe
此处我们利用第三方网站来实现
- linkedMe官网
- 技术支持QQ群: <em>209222314</em>
四. 集成步骤
- 自己注册得到
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
地址不对, 上述地址是我询问技术支持
得到.
-
配置
配置`URL Types`URL Types
:
-
配置
配置 `LinkedME Key`.pngLinkedME Key
到info.plist
:
-
LinkedME Key
来自:
`LinkedME Key`.png
- 配置
Associated Domains
:
`Associated Domains.png
- 注: 此处我配置了4值:
- 1与2 是我们的后台正式与测试url
- 3与4 是LinkedMe 要求的配置
- 配置
LinkedMe
官网需要的信息:Bundle ID
,Apple App Prefix
,URI Scheme
-
6.1 相关配置界面进入路径:
路径.png -
6.2 6.2 配置上述三个值:
Bundle ID`, `Apple App Prefix`, `URI Scheme`.pngBundle ID
,Apple App Prefix
,URI Scheme
- 集成代码:
-
注: 需要
JS
端集成相关JS SDK
, 几分钟即可集成完毕. -
7.1 在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
集成:
+ (void)yh_setupDeepLinkWithLaunchOptions:(NSDictionary *)launchOptions{
///deep link, 第三方linkedMe
//初始化及实例
LinkedME *linkedme = [LinkedME getInstance];
//获取跳转参数
[linkedme initSessionWithLaunchOptions:launchOptions automaticallyDisplayDeepLinkController:NO deepLinkHandler:^(NSDictionary* params, NSError* error) {
if (!error) {
//防止传递参数出错取不到数据,导致App崩溃这里一定要用try catch
@try {
YHLinkedMeM *linkedMeM = [YHLinkedMeM mj_objectWithKeyValues:params];
if (linkedMeM.$control.link.length >0) {
//if (title.length >0 && tag.length >0) {
//如果app需要登录或者注册后,才能打开详情页,这里可以先把值存起来,登录/注册完成后,再使用
//自定义跳转, 下面是我自己的方法, 不是linkedMe的
[self yh_jumpTriggeredByDeepLinkWithLink:linkedMeM.$control.link];
}
} @catch (NSException *exception) {
} @finally {
}
} else {
YHLog(@"LinkedME failed init: %@", error);
}
}];
}
注:
- 1 )上面是我封装的一个方法.
- 因
Deep Link
唤起app, 无论此时app在后台还是前台, 都会调用这个回调, 所有相关逻辑要在这个回调中处理:
处理回调.png
- 因
- 7.2 必须实现的3个方法
- 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 跳转处理
NSURL *webpageURL = userActivity.webpageURL;
NSString *urlString = webpageURL.absoluteString;
NSString *host = webpageURL.host;
if ([host isEqualToString:@"app.cuiyuhe.com"] ||
[host isEqualToString:@"apptest.cuiyuhe.com"]) {
//进行我们需要的处理
[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 {
// 跳转自己控制器, scheme跳转
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
的一个用户, 且认为解决了我的需求, 没有任何推销之意 :)
类似的平台还有魔窗mLink
等, 但是我没用过, 就不说啦.