我們在瀏覽器材失、Safari中打開某個(gè)頁面時(shí)痕鳍,有時(shí)會有“打開APP”的這個(gè)功能,也就是說在web環(huán)境下調(diào)起該頁面對應(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平臺申請相應(yīng)的AppKey,并在mob后臺設(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后臺中設(shè)置的URL Scheme保持一致
3瞭空、將mob后臺中的Universal Link配置到項(xiàng)目的Associated Domains中
4疗我、 在Info.plist中添加“MOBAppKey”和“MOBAppSecret”
三咆畏、代碼部分的實(shí)現(xiàn)。
1吴裤、在需要打開的頁面配置對應(yīng)路徑
//定義的路徑
static NSString *const PMArticleMobLinkPath = @"/newsDetail";
+ (NSString *)MLSDKPath
{
return NewsDetailMobLinkPath;
}
2挠铲、實(shí)現(xiàn)帶有場景參數(shù)的初始化方法能扒,并根據(jù)場景參數(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í)候會通過相應(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í)路徑前面會多了“/”,比如web頁面配置的“newsDetail”,客戶端也配置的“newsDetail”和蚪,路徑看起來是一致的止状,但實(shí)際上客戶端打印路徑的時(shí)候是“/newsDetail”,也就是如果配置的路徑前面未加“/”,sdk會自動(dòng)為路徑加上”/”,這時(shí)客戶端必須把路徑配置為“/newsDetail”烹棉,這樣才能使得路徑統(tǒng)一,跳轉(zhuǎn)到對應(yīng)的頁面怯疤。
2浆洗、 頁面的打開方式。
SDK處理頁面的打開方式是: 如果APP中帶有導(dǎo)航控制器(UINavigationController)集峦,則恢復(fù)時(shí)MobLink會采用Push的方式伏社,但是如果APP中沒有導(dǎo)航控制器,則恢復(fù)時(shí)MobLink會采用Modal的方式少梁。由于APP的詳情頁中沒有使用系統(tǒng)自帶的導(dǎo)航欄洛口,所以打開頁面時(shí)MobLink會采用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)到對應(yīng)的頁面铺敌。