2014-03-03 70 views
1

我發現Google Analytics(作爲其新版和 Universal Analytics解決方案的一部分)提供了一個簡單的RESTful界面,稱爲Measurement Protocol,用於從各種平臺或應用程序收集分析數據。從Flash/AS3使用Google Analytics Measurement Protocol/Universal Analytics

如何使用Flash/AS3應用程序中的此接口?我創建URL格式parameters according to the docs的有效載荷,但使URL請求時,我得到一個SecurityError因爲crossdomain.xml未託管在http://www.google-analytics.com/crossdomain.xml

[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048: Security sandbox violation: http://<mysite>/<myapp>.swf cannot load data from http://www.google-analytics.com/collect."] 

使用POST或GET,此呼叫在失敗Web瀏覽器的情況下(雖然它成功地AIR的情況下):

// i.e. var payload:String = 'v=1&t=event&ec=category&ea=action'+ 
// '&el=label&tid=UA-xxxxxxxx-x&cid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' 

var req:URLRequest = new URLRequest('http://www.google-analytics.com/collect'); 
req.method = URLRequestMethod.POST; 
req.data = payload; 
var urlLoader:URLLoader = new URLLoader(); 
urlLoader.load(req); 

我需要這些分析從空氣或Flash Player的(網頁上的)工作。

回答

1

正如在URLRequest docs中指出的,跨站點腳本(xss)限制要求crossdomain.xml用於POST請求。由於谷歌不託管這個文件,你必須避免POST。但測量協議文檔說它將接受GET或POST。所以你必須使用GET。上面的代碼GET仍然會拋出,但事實證明,如果您使用Loader而不是URLLoader(就好像您要訪問網絡上的圖像,而不是xss規則所涵蓋的圖像),它的工作原理如下:

// i.e. var payload:String = 'v=1&t=event&ec=category&ea=action'+ 
// '&el=label&tid=UA-xxxxxxxx-x&cid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' 

var req:URLRequest = new URLRequest('http://www.google-analytics.com/collect?'+payload); 
var l:Loader = new Loader(); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, cleanup); 
l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, cleanup); 
l.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, cleanup); 
l.load(req); 
function cleanup(e:Event):void { 
    l.contentLoaderInfo.removeEventListener(Event.COMPLETE, cleanup); 
    l.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, cleanup); 
    l.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, cleanup); 
} 

您希望錯誤偵聽器不會彈出錯誤,並且您還需要清除它們以防止內存泄漏。

然而,在移動,我仍然使用原來的URLLoader代碼(因爲它有較少的分配/事件),可能使用條件編譯:

// i.e. var payload:String = 'v=1&t=event&ec=category&ea=action'+ 
// '&el=label&tid=UA-xxxxxxxx-x&cid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' 

ENV::AIR { 
    var req:URLRequest = new URLRequest('http://www.google-analytics.com/collect'); 
    req.method = URLRequestMethod.POST; 
    req.data = payload; 
    var urlLoader:URLLoader = new URLLoader(); 
    urlLoader.load(req); 
} 

ENV::WEB { 
    var req:URLRequest = new URLRequest('http://www.google-analytics.com/collect?'+payload); 
    var l:Loader = new Loader(); 
    l.contentLoaderInfo.addEventListener(Event.COMPLETE, cleanup); 
    l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, cleanup); 
    l.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, cleanup); 
    l.load(req); 
    function cleanup(e:Event):void { 
    l.contentLoaderInfo.removeEventListener(Event.COMPLETE, cleanup); 
    l.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, cleanup); 
    l.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, cleanup); 
    } 
} 
+0

出於好奇,確實'URLStream'有同樣的問題與跨域'GET'調用' URLLoader'呢?我從未測試過。據我所知,它們都使用'URLRequest',但是提出請求的實際機制是完全獨立的。 –

+0

我從來沒有使用'URLStream',但我看到[文檔](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/URLStream。html)聲明:_適用於使用URLStream類下載URL的安全規則與應用於URLLoader對象的規則相同。政策文件可以根據需要下載。_ –

+0

該死的。沒看到那個音符。那很不幸 –

0

傑夫有一個很好的答案,但你可以提高它通過利用POST方法,而不是GET,因爲GET相當有限,並不適合發送大量數據。

var req:URLRequest = new URLRequest(url); 
req.method = URLRequestMethod.POST; 
req.data = payload; 
var l:Loader = new Loader(); 
l.load(req); 

通知POST請求方法,它會做的伎倆

1

,或者您可以使用庫
谷歌通用分析爲ActionScript 3.0

結賬AS3-萬向分析V0.8

https://github.com/zwetan/as3-universal-analytics/releases/tag/0.8

完全支持:Flash Player, AIR,Redtamarin
它只是作品無處不或幾乎無處不在:)

你的情況

var config:Configuration = new Configuration(); 
    config.forcePOST = true; 
var tracker:WebTracker = new WebTracker("UA-12345-67", config); 
    tracker.pageview("/hello/world", "Hello World"); 
+0

很酷,謝謝!我會在下一次我需要一個。 :) –