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中

开启此项功能,将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,跳转到对应的页面。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,532评论 25 708
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,971评论 6 342
  • 在刷微博的时候,看到了一条消息:南昌某男子携小三逼死原配。当然类似于这样小三插足的婚姻,社会上可谓屡见不鲜...
    子烟灵阅读 1,096评论 0 0
  • 生活中,我喜欢观察,喜欢刨根问底。 发生我身边的几个现象,一直不解,直到最近才理清楚缘由。 现象一:十来岁的孩子,...
    江瑞阅读 749评论 0 2