我們?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中

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)的頁面。