8

I monitor (e registro al server) la maggior parte degli errori degli utenti nel nostro gioco in flash. Molto spesso vedo errori di sicurezza relativi al tentativo di effettuare richieste a un URL tra domini (di solito l'API di Facebook Graph). Il 99% dei nostri giocatori può effettuare queste chiamate API grafiche senza problemi.Cosa fare sugli errori di rete durante il caricamento del file di criteri crossdomain.xml?

Quello che penso stia succedendo è che il client fa una richiesta, ma non riesce a caricare il file crossdomain.xml. Non so come AS3 gestisca ciò nel caso di un errore nel caricare il file di criteri di crossdomain ... riproverà per ogni URLRequest eseguito fino a quando non riesce a caricarlo, o si arrende per sempre? Qual è la "migliore pratica" in risposta a un errore di sicurezza come questo?

Annunciare la mia pre-caricando i file delle politiche di Facebook una volta, prima del tempo, in questo modo:

// allow images to be loaded from facebook and facebook's cdn's. 
Security.loadPolicyFile("http://www.facebook.com/crossdomain.xml"); 
Security.loadPolicyFile("https://api.facebook.com/crossdomain.xml"); 
Security.loadPolicyFile("https://graph.facebook.com/crossdomain.xml"); 
Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml"); 

poi ho anche il flash controllare nuovamente il file dei criteri al momento della URLRequest.

risposta

2

Ecco una soluzione che sembra funzionare.

Supponendo che si sta utilizzando un URLLoader per leggere i dati da uno dei domini che dispone di un file crossdomain.xml e si sta chiamando loadPolicyFile per precaricare crossdomain.xml, c'è la possibilità che il carico non riuscirà, sia da connettività di rete problemi o da un server inattivo, o da brillamenti solari. Quando si imposta URLLoader, è possibile aggiungere un listener di eventi per SecurityErrorEvent.SECURITY_ERROR. Nell'ascoltatore pari, puoi provare a caricare nuovamente il file di criteri. I file dei criteri vengono memorizzati nella cache, anche se non riescono a caricare (grazie adobe), quindi dovrai aggiungere un parametro di query di busting della cache.

Ecco un semplice esempio di come questo dovrebbe funzionare:

public function loadMyFriends():void { 
    var urlLoader:URLLoader = new URLLoader(); 
    urlLoader.addEventListener(
    SecurityErrorEvent.SECURITY_ERROR, handleSecurityError); 
    urlLoader.load(new URLRequest('https://graph.facebook.com/me/friends')); 
} 

private function handleSecurityError(event:Event):void { 
    Security.loadPolicyFile(
    "https://graph.facebook.com/crossdomain.xml?__cb"=Math.random()); 
    loadMyFriends(); 
} 

In pratica, si sarebbe probabilmente voler limitare il numero di tentativi e magari fare un esponenziale di back-off se è davvero una connettività di rete problema e non solo un server morto che non viene gestito correttamente da un servizio di bilanciamento del carico.

0

I miei test hanno dimostrato che si ripetono fino a 10 secondi circa, quindi suppongo che dovrebbe essere possibile mostrare un messaggio di errore e riprovare dopo alcuni secondi.

Problemi correlati