iOS集成MobLink,实现H5激活原生APP指定页面

我们在浏览器、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中

iOS集成MobLink,实现H5激活原生APP指定页面_第1张图片
开启此项功能,将Universal Link配置到此处

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,跳转到对应的页面。

你可能感兴趣的:(iOS集成MobLink,实现H5激活原生APP指定页面)