На вашем месте я бы проверил библиотеку ASIHTTPRequest. Это HTTP-клиентская библиотека для Cocoa, которая делает жизнь ВСЕГДА намного проще для людей, которые много общаются в Интернете из своих приложений для iPhone.
Вот я, использующий ASIFormDataRequest (компонент ASIHTTPRequest) для загрузки изображения из моего приложения для iPhone. Клиент называет эти изображения «отметками» - они наносятся на карту местных снимков, сделанных пользователями по всему региону. Пользователям предлагается «оставить свой след». Вы можете представить себе веселье, которое наступает.
Anyhoo, self.mark
- это экземпляр моего класса Mark, который инкапсулирует данные о пакете с изображениями и подробностями, который я загружаю. У меня есть синглтон диспетчера данных, который я использую в первой строке этого метода, который содержит текущую CLLocation, поэтому я могу получить информацию о геокоде для этого изображения.
Заметьте, я не занимаюсь типами кодирования или составными границами. Библиотека обрабатывает все это.
-(void)completeUpload
{
CLLocation *currentLoc = [DataManager sharedDataManager].currentLocation;
self.mark.latitude = [NSNumber numberWithDouble:currentLoc.coordinate.latitude];
self.mark.longitude = [NSNumber numberWithDouble:currentLoc.coordinate.longitude];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:
[NSURL URLWithString:[NSString stringWithFormat:@"%@image_upload.php", WEBAPPURL]]];
[request setPostValue:self.mark.titleText forKey:@"title"];
[request setPostValue:self.mark.descriptionText forKey:@"description"];
[request setPostValue:self.mark.event.guid forKey:@"event"];
[request setPostValue:self.mark.latitude forKey:@"latitude"];
[request setPostValue:self.mark.longitude forKey:@"longitude"];
[request setPostValue:self.mark.project forKey:@"project"];
[request setPostValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"userID"] forKey:@"user_id"];
request.timeOutSeconds = 120;
int i = 1;
for (NSString *tag in self.tags) {
[request setPostValue:tag forKey:[NSString stringWithFormat:@"tag-%d", i]];
i++;
}
NSData *imageData = UIImagePNGRepresentation(self.mark.image);
NSData *thumbData = UIImagePNGRepresentation(self.mark.thumbnail);
[request setData:imageData forKey:@"file"];
[request setData:thumbData forKey:@"thumb"];
self.progress.progress = 20.0;
[request setUploadProgressDelegate:self.progress];
request.showAccurateProgress = YES;
request.delegate = self;
[request startAsynchronous];
}
РЕДАКТИРОВАТЬ: Кстати, скрипт PHP, который я публикую, находится за HTTP-аутентификацией. ASI кэширует эти учетные данные, и я предоставил их ранее, поэтому мне не нужно предоставлять их здесь снова. Я отмечаю, что поскольку в противном случае способ написания этого поста и соответствующего сценария PHP может подделать любое значение идентификатора пользователя и опубликовать что угодно под своим именем пользователя. Вы должны думать о безопасности веб-приложений, когда создаете такое приложение, не отличающееся от того, было ли это веб-сайтом. На самом деле это веб-сайт, который просматривается через нетрадиционный клиент.