hdmvide Inviato 16 Settembre 2012 Segnala Condividi Inviato 16 Settembre 2012 Salve, sto entrando da poco nello sviluppo di xcode e devo dire che mi piace molto perchè apple ha proprio messo a disposizione un sdk ordinato e che viene all'incontro dello sviluppatore. Brevemente vi anticipo quello che sto facendo: Ho realizzato un piccolo progetto di domotica con arduino, grazie ad arduino posso attivare e disattivare dei relè. Su arduino ho sviluppato tutta la parte server che riceve richieste http, prende tutto quello che gli viene passato in GET(secondo una politica che ho dato io) ed effettua la sua elaborazione per attivare o disattivare i relè. Questo è il succo del lavoro La parte client che invia richieste http per attivare e disattivare i relè, l'ho già sviluppata in java e android. Adesso ho l'esigenza di svilupparla su iphone, per questo il motivo di questo post. Ho già lavorato sull'interfaccia grafica e predisposto interfacce e implementazione dei metodi che mi serviranno per l'invio delle richieste http. L'anello mancante è proprio la parte per l'invio della richiesta http, non ho idea di come si faccia su xcode. che oggetti ci sono? C'è qualcuno che può aiutarmi o consigliarmi dove guardare PS: ho già implementato qualcosa di simile ma non funziona NSString *myRequestString = @"/?||RELE=1&STATE=1|||"; NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString: @"http://192.168.1.25"]]; [request setHTTPMethod: @"GET"]; [request setHTTPBody: myRequestData]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil]; NSString *strReturnData = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding ]; NSLog(@"strReturnData: %@" , strReturnData); Link al commento Condividi su altri siti Altre opzioni di condivisione...
Sam88 Inviato 16 Settembre 2012 Segnala Condividi Inviato 16 Settembre 2012 NSMutableUrlRequest è la classe che ti permette di effettuare chiamate http, sia in GET che in POST. Quello che hai scritto qui sopra non è corretto, per questa ragione non funziona anche se hai usato le classi giuste. Hai detto che sul server arduino hai implementato le chiamate in GET ma nel codice che hai riportato anche se imposti l'httpMethod GET (che comunque è quello di default se non lo setti) dopo passi i parametri nell'httpBody che è il metodo da usare nel caso fai una chiamata POST. Quindi quello che devi fare per far funzionare il tuo codice è togliere questo: [request setHTTPBody: myRequestData] e concatena le 2 stringhe url e querystring NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.25%@",myRequestString]]]; Poi ti consiglio di usare il metodo asincrono dell'NSUrlConnection per evitare di bloccare l'interfaccia grafica mentre attendi la risposta del server(Oppure metti questa chiamata in un thread separato). Mobile & Web Developer | samuele@mr-apps.com | Mr.Apps Link al commento Condividi su altri siti Altre opzioni di condivisione...
hdmvide Inviato 16 Settembre 2012 Autore Segnala Condividi Inviato 16 Settembre 2012 NSMutableUrlRequest è la classe che ti permette di effettuare chiamate http, sia in GET che in POST. Quello che hai scritto qui sopra non è corretto, per questa ragione non funziona anche se hai usato le classi giuste. Hai detto che sul server arduino hai implementato le chiamate in GET ma nel codice che hai riportato anche se imposti l'httpMethod GET (che comunque è quello di default se non lo setti) dopo passi i parametri nell'httpBody che è il metodo da usare nel caso fai una chiamata POST. Quindi quello che devi fare per far funzionare il tuo codice è togliere questo: [request setHTTPBody: myRequestData] e concatena le 2 stringhe url e querystring NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.25%@",myRequestString]]]; Poi ti consiglio di usare il metodo asincrono dell'NSUrlConnection per evitare di bloccare l'interfaccia grafica mentre attendi la risposta del server(Oppure metti questa chiamata in un thread separato). grazie mille, provo subito e ti faccio sapere come va... In effetti la chiamata asincrona è ciò che volevo fare come obiettivo finale, sai consigliarmi dove trovare degli esempi validi per fare chiamate asincrone? Link al commento Condividi su altri siti Altre opzioni di condivisione...
Sam88 Inviato 16 Settembre 2012 Segnala Condividi Inviato 16 Settembre 2012 Per esempi validi cerca sempre nella documentazione apple se te la cavi con l'inglese. https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE Mobile & Web Developer | samuele@mr-apps.com | Mr.Apps Link al commento Condividi su altri siti Altre opzioni di condivisione...
hdmvide Inviato 16 Settembre 2012 Autore Segnala Condividi Inviato 16 Settembre 2012 grazie mille, provo subito e ti faccio sapere come va... In effetti la chiamata asincrona è ciò che volevo fare come obiettivo finale, sai consigliarmi dove trovare degli esempi validi per fare chiamate asincrone? niente, continua a non funzionare. E' come se la richiesta non partisse. Da precisare che inviando la richiesta dal browser i relè si azionano regolarmente, anche con le richieste inviate dall'applicazione java e android. Link al commento Condividi su altri siti Altre opzioni di condivisione...
Sam88 Inviato 16 Settembre 2012 Segnala Condividi Inviato 16 Settembre 2012 Passa un NSError invece che nil e fai un log dell'errore per capire il problema tramite NSLog Mobile & Web Developer | samuele@mr-apps.com | Mr.Apps Link al commento Condividi su altri siti Altre opzioni di condivisione...
hdmvide Inviato 16 Settembre 2012 Autore Segnala Condividi Inviato 16 Settembre 2012 Passa un NSError invece che nil e fai un log dell'errore per capire il problema tramite NSLog questo è l'errore che ottengo Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x68892e0 {NSUnderlyingError=0x688dc70 "bad URL", NSLocalizedDescription=bad URL} sembra che non gli piace l'URL?! Link al commento Condividi su altri siti Altre opzioni di condivisione...
hdmvide Inviato 16 Settembre 2012 Autore Segnala Condividi Inviato 16 Settembre 2012 questo è l'errore che ottengo Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x68892e0 {NSUnderlyingError=0x688dc70 "bad URL", NSLocalizedDescription=bad URL} sembra che non gli piace l'URL?! molto probabilmente è per via delle PIPE che ci sono nei parametri del GET, devo cambiare qualcosina Link al commento Condividi su altri siti Altre opzioni di condivisione...
Sam88 Inviato 16 Settembre 2012 Segnala Condividi Inviato 16 Settembre 2012 si, direi che è per quello. Prova a codificare così myRequestString [myRequestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; sostituisci questo nella concatenazione di stringhe. Così codifica tutti i caratteri in urlencoding, tu dovresti codificare solo i pipe. Mobile & Web Developer | samuele@mr-apps.com | Mr.Apps Link al commento Condividi su altri siti Altre opzioni di condivisione...
hdmvide Inviato 16 Settembre 2012 Autore Segnala Condividi Inviato 16 Settembre 2012 si, direi che è per quello. Prova a codificare così myRequestString [myRequestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; sostituisci questo nella concatenazione di stringhe. Così codifica tutti i caratteri in urlencoding, tu dovresti codificare solo i pipe. domani faccio questa prova perchè oggi non sono riuscito a farla... intanto ci tengo a ringraziarti per la tua disponibilità Infatti se invio una richiesta http senza le pipe non ottengo più alcun errore. Purtroppo quelle PIPE hanno un loro scopo nella parte server di arduino, vorrei poter aggirare il problema. Che io sappia non ci sono restrizioni/convenzioni su ciò che si passa in GET, voglio dire, non credo che si debba per forza utilizzare una forma http://IP?var=valore&var=valore... o sbaglio? Link al commento Condividi su altri siti Altre opzioni di condivisione...
Sam88 Inviato 17 Settembre 2012 Segnala Condividi Inviato 17 Settembre 2012 In realtà di convenzione nella GET c'è la sostituzione dei caratteri speciali con caratteri di escape, quindi l'url encoding. Ho fatto una verifica per capire a quale carattere di escape corrisponde la pipe. Per risolvere il problema invece che modificare il comportamento lato server ed invece di usare il metodo che ti ho riportato che codificherebbe anche i simboli ?,& e non andrebbe bene fai una replace della querystring del solo simbolo | con la stringa %7C così il problema è risolto. Per fare ciò usa il metodo stringByReplacingOccurrencesOfString Mobile & Web Developer | samuele@mr-apps.com | Mr.Apps Link al commento Condividi su altri siti Altre opzioni di condivisione...
hdmvide Inviato 22 Settembre 2012 Autore Segnala Condividi Inviato 22 Settembre 2012 In realtà di convenzione nella GET c'è la sostituzione dei caratteri speciali con caratteri di escape, quindi l'url encoding. Ho fatto una verifica per capire a quale carattere di escape corrisponde la pipe. Per risolvere il problema invece che modificare il comportamento lato server ed invece di usare il metodo che ti ho riportato che codificherebbe anche i simboli ?,& e non andrebbe bene fai una replace della querystring del solo simbolo | con la stringa %7C così il problema è risolto. Per fare ciò usa il metodo stringByReplacingOccurrencesOfString c'hai ragione, in effetti sostituendo le PIPE con i caratteri di escape, non ottengo più l'errore di connessione. Il problema adesso sta nel lato server, perchè arduino non interpreta da se i caratteri di escape e devo cmq apportare una piccola modifica per fare un replace manuale. ti faccio sapere grazie mille per il tuo aiuto Link al commento Condividi su altri siti Altre opzioni di condivisione...
Messaggi raccomandati
Archiviato
Questa discussione è archiviata e chiusa a future risposte.