Подтвердить что ты не робот

Опубликовать фото на стене пользователя с помощью Facebook iOS SDK

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

1 сообщение для альбома (возвращает imageID)

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

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

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

Шаг 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 - это то, что вы указали в параметре "имя" на шаге 3. Нажав на синий текст в Facebook, вы попадете на фотографию, опубликованную на шаге 1, в альбоме в Facebook (Facebook создает альбом по умолчанию для вашего приложения, если вы не укажете альбом). В моем приложении это полноразмерное изображение оценочной карточки (но может быть любым изображением, например, с камеры). К сожалению, я не мог понять, как сделать изображение большого пальца живой ссылкой, но оно не очень читаемо, поэтому в моем случае работает палец по умолчанию. Пользователь в сообщении Facebook (черным шрифтом), который гласит "Первая игра года...".

Ответ 3

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

Это функция HTTP POST, а двоичные данные файла растут как многопользовательский режим.

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

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

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

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

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

Это создаст или добавит альбом под названием "YOUR_APP_NAME Photos" и появится в фиде пользователя. Вы можете поместить его в любой альбом, включая альбом "Wall", получив идентификатор этого альбома и изменив 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];  
}

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

-(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];


}

Ответ 4

Использование 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];), но если вам просто нужно изображение на стене пользователя, вам это не понадобится.

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

Yay!, скалы FB SDK 3.0! Нет больше AppDelegate.facebook:)

Ответ 5

Я искал по всему миру решение для работы с новейшими API-интерфейсами, пока не натолкнулся на это:

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

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