本篇文章的目的就是要達(dá)成未安裝的app在安裝app之后恩静,去獲取安裝app之前Safari所瀏覽的數(shù)據(jù)月幌,比如說(shuō)用戶(hù)在未安裝手機(jī)百度時(shí)亲铡,已經(jīng)在Safari瀏覽器中登錄了百度帳號(hào)国觉,當(dāng)安裝手機(jī)百度之后称开,打開(kāi)該APP可以自動(dòng)登錄這個(gè)Safari瀏覽器中所登錄的百度帳號(hào)八毯。
當(dāng)然也可以達(dá)成那種效果皮获,比如打開(kāi)某個(gè)帶有邀請(qǐng)碼的網(wǎng)頁(yè)推薦用戶(hù)去下載app焙蚓,當(dāng)通過(guò)appstore下載完app之后,打開(kāi)該app洒宝,可以知道該邀請(qǐng)碼是多少购公,網(wǎng)頁(yè)和下載app之間隔了一層appstore,不能從網(wǎng)頁(yè)直接傳值到app雁歌,所以如果未安裝該app的話(huà)宏浩,就需要網(wǎng)頁(yè)和app去讀取一個(gè)相同的值去標(biāo)記,但是對(duì)于ios系統(tǒng)來(lái)說(shuō)将宪,idfa等唯一標(biāo)識(shí)符只能app獲取绘闷,網(wǎng)頁(yè)獲取不到橡庞,所以一般無(wú)法通信
比如上面這個(gè)圖,A用戶(hù)從web網(wǎng)頁(yè)跳轉(zhuǎn)到appstore印蔗,再?gòu)腶ppstore下載app扒最,但是這個(gè)過(guò)程中,也許用戶(hù)A华嘹、B吧趣、C都在下載該軟件,web網(wǎng)頁(yè)是無(wú)法直接像app傳送任何數(shù)據(jù)的耙厚,所以就需要確認(rèn)到底哪個(gè)是從web網(wǎng)頁(yè)推薦過(guò)來(lái)下載的强挫,哪些是自己去appstore下載的。
一薛躬、判斷唯一用戶(hù)
1俯渤、通過(guò)idfa等標(biāo)識(shí)判斷
idfa等唯一標(biāo)識(shí)只有oc能獲取,但是網(wǎng)頁(yè)一般獲取不到ios的idfa型宝,uuid等硬件的唯一標(biāo)識(shí)符(除非使用蘋(píng)果配置文件八匠,這個(gè)用戶(hù)需要安裝,無(wú)法做到無(wú)痕趴酣,而且使用起來(lái)比較麻煩梨树,有興趣的可以去看看)
2、通過(guò)多重可獲取的信息綜合判斷
由于無(wú)法準(zhǔn)確的獲得idfa等信息岖寞,所以可以多記錄幾個(gè)網(wǎng)頁(yè)和app都能獲取的數(shù)據(jù)抡四,比如網(wǎng)絡(luò)模式、IP仗谆、時(shí)間指巡、機(jī)型、位置等胸私,通過(guò)多重判斷來(lái)看是不是同一個(gè)人厌处,但是這種方式是存在誤差的,比如一個(gè)公司用的同一個(gè)網(wǎng)絡(luò)同一個(gè)機(jī)型的兩個(gè)人就會(huì)判斷有錯(cuò)誤岁疼。
3阔涉、通過(guò)cookies判斷
之前是不可以的,因?yàn)閕os應(yīng)用是沙盒運(yùn)行捷绒,app之間創(chuàng)建的webview之間的cookies都是沙盒狀態(tài)的瑰排,但是ios9之后,終于增加了一個(gè)全新的類(lèi)SFSafariViewController暖侨,這個(gè)相當(dāng)于在app內(nèi)部創(chuàng)建了一個(gè)safari瀏覽器椭住,用的和safari瀏覽器共同的cookies,所以可以用SFSafariViewController來(lái)獲取cookies
二字逗、使用SFSafariViewController
這個(gè)SFSafariViewController很簡(jiǎn)單京郑,導(dǎo)入頭文件#import <SafariServices/SafariServices.h>就可以像其他普通的viewcontroller一樣創(chuàng)建
SFSafariViewController一般使用這兩個(gè)代理函數(shù)
使用之后就可以打開(kāi)指定的url宅广,并且使用的是safari的cookies,打開(kāi)的頁(yè)面樣子像下面這樣
下面的工具欄在代理中也可以設(shè)置些举,但是一般不自己再設(shè)置了
三跟狱、網(wǎng)頁(yè)和app共用cookies
使用SFSafariViewController訪(fǎng)問(wèn)域名之后,用的就是用safari打開(kāi)的頁(yè)面的cookies户魏,比如我在手機(jī)的safari頁(yè)面打開(kāi)的網(wǎng)址是:www.hudongdong.com/uid/20驶臊,產(chǎn)生了一個(gè)cookies:20,然后我在app中打開(kāi)網(wǎng)址www.hudongdong.com的時(shí)候叼丑,就可以用到同一個(gè)cookies:20关翎,,而別人如果沒(méi)有用safari頁(yè)面事先打開(kāi)這個(gè)網(wǎng)址的話(huà)鸠信,cookies:20是不會(huì)有的纵寝,這樣就知道是我打開(kāi)的,然后我在app中給服務(wù)器單獨(dú)傳值即可星立。
現(xiàn)在cookies雖然知道了店雅,但是還有一點(diǎn)就是在SFSafariViewController中是獲取不到cookies的,因?yàn)檫@個(gè)cookies存在safari系統(tǒng)中贞铣,那么怎么得到對(duì)應(yīng)的值呢,那就需要服務(wù)端做一個(gè)對(duì)于你軟件的scheme跳轉(zhuǎn)了沮明。
因?yàn)楫?dāng)你訪(fǎng)問(wèn)網(wǎng)頁(yè)的時(shí)候辕坝,網(wǎng)頁(yè)可以獲取到你的cookies,你無(wú)需手動(dòng)獲得cookies荐健,需要做的就是使用這個(gè)cookies去登錄app中需要打開(kāi)的那個(gè)網(wǎng)站酱畅,而在網(wǎng)頁(yè)返回?cái)?shù)據(jù)中調(diào)用你軟件的scheme,同時(shí)在調(diào)用的時(shí)候把定義的cookies或者其他值傳進(jìn)來(lái)江场,比如我軟件的scheme是comjdnetkuaifa纺酸,那么可以通過(guò)js調(diào)用:location.href = "comjdnetkuaifa://uid/" + uid;,這樣就可以把用戶(hù)的uid標(biāo)識(shí)直接傳過(guò)來(lái)了址否,然后在app中的代理方法
獲取scheme傳過(guò)來(lái)的值餐蔬,比如像我們做的一樣把uid傳過(guò)來(lái)。
cookies的作用僅僅是登錄同一個(gè)網(wǎng)站讓網(wǎng)頁(yè)端去判斷之前是哪個(gè)用戶(hù)登錄的佑附,然后網(wǎng)頁(yè)返回對(duì)應(yīng)的需要的值即可樊诺。
四、細(xì)節(jié)優(yōu)化
因?yàn)橐龅綗o(wú)痕音同,就是在用戶(hù)不知不覺(jué)間登錄词爬,所以需要調(diào)整SFSafariViewController的樣式,因?yàn)槿绻褂胮resentViewController的方案权均,在viewcontroller之間跳轉(zhuǎn)的話(huà)顿膨,肯定會(huì)影響用戶(hù)的體驗(yàn)锅锨,而網(wǎng)上流傳的方案
設(shè)置透明度為透明和隱藏的話(huà),蘋(píng)果現(xiàn)在官方是不允許的
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.
并且現(xiàn)在透明度最低設(shè)置為0.05恋沃,所以這個(gè)方案是會(huì)被拒的必搞。
網(wǎng)上提供了一種思路,可以考慮吧safariView加到現(xiàn)在的Viewcontroller中芽唇,
當(dāng)使用完畢之后顾画,再移除即可
但在實(shí)際運(yùn)行中,發(fā)現(xiàn)如果這樣處理的話(huà)的確隱藏了匆笤,但是卻并沒(méi)有調(diào)用訪(fǎng)問(wèn)研侣。
所以就用了一種解決方案是使用presentViewController切換界面
在初始化完成的時(shí)候,切換過(guò)來(lái)即可
五炮捧、其他獲取cookies的方法
如果使用webview的話(huà)庶诡,可以在webview的代理函數(shù)中,去獲取cookies咆课。
但是這個(gè)cookies是沙盒中的cookies末誓,就是軟件自己的cookies,不是safari的cookies
六书蚪、demo下載
Github下載地址:https://github.com/DamonHu/cookiessssss
GitOSC下載地址:http://git.oschina.net/DamonHoo/cookiessssss
當(dāng)然還有另外一個(gè)別人寫(xiě)好可以測(cè)試網(wǎng)頁(yè)的demo
github下載地址:https://github.com/mackuba/SafariAutoLoginTest
七喇澡、參考文章
iOS10 SFSafariViewController not working when alpha is set to 0