我们在浏览器、Safari中打开某个页面时,有时会有“打开APP”的这个功能,也就是说在web环境下调起该页面对应的APP,并进入APP中的这个页面。在iOS9之前,要实现这个唤醒APP的功能,通常只能使用scheme。而这种方式需要提前判断系统中是否安装了能够响应此scheme的APP,并且这种方式在微信环境中是没法响应的。iOS9之后,推出了Universal Link, 可以通过传统的HTTP链接来启动APP,这种方式即使在微信环境中也可以实现激活原生APP。
项目中通过MobLink三方集成了H5激活原生APP指定页面的功能。 本文主要介绍一下MobLink的集成:
一、AppKey的获取及相关信息的设置
在mob平台申请相应的AppKey,并在mob后台设置APP的相关信息。下载MobLink SDK
二、项目中的准备工作
1、将MobLink SDK导入项目中,同时导入系统库:libsqlite3、libz1.2.5、libstdc++
2、在项目中配置URL Scheme,URL Scheme要和Mob后台中设置的URL Scheme保持一致
3、将mob后台中的Universal Link配置到项目的Associated Domains中
4、 在Info.plist中添加“MOBAppKey”和“MOBAppSecret”
三、代码部分的实现。
1、在需要打开的页面配置对应路径
//定义的路径
static NSString *const PMArticleMobLinkPath = @"/newsDetail";
+ (NSString *)MLSDKPath
{
return NewsDetailMobLinkPath;
}
2、实现带有场景参数的初始化方法,并根据场景参数还原该控制器
- (instancetype)initWithMobLinkScene:(MLSDKScene *)scene
{
if (self = [super init])
{
self.scene = scene;
}
return self;
3、在分享的方法中获取mobId
-(void)shareAction{
// 根据路径、来源以及自定义参数构造scene
MLSDKScene *scene = [[MLSDKScene alloc] initWithMLSDKPath:NewsDetailMobLinkPath source:@"NewsDetailViewController" params:nil];
__weak typeof(self) weakSelf = self;
[MobLink getMobId:scene result:^(NSString *mobId) {
weakSelf.mobid = mobId;
}];
[ShareSDKMethod shareToPlatformsWithNetImage:_imageURL
LocalImage:localImg
ShareContent:_shareContent
ShareLink:_shareLink
ShareTitle:_shareTitle];
}
4、MobLink在运行的时候会通过相应的delegate方法实现相应页面的还原跳转,MobLink的delegate方法不是必须实现的,但是要实现更多的自定义操作的话则需要通过这些delegate方法。
在APPdelegate中签代理IMLSDKRestoreDelegate
,设置MobLink代理
[MobLink setDelegate:self];
实现相关的代理方法IMLSDKWillRestoreScene,根据回调的scene,判断要打开的页面
//网页打开app时根据路径打开相应的页面
- (void) IMLSDKWillRestoreScene:(MLSDKScene *)scene Restore:(void (^)(BOOL, RestoreStyle))restoreHandler
{
NSLog(@"Will Restore Scene - Path:%@",scene.path);
if ([scene.path isEqualToString:NewsDetailMobLinkPath]) {
//新闻详情
NewsDetailViewController *detailVC=[ NewsDetailViewController new];
[detailVC setHidesBottomBarWhenPushed:YES];
detailVC.newsID=[scene.params[@"id"] integerValue];
[self.tabController.viewControllers[0] pushViewController:detailVC animated:NO];
}
} else{
restoreHandler(YES, MLDefault);
}
}
四、遇到的问题
在处理这部分时花费了不少时间,主要碰到的问题有两个,一是路径的配置,二是页面的打开方式。
1、 路径的配置。
一开始的时候,客户端和web配置的相同的路径,但是始终都是只能打开原生app,而不能跳转到具体的页面,知道是路径配置有问题,换了好些配置方式,均不可跳转,后来在打印跳转路径时发现,在web配置的路径,在客户端打印时路径前面会多了“/”,比如web页面配置的“newsDetail”,客户端也配置的“newsDetail”,路径看起来是一致的,但实际上客户端打印路径的时候是“/newsDetail”,也就是如果配置的路径前面未加“/”,sdk会自动为路径加上”/”,这时客户端必须把路径配置为“/newsDetail”,这样才能使得路径统一,跳转到对应的页面。
2、 页面的打开方式。
SDK处理页面的打开方式是: 如果APP中带有导航控制器(UINavigationController),则恢复时MobLink会采用Push的方式,但是如果APP中没有导航控制器,则恢复时MobLink会采用Modal的方式。由于APP的详情页中没有使用系统自带的导航栏,所以打开页面时MobLink会采用modal的方式打开,而在app中正常进入该页面时使用的是push的方式打开的,要想在web页面激活原生APP指定页面时也用push的方式呈现的话,需要客户端做相应处理,重写SDK中的代理方法
- (void) IMLSDKWillRestoreScene:(MLSDKScene *)scene Restore:(void (^)(BOOL, RestoreStyle))restoreHandler;
在该方法中自行处理页面的打开方式。
五、总结
激活指定页面的整个原理和push有点类似。客户端和web双方定义好相应的落地页路径的规则,当点击web页面中的”打开APP”按钮时,MobLink充当客户端和web页面之间的媒介,将要去往的路径和页面所需的ID告诉客户端,客户端根据路径和ID,跳转到对应的页面。