2009-10-24 6 views
2

J'utilise un UIWebView pour afficher un captcha. Si l'utilisateur entre correctement dans le captcha, le serveur renvoie les données à l'aide de la sérialisation JSON. Je ne veux pas que la vue affiche ceci, à la place je veux intercepter les charges de l'UIWebView, et si elle renvoie des données sérialisées de JSON, je veux stocker ces données et enlever l'UIWebView.Lire le contenu JSON depuis UIWebView

Je pensais installer un délégué sur UIWebView et utiliser webViewDidFinishLoad, mais comment charger le contenu?

Répondre

7

Vous souhaiterez peut-être vous intéresser à la définition d'un UIWebViewDelegate et en utilisant webView:shouldStartLoadWithRequest:navigationType: pour intercepter la demande et la gérer.

Dans votre cas, vous devez évaluer NSURLRequest et renvoyer NO pour empêcher le chargement de WebView. À son tour, vous créez un NSURLConnection distinct avec la même demande et définissez un délégué pour recevoir la réponse (JSON).

+0

Bonne idée, a travaillé pour moi. – jarnoan

+1

@jarnoan voulez-vous partager votre code, je n'ai pas obtenu cette réponse –

5

je suis venu avec ce (peut-être pas si belle) solution:

au lieu de retourner une réponse JSON seule, j'utilise le même modèle HTML que j'ai utilisé pour le captcha. Si le captcha réussit, je vous envoie la JSON Je veux le modèle HTML, qui affiche dans un div caché avec un ID:

<html> 
<body> 

{% if captcha_success %} 

<div id="json" style="display: none">{"jsonvalue":"{{result}}"}</div> 

{% else %} 

// display captcha as usual 

{% endif %} 

</body> 
</html> 

puis je peux obtenir le contenu en webViewDidFinishLoad en utilisant:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
NSString *res = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('json').innerHTML"]; 
NSDictionary *json = [[CJSONDeserializer deserializer] deserializeAsDictionary:[res dataUsingEncoding:NSUTF8StringEncoding] error:nil]; 
// more stuff 
} 

Généralement, je pense que c'était assez facile et simple à mettre en œuvre.