Разместите фотографию на стене пользователя с помощью Facebook iOS SDK - PullRequest
25 голосов
/ 15 июля 2011

Я пытаюсь загрузить фотографию с камеры на стену пользователя в Facebook.Я не совсем уверен, какова правильная стратегия, но из прочтения кажется, что нужно сделать, чтобы загрузить фотографию в альбом, а затем кто-то опубликовал на стене ссылку на этот альбом / фотографию.В идеале это может включать диалог, но из того, что я могу сказать, это невозможно.

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

Может кто-нибудь дать какой-нибудь простой код для достижения этой цели?

Бонусный вопрос: можно ли также опубликовать фотографию на стене приложения (или вместо нее)?

Редактировать: API Graph предпочтительнее, но все, что работает на этом этапе, хорошо.

Ответы [ 5 ]

18 голосов
/ 30 ноября 2011

Я сделал это в три шага

1 опубликовать изображение в альбом (возвращает imageID)

2 использовать imageID для запроса метаданных для imageID

3 использовать ссылкуполе (не поле «источник») как ссылка на изображение в сообщении на стене пользователя

Недостатком является то, что теперь на стене есть два сообщения, одно для изображения и одно дляфактический пост.Я еще не разобрался, как опубликовать картинку в альбом, без появления поста на стене (в идеале это будет только 2-й пост)

Шаг 1:

- (void) postImageToFacebook {

    appDelegate = (ScorecardAppDelegate *)[[UIApplication sharedApplication] delegate];

    currentAPICall = kAPIGraphUserPhotosPost;

    UIImage *imgSource = {insert your image here};
    NSString *strMessage = @"This is the photo caption";
    NSMutableDictionary* photosParams = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                         imgSource,@"source",
                                         strMessage,@"message",
                                         nil];

    [appDelegate.facebook requestWithGraphPath:@"me/photos"
                                     andParams:photosParams
                                 andHttpMethod:@"POST"
                                   andDelegate:self];     

    // after image is posted, get URL for image and then start feed dialog
    // this is done from FBRequestDelegate method
}

Шаг 2 (kAPIGraphUserPhotosPost) и шаг 3 (kAPIGraphPhotoData):

- (void)request:(FBRequest *)request didLoad:(id)result {

    if ([result isKindOfClass:[NSArray class]] && ([result count] > 0)) {
        result = [result objectAtIndex:0];
    }

    switch (currentAPICall) {
        case kAPIGraphPhotoData: // step 3
        {
            // Facebook doesn't allow linking to images on fbcdn.net.  So for now use default thumb stored on Picasa
            NSString *thumbURL = kDefaultThumbURL;
            NSString *imageLink = [NSString stringWithFormat:[result objectForKey:@"link"]];    

            currentAPICall = kDialogFeedUser;
            appDelegate = (ScorecardAppDelegate *)[[UIApplication sharedApplication] delegate];


            NSMutableDictionary* dialogParams = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                     kAppId, @"app_id",
                                     imageLink, @"link",
                                     thumbURL, @"picture",
                                     @"Just Played Wizard etc etc", @"name",
                                     nil];

            [appDelegate.facebook dialog:@"feed" 
                               andParams:dialogParams 
                             andDelegate:self];


            break;
        }
        case kAPIGraphUserPhotosPost: // step 2
        {

            NSString *imageID = [NSString stringWithFormat:[result objectForKey:@"id"]];            
            NSLog(@"id of uploaded screen image %@",imageID);

            currentAPICall = kAPIGraphPhotoData;
            appDelegate = (Scorecard4AppDelegate *)[[UIApplication sharedApplication] delegate];

            [appDelegate.facebook requestWithGraphPath:imageID
                                           andDelegate:self];
            break;
        }
    }
}

Я изменил код, чтобы показать только сжатые материалы Facebook.Если вы хотите проверить успешность публикации, вам понадобится что-то вроде этого:

- (void)dialogDidComplete:(FBDialog *)dialog {
    switch (currentAPICall) {
        case kDialogFeedUser:
        {
            NSLog(@"Feed published successfully.");
            break;
        }
    }
}

facebook post

Синий текст в посте Facebook - это то, что вы вставили в "Параметр name »на шаге 3. При нажатии на синий текст в Facebook вы попадете на фотографию, опубликованную на шаге 1, в альбоме в Facebook (Facebook создает альбом по умолчанию для вашего приложения, если вы не укажете альбом).В моем приложении это полноразмерное изображение карты результатов (но это может быть любое изображение, например, с камеры).К сожалению, я не смог найти способ сделать изображение большого пальца живой ссылкой, но он не очень читабелен, поэтому в моем случае работает большой палец по умолчанию.Участник поста Facebook (черным шрифтом), в котором говорится «Первая игра года ...», введен пользователем.

16 голосов
/ 16 июля 2011

Понятнее, что вы хотите сделать - опубликуйте фотографию в FB и гарантируйте, что пост будет размещен на стене / потоке пользователя.

К сожалению, на этом пути есть некоторые вещи.

FB Graph API, по-видимому, позволяет только публиковать ЛЮБОЕ изображение в альбом или непосредственно на стене, ссылаясь на изображение, уже существующее где-то в Интернете. В первом случае, вероятно, будет сделано сообщение в потоке, но FB, по-видимому, каким-то образом объединяет несколько сообщений, чтобы предотвратить бомбардировку потока пользователя. Механизм для этого нигде не задокументирован.

Во втором случае, вы можете подумать, что можете оставить запись в альбоме, а затем явно опубликовать ссылку на альбом. Вы можете добавить параметр к исходной записи альбома "no_story" со значением 1 и отключить запись на стене, которая может быть сделана, пока вы готовитесь сделать явную запись. Тем не менее, FB не будет иметь исходный URL для недавно размещенного изображения некоторое время, И, похоже, он не похож на URL-адреса, которые включают свою собственную сеть доставки контента, возвращая ошибку. Вы можете подумать о том, чтобы просто поместить обновление статуса в поток, говоря о публикации. Однако API-интерфейс Graph также ограничен 25 такими сообщениями прямой подачи в день на приложение, чтобы предотвратить рассылку спама.

Одним из решений было бы опубликовать что-то вроде Flickr, получить URL-адрес изображения, а затем опубликовать на стене. Предполагается, что предпочтительным решением FB является использование диалогов FB, которые являются частью мобильного инструментария - по сути, это маленькие веб-страницы, очень похожие на экран OAuth.

Лично я планирую просто опубликовать в альбом, как указано выше, и жить с идеей FB о том, как пользователь должен быть уведомлен. Любопытно, как вы решили продолжить.

9 голосов
/ 15 июля 2011

Я не уверен, какая часть не работает для вас, так как вы публикуете и получаете ID обратно, но вот что я сделал быстро и грязно, на случай, если кто-то доберется сюда через Google.

Это функция HTTP POST, и двоичные данные файла увеличиваются как mime-часть.

Я большой поклонник доступной библиотеки ASIHTTPRequest здесь .

** ОБНОВЛЕНИЕ: 22.10.2012 ** - AFNetworking заменил ASIHTTPRequest в моем коде в последние несколько месяцев. Доступно на GitHub здесь

Документы в Facebook сбивают с толку, отчасти потому, что они неполные, а отчасти потому, что они могут ошибаться. Вы, вероятно, порвете волосы, выяснив, какое именно значение поста установить для заголовка или чего-то еще, но этот рецепт помещает фотографию в альбом, и это входит в канал.

Вам все еще нужно настроить OAuth в Facebook обычным способом - я сделал это в делегате приложения, поэтому я взял оттуда объект Facebook, чтобы получить свой токен доступа. Я удостоверился, что запросил разрешение «publish_stream» при аутентификации, например:

[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:self];

Это создаст или добавит в альбом под названием «Фото YOUR_APP_NAME» и появится в ленте пользователя. Вы можете поместить его в любой альбом, включая альбом «Стена», получив идентификатор этого альбома и изменив URL на http://graph.facebook.com/THE_ID_OF_THE_ALBUM/photos.

Вот основной метод:

-(void) postImageToFB:(UIImage *) image
{

    NSData* imageData = UIImageJPEGRepresentation(image, 90);
    Facebook* fb = [(uploadPicAppDelegate *)[[UIApplication sharedApplication] delegate] facebook   ];


    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"https://graph.facebook.com/me/photos"]];
    [request addPostValue:[fb accessToken] forKey:@"access_token"];
    [request addPostValue:@"image message" forKey:@"message"];
    [request addData:imageData forKey:@"source"];

    [request setDelegate:self];
    [request startAsynchronous];  
}

Использование предоставленной Facebook библиотеки iOS выглядит следующим образом:

-(void) postImageToFB:(UIImage *) image
{

    NSData* imageData = UIImageJPEGRepresentation(image, 90);
    Facebook* fb = [(uploadPicAppDelegate *)[[UIApplication sharedApplication] delegate] facebook   ];

    NSMutableDictionary * params = [NSMutableDictionary dictionaryWithObjectsAndKeys:[fb accessToken],@"access_token",
                                    @"message text", @"message",
                                    imageData, @"source",
                                    nil];
    [fb requestWithGraphPath:@"me/photos" 
                   andParams:params 
               andHttpMethod:@"POST" 
                 andDelegate:self];


}
3 голосов
/ 21 сентября 2012

Использование Facebook SDK 3.0:

 - (void)postPhotoThenOpenGraphAction {
    FBRequestConnection *connection = [[FBRequestConnection alloc] init];

    // First request uploads the photo.
    FBRequest *request1 = [FBRequest 
        requestForUploadPhoto:self.selectedPhoto];
    [connection addRequest:request1
        completionHandler:
        ^(FBRequestConnection *connection, id result, NSError *error) {
            if (!error) {
            }
        }
            batchEntryName:@"photopost"
    ];

    // Second request retrieves photo information for just-created 
    // photo so we can grab its source.
    FBRequest *request2 = [FBRequest 
        requestForGraphPath:@"{result=photopost:$.id}"];
    [connection addRequest:request2
         completionHandler:
        ^(FBRequestConnection *connection, id result, NSError *error) {
            if (!error &&
                result) {
                NSString *source = [result objectForKey:@"source"];
                [self postOpenGraphActionWithPhotoURL:source];
            }
        }
    ];

    [connection start];
}

Они следуют за этой публикацией публикацией действий OpenGraph ([self postOpenGraphActionWithPhotoURL:source];), но если вы просто хотите, чтобы изображение на стене пользователя, вам это не нужно.1005 *

Дополнительная информация: https://developers.facebook.com/docs/tutorials/ios-sdk-tutorial/publish-open-graph-story/#step7

Ууу!Нет больше AppDelegate.facebook:)

2 голосов
/ 30 сентября 2013

Я много раз искал решение, которое работало на последних API, пока не наткнулся на это:

http://xcodenoobies.blogspot.co.uk/2012/09/how-to-upload-photo-and-update-status.html

На сегодняшний день самое ясное решение, с которым я столкнулсяпрост и работает с последним API.

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