API Graph Facebook Загрузить локальное изображение на стену (Objective-C) - PullRequest
0 голосов
/ 01 декабря 2011

Я пытаюсь загрузить локальную, созданную пользователем фотографию из моего приложения на пользовательскую стену Facebook. Я разрабатываю приложение в Objective-C и использую библиотеку PhFacebook для взаимодействия с социальной сетью, но я думаю, что более вероятно, что моя проблема исходит из моего некорректного использования реального взаимодействия с Facebook.

Действительно, для загрузки статуса в профиль пользователя, после получения токена доступа, этот код работает отлично:

NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:1];

[variables setObject:@"This is a test." forKey:@"message"];

[fb sendRequest:@"me/feed" params:variables usePostRequest:YES];

Однако, если я пытаюсь загрузить фотографию непосредственно на me/feed, используя следующий код, она систематически завершается сбоем, так как изображение не отображается, а окружающий текст:

NSString *path = @"some/path/to/some/image/on/my/computer";

NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:2];

[variables setObject:@"This is a test." forKey:@"message"];

[variables setObject:path forKey:@"source"];

[fb sendRequest:@"me/feed" params:variables usePostRequest:YES];

Я пытался изменить ключ source на image, photo, picture, file и data, но никаких изменений не было видно, и source кажется самый правильный.

После прочтения документации по загрузке фотографий: http://developers.facebook.com/docs/reference/api/photo/, Я понял, что параметр источника соответствует URL. Я пытался напрямую загрузить данные изображения или локальный путь изображения на компьютер пользователя, но я все еще не нашел способа загрузить изображение, которого еще нет в Интернете. Я уверен, что есть способ сделать это, даже слово загрузки подразумевает, что изображение должно быть локальным!

По сути, похоже, у меня возникла обратная сторона этой проблемы: Загрузить размещенное изображение с помощью Graph API Facebook по URL? .

Заранее спасибо всем, кто может помочь, мои друзья на Facebook начинают ломать голову над этими тестовыми сообщениями:)

Ответы [ 3 ]

3 голосов
/ 06 ноября 2012

Вы также можете загрузить фото напрямую, нет необходимости делать URL.Вот пример кода-

NSString *urlString = [NSString stringWithFormat:@"https://graph.facebook.com/%@", @"facebook id"];
NSURL *url = [NSURL URLWithString:urlString];
NSString *boundary = @"----1010101010";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary]
         dataUsingEncoding:NSUTF8StringEncoding]];
NSEnumerator *enumerator = [post_vars keyEnumerator];
NSString *key;
NSString *value;
NSString *content_disposition;
while ((key = (NSString *)[enumerator nextObject])) {

    //if it's a picture (file)...we have to append the binary data
    if ([key isEqualToString:@"file"]) {
        NSData *picture_data = UIImagePNGRepresentation([post_vars objectForKey:key]);
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"media\";\r\nfilename=\"media.png\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:picture_data];
    } else {
        value = (NSString *)[post_vars objectForKey:key];

        content_disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key];
        [body appendData:[content_disposition dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[value dataUsingEncoding:NSUTF8StringEncoding]];

    }
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
}
[body appendData:[@"Content-Disposition: form-data; name=\"access_token\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];    
[body appendData:access_token] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
[request addValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField: @"Content-Length"];    
NSData *data_reply;
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:delegate startImmediately:YES];
[conn start];
BOOL flag = YES;
NSString *stringResponse = [[NSString alloc] initWithData:data_reply encoding:NSUTF8StringEncoding];
NSError *err = [[NSError alloc] init];
if (err != nil) {
    NSData *dataStr = [stringResponse dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableDictionary *data = [NSJSONSerialization JSONObjectWithData:dataStr options:kNilOptions error:&err];
    if([data objectForKey:@"Error"]!=nil){
    }
}iscr
stringResponse = nil;
data_reply = nil;

}

В этом словаре post_vars описан ниже: *

NSMutableDictionary * post_vars = [NSMutableDictionary dictionaryWithCapacity: 4];

[post_vars setObject:@"this is a message" forKey:@"message"];
[post_vars setObject:@"name" forKey:@"name"];
[post_vars setObject:@"description" forKey:@"description"];
[post_vars setObject:imagename forKey:@"file"];
2 голосов
/ 06 декабря 2011

Оказывается, вы можете использовать PhFacebook только для более простых запросов. Вот что мне нужно было сделать, чтобы загрузить локальное изображение на стене Facebook без использования PhFacebook и на Mac:

-Получите токен доступа Facebook с набором разрешений publish_stream, используя WebView и ASIHTTPRequest (http://www.capturetheconversation.com/technology/iphone-facebook-oauth2-graph-api).

- Сделайте простой запрос ASIHTTP для фактической загрузки изображения:

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/me/photos?access_token=%@", access_token]];

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

    [request addFile:@"/path/tolocalimage/" forKey:@"file"];

    [request setPostValue:[NSString stringWithFormat:@"This is a test."] forKey:@"message"];

    [request startAsynchronous];

И вот, пожалуйста! Это решение кажется более простым, чем использование существующих фреймворков! Единственная трудоемкая часть - это создание интерфейса WebView, но вы можете просто вдохновить себя по ссылке, которую я разместил, и PhFacebook.h, который использует похожую (но немного отличную) технику.

2 голосов
/ 02 декабря 2011

Я только что попробовал метод, описанный здесь: Изображение Facebook connect на iOS не отображается на стене , и это может помочь вашему делу.Однако, похоже, что поведение немного отличается от реального «поста с картинками на стене», поскольку картинки загружаются в фотоальбом вашего приложения вместо «фотоальбома».

Когда вы публикуете несколько картинок вВ течение нескольких мгновений, используя приложение Facebook, Facebook упоминает, что «[YourFBName] добавил несколько фотографий в альбом [ApplicationName]» («групповая» запись на стене для различных событий).

В то время как вы публикуете несколько изображений настена, использующая интерфейс FB напрямую, несмотря на то, что все они добавлены в «Настенный альбом», они всегда отображаются в виде отдельных сообщений (сообщения на стене не группируются здесь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...