iOS集成MobLink,實(shí)現(xiàn)H5激活原生APP指定頁面

我們?cè)跒g覽器、Safari中打開某個(gè)頁面時(shí),有時(shí)會(huì)有“打開APP”的這個(gè)功能,也就是說在web環(huán)境下調(diào)起該頁面對(duì)應(yīng)的APP,并進(jìn)入APP中的這個(gè)頁面。在iOS9之前,要實(shí)現(xiàn)這個(gè)喚醒APP的功能,通常只能使用scheme。而這種方式需要提前判斷系統(tǒng)中是否安裝了能夠響應(yīng)此scheme的APP,并且這種方式在微信環(huán)境中是沒法響應(yīng)的。iOS9之后,推出了Universal Link, 可以通過傳統(tǒng)的HTTP鏈接來啟動(dòng)APP,這種方式即使在微信環(huán)境中也可以實(shí)現(xiàn)激活原生APP。

項(xiàng)目中通過MobLink三方集成了H5激活原生APP指定頁面的功能。 本文主要介紹一下MobLink的集成:

一、AppKey的獲取及相關(guān)信息的設(shè)置

在mob平臺(tái)申請(qǐng)相應(yīng)的AppKey,并在mob后臺(tái)設(shè)置APP的相關(guān)信息。下載MobLink SDK

二、項(xiàng)目中的準(zhǔn)備工作

1、將MobLink SDK導(dǎo)入項(xiàng)目中,同時(shí)導(dǎo)入系統(tǒng)庫:libsqlite3、libz1.2.5、libstdc++
2、在項(xiàng)目中配置URL Scheme,URL Scheme要和Mob后臺(tái)中設(shè)置的URL Scheme保持一致
3、將mob后臺(tái)中的Universal Link配置到項(xiàng)目的Associated Domains中

開啟此項(xiàng)功能,將Universal Link配置到此處

4、 在Info.plist中添加“MOBAppKey”和“MOBAppSecret”

三、代碼部分的實(shí)現(xiàn)。

1、在需要打開的頁面配置對(duì)應(yīng)路徑

//定義的路徑
static NSString *const PMArticleMobLinkPath = @"/newsDetail";
+ (NSString *)MLSDKPath
{
    return NewsDetailMobLinkPath;
}

2、實(shí)現(xiàn)帶有場(chǎng)景參數(shù)的初始化方法,并根據(jù)場(chǎng)景參數(shù)還原該控制器

- (instancetype)initWithMobLinkScene:(MLSDKScene *)scene
{
    if (self = [super init])
    {
        self.scene = scene;
    }
return self;

3、在分享的方法中獲取mobId

-(void)shareAction{
    // 根據(jù)路徑、來源以及自定義參數(shù)構(gòu)造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在運(yùn)行的時(shí)候會(huì)通過相應(yīng)的delegate方法實(shí)現(xiàn)相應(yīng)頁面的還原跳轉(zhuǎn),MobLink的delegate方法不是必須實(shí)現(xiàn)的,但是要實(shí)現(xiàn)更多的自定義操作的話則需要通過這些delegate方法。

在APPdelegate中簽代理IMLSDKRestoreDelegate,設(shè)置MobLink代理
[MobLink setDelegate:self];

實(shí)現(xiàn)相關(guān)的代理方法IMLSDKWillRestoreScene,根據(jù)回調(diào)的scene,判斷要打開的頁面

//網(wǎng)頁打開app時(shí)根據(jù)路徑打開相應(yīng)的頁面

- (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);
    }
}

四、遇到的問題

在處理這部分時(shí)花費(fèi)了不少時(shí)間,主要碰到的問題有兩個(gè),一是路徑的配置,二是頁面的打開方式。

1、 路徑的配置。
一開始的時(shí)候,客戶端和web配置的相同的路徑,但是始終都是只能打開原生app,而不能跳轉(zhuǎn)到具體的頁面,知道是路徑配置有問題,換了好些配置方式,均不可跳轉(zhuǎn),后來在打印跳轉(zhuǎn)路徑時(shí)發(fā)現(xiàn),在web配置的路徑,在客戶端打印時(shí)路徑前面會(huì)多了“/”,比如web頁面配置的“newsDetail”,客戶端也配置的“newsDetail”,路徑看起來是一致的,但實(shí)際上客戶端打印路徑的時(shí)候是“/newsDetail”,也就是如果配置的路徑前面未加“/”,sdk會(huì)自動(dòng)為路徑加上”/”,這時(shí)客戶端必須把路徑配置為“/newsDetail”,這樣才能使得路徑統(tǒng)一,跳轉(zhuǎn)到對(duì)應(yīng)的頁面。

2、 頁面的打開方式。
SDK處理頁面的打開方式是: 如果APP中帶有導(dǎo)航控制器(UINavigationController),則恢復(fù)時(shí)MobLink會(huì)采用Push的方式,但是如果APP中沒有導(dǎo)航控制器,則恢復(fù)時(shí)MobLink會(huì)采用Modal的方式。由于APP的詳情頁中沒有使用系統(tǒng)自帶的導(dǎo)航欄,所以打開頁面時(shí)MobLink會(huì)采用modal的方式打開,而在app中正常進(jìn)入該頁面時(shí)使用的是push的方式打開的,要想在web頁面激活原生APP指定頁面時(shí)也用push的方式呈現(xiàn)的話,需要客戶端做相應(yīng)處理,重寫SDK中的代理方法
- (void) IMLSDKWillRestoreScene:(MLSDKScene *)scene Restore:(void (^)(BOOL, RestoreStyle))restoreHandler;在該方法中自行處理頁面的打開方式。

五、總結(jié)

激活指定頁面的整個(gè)原理和push有點(diǎn)類似。客戶端和web雙方定義好相應(yīng)的落地頁路徑的規(guī)則,當(dāng)點(diǎn)擊web頁面中的”打開APP”按鈕時(shí),MobLink充當(dāng)客戶端和web頁面之間的媒介,將要去往的路徑和頁面所需的ID告訴客戶端,客戶端根據(jù)路徑和ID,跳轉(zhuǎn)到對(duì)應(yīng)的頁面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,029評(píng)論 25 709
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,272評(píng)論 6 342
  • 在刷微博的時(shí)候,看到了一條消息:南昌某男子攜小三逼死原配。當(dāng)然類似于這樣小三插足的婚姻,社會(huì)上可謂屢見不鮮...
    子煙靈閱讀 1,224評(píng)論 0 0
  • 生活中,我喜歡觀察,喜歡刨根問底。 發(fā)生我身邊的幾個(gè)現(xiàn)象,一直不解,直到最近才理清楚緣由。 現(xiàn)象一:十來歲的孩子,...
    江瑞閱讀 802評(píng)論 0 2

友情鏈接更多精彩內(nèi)容