Domanda

Ciao a tutti, sto lavorando su un widget per la Dashboard di Apple e ho incontrato un problema durante il tentativo di ottenere i dati dal mio server utilizzando la funzione ajax di jQuery. Ecco il mio codice JavaScript:

$.getJSON("http://example.com/getData.php?act=data",function(json) { 
    $("#devMessage").html(json.message)
    if(json.version != version) {
        $("#latestVersion").css("color","red")
    }
    $("#latestVersion").html(json.version)
})

E il server risponde con questo JSON:

{"message":"Hello World","version":"1.0"}

Per qualche ragione, però, quando ho eseguito questo i campi il widget non cambiano. Da debug, ho imparato che il widget non ha nemmeno fare la richiesta al server, in modo che mi fa pensare che Apple ha una sorta di blocco URL esterno in luogo. So che questo non può essere vero, però, perché molti widget telefono di casa per verificare la presenza di aggiornamenti.

Qualcuno ha qualche idea su cosa potrebbe essere sbagliato?

EDIT:. Inoltre, questo codice funziona perfettamente bene in Safari


Come richiesto da Luca, ecco il codice PHP e Javascript che si sta svolgendo in questo momento:

PHP:

echo $_GET["callback"].'({"message":"Hello World","version":"1.0"});';

Javascript:

function showBack(event)
{
var front = document.getElementById("front");
var back = document.getElementById("back");

if (window.widget) {
    widget.prepareForTransition("ToBack");
}

front.style.display = "none";
back.style.display = "block";
stopTime();
if (window.widget) {
    setTimeout('widget.performTransition();', 0);
}
$.getJSON('http://nakedsteve.com/data/the-button.php?callback=?',function(json) { 
    $("#devMessage").html(json.message)
    if(json.version != version) {
        $("#latestVersion").css("color","red")
    }
    $("#latestVersion").html(json.version)
})
}
È stato utile?

Soluzione

In Dashcode clic su Attributi widget , quindi Consenti accesso di rete accertarsi che l'opzione sia selezionata. Ho costruito qualcosa che semplicemente si rifiutava di lavorare, e questa è stata la soluzione.

Altri suggerimenti

tra domini richieste Ajax (utilizzando l'oggetto XMLHttpRequest / ActiveX) non sono ammessi nello standard corrente, come per il W3C spec :

  

Questa specificazione non include   Le caratteristiche che sono essere   considerato per una futura versione di   questa specifica:

     
      
  • Cross-site XMLHttpRequest;
  •   

Tuttavia c'è 1 tecnica di fare Ajax richieste cross-domain, JSONP , includendo un tag script nella pagina, e con un po 'di configurazione del server.

questo , ma invece di rispondere sul server con questo

{"message":"Hello World","version":"1.0"}

ti consigliamo di rispondere con questo:

myCallback({"message":"Hello World","version":"1.0"});

mycallback deve essere il valore nel parametro "callback" è stato passato nella funzione $ GetJSON (). Quindi, se stavo usando PHP, questo dovrebbe funzionare:

echo $_GET["callback"].'({"message":"Hello World","version":"1.0"});';
  

Apple ha una sorta di blocco URL esterno sul posto.

Nel vostro Info.plist è necessario avere l'AllowNetworkAccess chiave impostata su true.

<key>allowNetworkAccess</key>
<true/>

Il tuo codice funziona in Safari, perché non è vincolato nel sever cruscotto e non è standard complient nel senso che non permetterà sito croce AJAX. FF è complient standard in quanto non consente Cross Site ajax.

Se si crea un widget dashboard, perché non si utilizza la funzione Setup XMLHttpRequest nella biblioteca di codice di DashCode. Apple ha costruito questi in modo che non c'è bisogno di installare le librerie JS 3rd party. Non sono sicuro sul supporto di JSON, ma forse a partire da qui vi condurrà in una direzione migliore.

Interessante che funziona in Safari. Per quanto ne so fare richieste Ajax x-dominio è necessario utilizzare il tipo di dati jsonp.

http://docs.jquery.com/Ajax/jQuery.getJSON

http://bob.pythonmac.org/ archives / 2005/12/05 / remote-jSON-jsonp /

In sostanza è necessario aggiungere callback=? alla stringa di query e jquery sostituirà automaticamente con il metodo corretto per esempio:

$.getJSON("http://example.com/getData.php?act=data&callback=?",function(){ ... });

EDIT: mettere il bit callback=? alla fine della stringa di query giusto per essere sicuri

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top