Question

Salut tout le monde, je travaille sur un widget pour Dashboard d'Apple et je l'ai rencontré un problème en essayant d'obtenir des données de mon serveur en utilisant la fonction ajax jquery de. Voici mon code 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)
})

Et le serveur répond avec ce JSON:

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

Pour une raison que, quand je lance ce champs sur le widget ne changent pas. De débogage, je l'ai appris que le widget ne fait même pas la demande au serveur, il me fait penser que Apple a une sorte de bloc URL externe en place. Je sais que cela ne peut être vrai que, parce que la maison de téléphone de nombreux widgets pour vérifier les mises à jour.

Est-ce que quelqu'un a des idées sur ce qui pourrait se tromper?

EDIT:. De plus, ce code fonctionne parfaitement bien dans Safari


Comme l'avait demandé Luca, voici le code PHP et Javascript qui est en cours d'exécution en ce moment:

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)
})
}
Était-ce utile?

La solution

Cliquez Dashcode Widget Attributs puis Permettre l'accès au réseau Assurez-vous que l'option est cochée. Je l'ai construit quelque chose qui a tout simplement refusé de travailler, et ce fut la solution.

Autres conseils

Cross-domain requêtes Ajax (Utilisation de l'objet XMLHttpRequest / ActiveX) ne sont pas autorisés dans la norme actuelle, selon le W3C spec :

  

Cette spécification ne comprend pas   les caractéristiques suivantes qui sont   considéré pour une future version de   cette spécification:

     
      
  • Cross-site XMLHttpRequest;
  •   

Cependant, il y a 1 technique de faire ajax demande inter-domaines, JSONP , en incluant une balise de script sur la page, et avec une petite configuration du serveur.

cette , mais au lieu de répondre sur votre serveur avec cette

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

vous voulez répondre à ceci:

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

MyCallBack doit être la valeur dans le paramètre "callback" vous avez passé dans la fonction .getJSON $ (). Donc, si j'utilisais PHP, cela fonctionnerait:

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

Apple a une sorte de bloc URL externe en place.

Dans votre Info.plist vous devez avoir la clé AllowNetworkAccess définie sur true.

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

Votre code fonctionne dans Safari car il n'est pas contraint dans le tableau de bord et sever il est pas aux normes Complient en ce qu'elle ne permet cross site AJAX. FF complient normes en ce qu'elle ne permet pas ajax intersite.

Si vous créez un widget de tableau de bord, pourquoi ne pas utiliser la fonction de configuration XMLHttpRequest dans la bibliothèque de code de DashCode. Apple construit ces derniers dans de sorte que vous n'avez pas besoin d'installer les bibliothèques JS 3ème partie. Je ne suis pas sûr de soutien JSON, mais peut-être commencer ici vous mènera dans une meilleure direction.

Intéressant que cela fonctionne dans Safari. Pour autant que je sais faire des demandes de ajax x-domaine, vous devez utiliser le dataType jsonp.

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

http://bob.pythonmac.org/ Archives / 2005/12/05 / à distance JSON-jsonp /

Fondamentalement, vous devez ajouter callback=? à votre chaîne de requête et jquery remplacera automatiquement la méthode correcte par exemple:

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

EDIT: mettre le bit callback=? à la fin de la chaîne de requête juste pour être sûr

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top