Universal Link Fix Bug

Tip:發(fā)現(xiàn)在真機(jī)運(yùn)行中有觸發(fā)handoff功能的案例,只需要在代理方法中適當(dāng)返回NO即可荒辕。

關(guān)于iOS Universal Link 的資料不勝枚舉,關(guān)于基礎(chǔ)配置這里就不再詳述弛针。這里主要分享一下李皇,解決其中一個(gè)坑位的過(guò)程...

之前在配置好通用連接后,覺(jué)得完事大吉掉房。然而過(guò)了一段時(shí)間,產(chǎn)品同事來(lái)找茬咯~~~ 
話說(shuō)瘾杭,沒(méi)想到通用鏈接也有失效這樣一回事哪亿。萬(wàn)惡的蘋果爸爸~~~

基于這個(gè)問(wèn)題的描述如下:
iOS里面有個(gè)情況,打開APP的后在右上角形如:
xxx.com(面包屑導(dǎo)航)跳轉(zhuǎn)到safari后页徐,會(huì)導(dǎo)致Universal  Link 跳轉(zhuǎn)失效银萍。

在認(rèn)識(shí)這個(gè)問(wèn)題的時(shí)候恤左,首先需要考慮的是系統(tǒng)版本因素搀绣。發(fā)現(xiàn)在iOS11上通過(guò)通用鏈接啟動(dòng)APP后戳气,右上角并沒(méi)有發(fā)現(xiàn)面包屑導(dǎo)航。而在iOS10和iOS9 上會(huì)出現(xiàn)此問(wèn)題麻捻,所以問(wèn)題明朗了一點(diǎn)呀袱。

iOS11  下系統(tǒng)機(jī)制有所更改,所以本篇命題不會(huì)成立夜赵。
iOS10  以下,系統(tǒng)機(jī)制還不太成熟摊腋,這也是本篇命題存在的意義嘁傀。

能夠讓產(chǎn)品大大樂(lè)此不疲的一定是,某某某家的APP怎么就沒(méi)問(wèn)題呢类咧。所以我們不服氣的研究了一下某某某家的APP蟹腾。這里以兩個(gè)具有代表性的為例。

eg:在微信中娃殖,跳轉(zhuǎn)APP...  
今日頭條: 兩顆星
    表現(xiàn):呼起APP后,點(diǎn)擊右上角面包屑導(dǎo)航堕虹。會(huì)發(fā)現(xiàn)界面是向右側(cè)跳轉(zhuǎn)到Safari芬首,這一點(diǎn)很像是使用 openURL 實(shí)現(xiàn)的效果。
網(wǎng)易:    一顆星
    表現(xiàn):呼起APP后赦政,點(diǎn)擊右上角面包屑導(dǎo)航。WTF!!! 不可點(diǎn)恢着,這個(gè)解決方案就有點(diǎn)雞賊了。

Universal Link:失效的表現(xiàn)从诲,點(diǎn)擊右上角面包屑導(dǎo)航會(huì)發(fā)現(xiàn)頁(yè)面是向左側(cè)pop到Safari靡羡。
向左走還是向右走,簡(jiǎn)直是人生難題碎罚。

對(duì)比以上的結(jié)論:
問(wèn)題根源纳像,面包屑導(dǎo)航打開的是配置好的通用鏈接。這會(huì)讓系統(tǒng)誤以為竟趾,我們以后都會(huì)使用Safari打開通用鏈接從而導(dǎo)致失效岔帽。所以解決問(wèn)題的思路一定是要在,面包屑導(dǎo)航上做文章了犀勒。

能想到的方案如下:
獲取采用從狀態(tài)欄獲取網(wǎng)絡(luò)狀態(tài)的類似方法,來(lái)獲取面包屑導(dǎo)航的相關(guān)狀態(tài)钦购。從而問(wèn)題的解決可以分化為兩個(gè)方案褂萧。

1.在狀態(tài)欄上,貼一層UIView 覆蓋住面包屑導(dǎo)航导犹。這樣的好處是谎痢,iOS9--iOS11都可以獲得一致的體驗(yàn)。難點(diǎn)是要在KeyWindow的最上層添加节猿,否則容易破相。
2.獲取面包屑導(dǎo)航的觸發(fā)事件纫骑,使用運(yùn)行時(shí)替換事件九孩。主要目的是,為我們手動(dòng)調(diào)用openURL 方法提供便利煤墙,并可以修改跳轉(zhuǎn)鏈接為普通鏈接宪拥。

我這里采用了第二套方案,詳細(xì)過(guò)程如下:
抓取面包屑導(dǎo)航:

UIApplication *application = [UIApplication sharedApplication];
NSArray* arrChilden;
arrChilden = [[[application valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];

//查看subView 這個(gè)是沒(méi)有面包屑導(dǎo)航時(shí)的情況 
_subviewCache   __NSArrayM *    @"4 elements"   0x000060000065f6e0
[0] UIStatusBarServiceItemView *    0x7fa4eac8d310  0x00007fa4eac8d310
[1] UIStatusBarDataNetworkItemView *    0x7fa4ead01ec0  0x00007fa4ead01ec0
[2] UIStatusBarBatteryItemView *    0x7fa4ead1b070  0x00007fa4ead1b070
[3] UIStatusBarTimeItemView *   0x7fa4eae76ad0  0x00007fa4eae76ad0

//查看subView 這個(gè)是有面包屑導(dǎo)航時(shí)的情況
_subviewCache   __NSArrayM *    @"7 elements"   0x1562a850
[0] UIStatusBarBreadcrumbItemView * 0x16df8ff0
[1] UIStatusBarServiceItemView *    0x16875600
[2] UIStatusBarDataNetworkItemView *    0x16b73cd0
[3] UIStatusBarOpenInSafariItemView *   0x15556580
[4] UIStatusBarBatteryItemView *    0x16b594f0
[5] UIStatusBarBatteryPercentItemView * 0x169e0af0
[6] UIStatusBarTimeItemView *   0x16997bb0

其中 UIStatusBarBreadcrumbItemView 就是面包屑左導(dǎo)航
    UIStatusBarOpenInSafariItemView 就是面包屑右導(dǎo)航
接下來(lái)深挖 UIStatusBarOpenInSafariItemView脚作,一下就不詳細(xì)說(shuō)了缔刹。其中有一個(gè)事件是我們所關(guān)心的。
SEL: userDidActivateButton:
至此亿扁,入手點(diǎn)有了著落鸟廓。

Final Result:
AppDelegate中修復(fù)方法如下:

///注意 - (void)applicationDidBecomeActive:(UIApplication*)application 方法中調(diào)用)
- (void)fixUniversalLink{
    
    UIApplication *application = [UIApplication sharedApplication];
    NSArray* arrChilden;
    //是否是iPhoneX
    if ([[application valueForKeyPath:@"statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
        arrChilden = [[[[application valueForKeyPath:@"statusBar"] valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
    } else {
        arrChilden = [[[application valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
    }

    for (id child in arrChilden) {
        
        if ([child isKindOfClass:NSClassFromString(@"UIStatusBarOpenInSafariItemView")]) {
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                Class cls =  [child class];
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wundeclared-selector"
                //原方法
                Method  originalM = class_getInstanceMethod(cls, @selector(userDidActivateButton:));
#pragma clang diagnostic pop
                //替換方法
                Method exchangeM = class_getInstanceMethod([self class], @selector(myDidActivateButton:));
                method_exchangeImplementations(originalM, exchangeM);
            });
        }
    }
}
#pragma mark - 通用鏈接修復(fù)
- (void)myDidActivateButton:(UIButton*)btn{
    NSLog(@"測(cè)試....");
    [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末引谜,一起剝皮案震驚了整個(gè)濱河市员咽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骏融,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怀泊,死亡現(xiàn)場(chǎng)離奇詭異误趴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)枣申,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挟伙,“玉大人模孩,你說(shuō)我怎么就攤上這事≌ジ溃” “怎么了块茁?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)数焊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)仰禀,這世上最難降的妖魔是什么蚕愤? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任萍诱,我火速辦了婚禮,結(jié)果婚禮上裕坊,老公的妹妹穿的比我還像新娘。我一直安慰自己周瞎,他們只是感情好饵蒂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彼乌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慰照。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天稚铣,我揣著相機(jī)與錄音蝌衔,去河邊找鬼蝌蹂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剃允,可吹牛的內(nèi)容都是我干的齐鲤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼牡肉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淆九!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起炭庙,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤焕蹄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后腻脏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辽故,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年誊垢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂走。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芋肠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帖池,到底是詐尸還是另有隱情,我是刑警寧澤肴甸,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布囚巴,位于F島的核電站,受9級(jí)特大地震影響庶柿,放射性物質(zhì)發(fā)生泄漏秽浇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一审残、第九天 我趴在偏房一處隱蔽的房頂上張望击喂。 院中可真熱鬧,春花似錦懂昂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至伐蒋,卻和暖如春迁酸,著一層夾襖步出監(jiān)牢的瞬間俭正,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工串远, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儿惫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓留搔,卻偏偏與公主長(zhǎng)得像筐喳,于是被迫代替她去往敵國(guó)和親函喉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評(píng)論 25 707
  • 2008年 7月10日 星期四 晴 地上一片狼藉,有盤子的碎片捐下、玻璃杯的碎片,還有各種各樣其它碎片奸柬。 翁小姚又抓起...
    音樂(lè)如水閱讀 231評(píng)論 0 1
  • 今天又是周一婴程,我看完了我的小說(shuō),并把它歸還了還回答了一個(gè)問(wèn)題桌粉,我覺(jué)得自己沒(méi)有答好這個(gè)問(wèn)題,下次我一定好好回答...
    原味石閱讀 273評(píng)論 0 0
  • 下定義是一件很難的事情铃肯,所有人都有自己的標(biāo)準(zhǔn)传蹈,像是對(duì)于我步藕,期待的定義是什么呢挑格?大概就是出胡同的口,路兩邊飛奔的樹恕齐,...
    繁意閱讀 156評(píng)論 0 0
  • 當(dāng)我在辦公桌前翻看著一年工作報(bào)告的時(shí)候士骤,聽見幾句爭(zhēng)吵聲音越來(lái)越大: 簡(jiǎn),這個(gè)稿子難道不是你寫的拷肌?給我的職務(wù)...
    龍女卷風(fēng)閱讀 766評(píng)論 2 1