神奇的Cookie互通魔法

有這麼一種業務場景,讓PD們很頭痛。PD們絞盡乳汁想盡一切辦法去引流用戶下載本身設計的App,可是卻沒法統計真正用戶的下載量,這樣就沒法得出準確的轉化率。有沒有辦法,能統計用戶經過引導頁而且下載完app的真實體量呢?其實在iOS 9以後是能夠作到的。javascript

場景分析

用戶經過瀏覽器打開一個H5頁面,而後經過此H5頁面打開App Store下載連接。這中間涉及到一個黑盒即App Store下載過程是不可見的,開發者徹底感知不到。那麼咱們想一想有沒有一種方式,能取巧的破解這個難題。html

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

  • 應用內的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了嗎?cookie

OK,回到根本,咱們想在用戶毫無感知的狀況下,僅僅經過引導頁打開App Store,而且確認下載動做。app

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

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

好了,咱們已經找到一條路徑,能讓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以前的系統佔有率已經很低了,徹底能夠試試這種方式,並且這種需求是很是旺盛的。

相關文章
相關標籤/搜索