Я хочу отправить данные NSString из Xcode на мой PHP-сервер, используя в этом примере URL: http://11.1.12.173:1000
Мне нужно решение для XCODE 8.1, потому что некоторые коды не работают в последнем Xcode.
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://11.1.12.173:1000"]]; [req setHTTPMethod:@"POST"]; NSData *postData = [deviceToken dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]]; [req addValue:postLength forHTTPHeaderField:@"Content-Length"]; [req setHTTPBody:postData]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // Do something with response data here - convert to JSON, check if error exists, etc.... }]; [task resume];
Я пробовал этот код, но не работал.
Это синхронное решение, но оно может сработать для вас. Просто используйте его в другой очереди, и у вас не будет проблем, даже если соединение слишком медленное. Это то, что я делаю для выполнения запроса POST:
-(NSString*)launchURL:(NSURL*)url withPostString:(NSString*)post { NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:postData]; NSError *error = nil; NSHTTPURLResponse *response = nil; NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if (response.statusCode >= 200 && response.statusCode < 300) { NSString *responseData = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding]; if (responseData.length > 0) return responseData; } else if (error) return [error description]; return nil; }
Строка должна иметь правильную кодировку (процентное кодирование) для работы, и для этого я добавляю эту функцию в NSString (этот метод всегда работает даже в очень старых версиях macOS):
@implementation NSString (WebString) -(NSString*)stringToWebStructure { NSString* webString = [self stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; webString = [webString stringByReplacingOccurrencesOfString:@"&" withString:@"%26"]; webString = [webString stringByReplacingOccurrencesOfString:@"?" withString:@"%3F"]; return webString; } @end
Вам просто нужно добавить оба файла в тот же файл, который будет делать запрос, и использовать его таким образом:
[self launchURL:[NSURL URLWithString:@"http://11.1.12.173:1000"] withPostString:[deviceToken stringToWebStructure]];
Подтверждено работать в Xcode 8.