神奇的Cookie互通魔法

aassbab1 7年前發布 | 9K 次閱讀 iOS開發 移動開發

有這么一種業務場景,讓PD們很頭痛。PD們絞盡乳汁想盡一切辦法去引流用戶下載自己設計的App,但是卻無法統計真正用戶的下載量,這樣就無法得出準確的轉化率。有沒有辦法,能統計用戶通過引導頁并且下載完app的真實體量呢?其實在iOS 9之后是可以做到的。

場景分析

用戶通過瀏覽器打開一個H5頁面,然后通過此H5頁面打開App Store下載鏈接。這中間涉及到一個黑盒即App Store下載過程是不可見的,開發者完全感知不到。那么我們想想有沒有一種方式,能取巧的破解這個難題。

首先從瀏覽器開始分析,瀏覽器即WebView。這里會有兩種情況:

  • 應用內的UIWebView、WKWebView
  • 應用外的Safari

實際上,雖然很多用戶會在應用內的Webview(下面簡稱WV)打開引導頁,但是真正的場景下,例如在流量巨頭微信里頭,并不會機會給你引流到App Store,會將你攔截并且忽視請求(Deep Link是另一個玩意,這里不做討論)。

OK,所以我們反觀很多引導用戶下載的引導頁,通常會檢測WV的User-Agent,如果判斷不是Safari,通常會引導用戶到Safari打開這個鏈接。至此,其實對于需求來說,我們可以先排除應用內的WV,事實上排除這個對接下來的分析很有益處。

技術選型

有了具體的使用場景后,我們就可以分析,并且選出可行性的技術路線了。我們思考一下,其實歸根結到,也就是如何將Safari訪問過引導頁的數據讓開發者感知到,然后傳輸給后臺就完成了。

iOS獨有的沙盒機制,導致如果想直接從Safari傳輸數據給App,是不可能的,更何況我們的App根本沒下載完。如果是在引導頁點擊下載完,然后下載完App再跳回H5,接下來在H5再打開App確實是可以滿足統計的。但是這么麻煩的步驟,有幾個用戶會遵循,并且不覺得用戶體驗實在是太low了嗎?

OK,回到根本,我們想在用戶毫無感知的情況下,僅僅通過引導頁打開App Store,并且確認下載動作。

把思路轉向Cookie,說到這里,每個應用內的WV之間的Cookie是獨立的,不能共享,并且和Safari的Cookie也是獨立的。

這里思路卡住了,但是iOS 9有一個新東西:SFSafariViewController,它可以在App內用外部的Safari打開H5,并且與外部Safari共享緩存、Cookie等等。但是它卻不能像應用內WV一樣取得Cookie等,因為它沒有Api給你取。

好了,我們已經找到一條路徑,能讓Safari與App共享數據,接下來要解決的就是如何讓Safari將數據傳到App呢。思考一下,可以用scheme的方式喚起App,然后將參數通過URL帶過去。至此,技術過程描述結束。

實現細節

上面是細節流程圖,實現上首先在Safari打開引導頁時寫入一段Cookie,然后在App下載完成后,打開App時通過SFSafariViewController加載引導頁,然后通過window.location.href喚起已經打開的App(注意:如果在已經打開的App再通過這種方式喚起,用戶將無感知,而開發者能感知到),這樣就能在AppDelegate中拿到傳進來的URL了。

下面我們來看一下代碼,首先是一個H5 Demo:

<html>  
   <head>  
    <script type="text/javascript">
    function getCookie()
    {
        if (document.cookie.length>0)
        { 
        return document.cookie.replace("downloadFlag=", '')
        }
    }

    function setCookie()
    {
        var Days = 30;
        var exp = new Date(); 
        exp.setTime(exp.getTime() + Days*24*60*60*1000);
        document.cookie="downloadFlag=true"+";expires="+exp.toGMTString();
    }

    function checkCookie()
    {
        downloadFlag=getCookie()
        if (downloadFlag=="true")
        {
            window.location.href = "testCookie://downloadFlag"
        }
        else 
        {
            setCookie()
        }
    }
    </script>

    <title>  
       SafariDataToAppDemo
    </title>  
       <meta charset="utf-8">  
   </head>  
   <body onLoad="checkCookie()"> 
<div>  
    SafariDataToAppDemo
</div>  
   </body>  
</html>

大致解釋下這里做了什么,在這個Demo中,在加載的時候判斷是否已經存在Cookie,若存在則直接通過window.location.href隱式喚起App,否則寫入Cookie。而在Safari中第一次打開,會寫入Cookie。

接下來上native代碼:

#import "ViewController.h"
#import <SafariServices/SafariServices.h>

@interface ViewController ()

@property (nonatomic, strong) SFSafariViewController *sfVC;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.sfVC = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"http://127.0.0.1/test.html"]];
    [self addChildViewController:self.sfVC];
    [self.sfVC didMoveToParentViewController:self];
    [self.sfVC.view setFrame:CGRectMake(0, 0, 200, 200)];
    [self.view addSubview:self.sfVC.view];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

這里就很簡單,加載一個小到用戶看不見的SFSafariViewController,然后偷偷加載H5 Demo,由于共享Cookie的原因,會讀取到有Cookie鍵值對downloadFlag=true,然后就直接window.location.href隱式喚起App了。然后在AppDelegate上傳信息給后臺吧!

PS:這里必須得讓SFSafariViewController在當前Window可見,否則iOS將不會加載請求。

這里還要注意Cookie的失效時間,比如設置10分鐘,20分鐘(增強準確性,如果設置過長,那很有可能用戶通過引導頁打開過App Store但是不下載,然后很長一段時間后再下載,也許就是通過另一個渠道下載了)。

總結

市面上沒有一個埋點平臺能做到iOS下載統計,并且iOS 9之前的系統占有率已經很低了,完全可以試試這種方式,而且這種需求是非常旺盛的。

 

來自:http://kuailejim.com/2017/03/06/神奇的Cookie互通魔法/

 

 本文由用戶 aassbab1 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!