iOS未安裝APP獲取Safari瀏覽器數據(可用來記錄下載渠道及推廣源)

原文鏈接:http://www.hudongdong.com/ios/373.html

本篇文章的目的就是要達成未安裝的app在安裝app之後,去獲取安裝app之前Safari所瀏覽的數據,比如說用戶在未安裝手機百度時,已經在Safari瀏覽器中登錄了百度帳號,當安裝手機百度之後,打開該APP可以自動登錄這個Safari瀏覽器中所登錄的百度帳號。

當然也可以達成那種效果,比如打開某個帶有邀請碼的網頁推薦用戶去下載app,當通過appstore下載完app之後,打開該app,可以知道該邀請碼是多少,網頁和下載app之間隔了一層appstore,不能從網頁直接傳值到app,所以如果未安裝該app的話,就需要網頁和app去讀取一個相同的值去標記,但是對於ios系統來說,idfa等唯一標識符只能app獲取,網頁獲取不到,所以一般無法通信

 

空白.png

 

比如上面這個圖,A用戶從web網頁跳轉到appstore,再從appstore下載app,但是這個過程中,也許用戶A、B、C都在下載該軟件,web網頁是無法直接像app傳送任何數據的,所以就需要確認到底哪個是從web網頁推薦過來下載的,哪些是自己去appstore下載的。

一、判斷唯一用戶

1、通過idfa等標識判斷

idfa等唯一標識只有oc能獲取,但是網頁一般獲取不到ios的idfa,uuid等硬件的唯一標識符(除非使用蘋果配置文件,這個用戶需要安裝,無法做到無痕,而且使用起來比較麻煩,有興趣的可以去看看)

2、通過多重可獲取的信息綜合判斷

由於無法準確的獲得idfa等信息,所以可以多記錄幾個網頁和app都能獲取的數據,比如網絡模式、IP、時間、機型、位置等,通過多重判斷來看是不是同一個人,但是這種方式是存在誤差的,比如一個公司用的同一個網絡同一個機型的兩個人就會判斷有錯誤。

3、通過cookies判斷

之前是不可以的,因爲ios應用是沙盒運行,app之間創建的webview之間的cookies都是沙盒狀態的,但是ios9之後,終於增加了一個全新的類SFSafariViewController,這個相當於在app內部創建了一個safari瀏覽器,用的和safari瀏覽器共同的cookies,所以可以用SFSafariViewController來獲取cookies

二、使用SFSafariViewController

這個SFSafariViewController很簡單,導入頭文件#import <SafariServices/SafariServices.h>就可以像其他普通的viewcontroller一樣創建

SFSafariViewController一般使用這兩個代理函數

使用之後就可以打開指定的url,並且使用的是safari的cookies,打開的頁面樣子像下面這樣

下面的工具欄在代理中也可以設置,但是一般不自己再設置了

三、網頁和app共用cookies

使用SFSafariViewController訪問域名之後,用的就是用safari打開的頁面的cookies,比如我在手機的safari頁面打開的網址是:www.hudongdong.com/uid/20,產生了一個cookies:20,然後我在app中打開網址www.hudongdong.com的時候,就可以用到同一個cookies:20,,而別人如果沒有用safari頁面事先打開這個網址的話,cookies:20是不會有的,這樣就知道是我打開的,然後我在app中給服務器單獨傳值即可。

現在cookies雖然知道了,但是還有一點就是在SFSafariViewController中是獲取不到cookies的,因爲這個cookies存在safari系統中,那麼怎麼得到對應的值呢,那就需要服務端做一個對於你軟件的scheme跳轉了。

因爲當你訪問網頁的時候,網頁可以獲取到你的cookies,你無需手動獲得cookies,需要做的就是使用這個cookies去登錄app中需要打開的那個網站,而在網頁返回數據中調用你軟件的scheme,同時在調用的時候把定義的cookies或者其他值傳進來,比如我軟件的scheme是comjdnetkuaifa,那麼可以通過js調用:location.href = "comjdnetkuaifa://uid/" + uid;,這樣就可以把用戶的uid標識直接傳過來了,然後在app中的代理方法

獲取scheme傳過來的值,比如像我們做的一樣把uid傳過來。

cookies的作用僅僅是登錄同一個網站讓網頁端去判斷之前是哪個用戶登錄的,然後網頁返回對應的需要的值即可。

四、細節優化

因爲要做到無痕,就是在用戶不知不覺間登錄,所以需要調整SFSafariViewController的樣式,因爲如果使用presentViewController的方案,在viewcontroller之間跳轉的話,肯定會影響用戶的體驗,而網上流傳的方案

設置透明度爲透明和隱藏的話,蘋果現在官方是不允許的

SafariViewContoller must be used to visibly present information to users; the controller may not be hidden or obscured by other views or layers. Additionally, an app may not use SafariViewController to track users without their knowledge and consent.

並且現在透明度最低設置爲0.05,所以這個方案是會被拒的。

網上提供了一種思路,可以考慮吧safariView加到現在的Viewcontroller中,

當使用完畢之後,再移除即可

但在實際運行中,發現如果這樣處理的話的確隱藏了,但是卻並沒有調用訪問。

所以就用了一種解決方案是使用presentViewController切換界面

在初始化完成的時候,切換過來即可

五、其他獲取cookies的方法

如果使用webview的話,可以在webview的代理函數中,去獲取cookies。

但是這個cookies是沙盒中的cookies,就是軟件自己的cookies,不是safari的cookies

六、demo下載

Github下載地址:https://github.com/DamonHu/cookiessssss

GitOSC下載地址:http://git.oschina.net/DamonHoo/cookiessssss

當然還有另外一個別人寫好可以測試網頁的demo

github下載地址:https://github.com/mackuba/SafariAutoLoginTest

七、參考文章

iOS app與瀏覽器 跨域互通

iOS10 SFSafariViewController not working when alpha is set to 0

如何獲取一個uiwebview中的請求的cookie

iOS9-WKWebView+SFSafariViewController


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章