2017-04-24 1 views
2

J'utilise QuickBlox iOS SDK (version 2.9.2) et a obtenu un échec avec le code d'erreur 422 lorsque vous appelezQuickBlox iOS a échoué avec le code d'erreur 422

[QBRequest createObject:qbcoCustomObject successBlock:^(QBResponse *response, QBCOCustomObject *object) { 
} errorBlock:^(QBResponse *response) { 
}]; 

Il arrive qu'occasionnellement et ne reprend pas jusqu'à ce que je LOGOUT et connectez-vous à nouveau QuickBlox.

Le message d'erreur est le suivant:

2017-04-24 06:18:45.855557 App[8720:4958563] [QBCore] Response error: Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: client error (422)" UserInfo={com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x17422ed40> { URL: https://api.quickblox.com/data/MyCircleComments.json } { status code: 422, headers { 
    "Access-Control-Allow-Origin" = "*"; 
    "Cache-Control" = "no-cache"; 
    Connection = "keep-alive"; 
    "Content-Length" = 45; 
    "Content-Type" = "application/json; charset=utf-8"; 
    Date = "Mon, 24 Apr 2017 12:18:45 GMT"; 
    "QB-Token-ExpirationDate" = "2017-04-24 14:09:35 +0000"; 
    "QuickBlox-REST-API-Version" = "0.1.1"; 
    Server = "openresty/1.9.15.1"; 
    Status = "422 Unprocessable Entity"; 
    "X-Rack-Cache" = "invalidate, pass"; 
    "X-Request-Id" = 89f509abd6fd7f61d02e34ae9e83ce70; 
    "X-Runtime" = "0.009477"; 
    "X-UA-Compatible" = "IE=Edge,chrome=1"; 
} }, NSErrorFailingURLKey=https://api.quickblox.com/data/MyCircleComments.json, com.alamofire.serialization.response.error.data=<7b226572 726f7273 223a7b22 62617365 223a5b22 466f7262 69646465 6e2e204e 65656420 75736572 2e225d7d 7d>, NSLocalizedDescription=Request failed: client error (422)} 
2017-04-24 06:18:45.856659 App[8720:4958563] [QBCore] Response error reasons: { 
    errors =  { 
     base =   (
      "Forbidden. Need user." 
     ); 
    }; 
} 

En raison du fait qu'il reprend seulement après que je déconnecte pas, je pense qu'il peut être lié à l'expiration de la session. J'ai ajouté la méthode de connexion à didFinishLaunching et didBecomeActive de l'application afin que l'application se reconnecte automatiquement pour s'assurer que la session de connexion soit valide. La méthode de connexion que j'utilise est

[QBRequest logInWithUserLogin:sUsername password:sPassword successBlock:^(QBResponse *response, QBUUser *user) { 
    } errorBlock:^(QBResponse *response) { 
    }]; 

et en définissant des points d'arrêt, je suis sûr que chaque fois que la reconnexion automatique a réussi. Cependant, l'auto-réactivation de l'application ne fonctionne pas. L'échec se produit toujours occasionnellement et la seule issue est la déconnexion et la connexion manuellement.

J'ai recherché sur Google ce problème et trouvé un tas de sujets, mais aucun ne semble répondre à mon problème. (Un article suggère que l'heure de l'appareil n'est peut-être pas synchronisée, mais mon iPhone utilise l'heure du réseau.)

Quelqu'un peut-il me donner une idée de la raison pour laquelle l'appareil échoue et une solution est très appréciée. Merci d'avance.

+0

Veuillez créer un problème dans [notre rapport] (https: // github.com/QuickBlox/quickblox-ios-sdk) et ajoutez des journaux complets. –

+0

Avec une enquête plus approfondie, je trouve que ce n'est pas l'expiration de la session, mais le problème de performance de Quickblox. Mon application récupérera la demande de toutes les informations des utilisateurs, puis téléchargera tout l'avatar (à partir de Contents) au démarrage, ce qui est relativement lourd. Si je publie quelque chose ([QBRequest createObject ...]) immédiatement après le démarrage de l'application, l'erreur 422 se produira sûrement, mais si j'attends 5 secondes avant que le devoir de démarrage ne se termine, ce problème ne se produira jamais. Ma solution consiste alors à charger le démarrage de manière synchrone et cela fonctionne bien maintenant. – kuang

Répondre

1

L'une des meilleures réponses pour question ci-dessus: -.

** "timestamp Bad signifie que vous envoyez la valeur d'horodatage non valide sur la création de la session, qui est basé sur votre temps de téléphone Votre temps de l'appareil ne doit pas différer . serveur plus de 2 heures Nous vous conseillons de synchroniser le temps sur vos appareils avec le service NTP ou cocher 2 cases qui se trouve juste dans les paramètres de votre appareil. automatique de la date & heure et le fuseau horaire automatique

Hope this aide "**

Ref: - https://github.com/QuickBlox/quickblox-ios-sdk/issues/452

A partir de la configuration de l'appareil, définissez le fuseau horaire automatique.

J'espère que cela vous aidera.

+0

Merci, mais ce n'est pas le cas parce que mon appareil est toujours avec le fuseau horaire ON. – kuang

0

Essayez d'obtenir la session Quickblox jeton

[[[QBSession currentSession] sessionDetails] token]; 

et vérifier le type de session via REST API

//QuickBlox Documentation 
curl -X GET \ 
-H "QuickBlox-REST-API-Version: 0.1.0" \ 
-H "QB-Token: 8b75a6c7191285499d890a81df4ee7fe49bc732a" \ 
https://api.quickblox.com/session.json 

Si le champ "user_id" de votre jeton sera égale à 0 cela signifie que vous avez " "application-token" type, et vous ne pouvez pas créer ou mettre à jour des éléments sur QBlox, après la connexion avec jeton de session "mises à niveau" à "user-token"

J'ai un problème similaire, et j'ai fait une vérification supplémentaire, si token-type est une application, alors vous devez vous connecter avec le même utilisateur (appel récursivement méthode de connexion si vous le pouvez), je sais que c'est une solution de contournement, mais nous ne pouvons pas creuser

+0

Il s'est avéré être comme une congestion parce que quand j'ai formé le chargement massif de la question avait disparu. Vraiment apprécier vos conseils! – kuang