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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я большой поклонник библиотеки 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», получив ID этого альбома и изменив 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]; } 

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

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

     // Первый запрос загружает фотографию.
     FBRequest * request1 = [FBRequest 
         requestForUploadPhoto: self.selectedPhoto];
     [connection addRequest: request1
         completionHandler:
         ^ (Соединение FBRequestConnection *, результат ID, ошибка NSError *) {
             если (! ошибка) {
             }
         }
             batchEntryName: @ "Макрооптика"
     ];

     // Второй запрос получает информацию о фотографии для только что созданного 
     // фото, чтобы мы могли захватить его источник.
     FBRequest * request2 = [FBRequest 
         requestForGraphPath: @ "{результат = PhotoPost:. $ ID}"];
     [connection addRequest: request2
          completionHandler:
         ^ (Соединение FBRequestConnection *, результат ID, ошибка NSError *) {
             if (! error &&
                 результат) {
                 NSString * source = [result objectForKey: @ "source"];
                 [self postOpenGraphActionWithPhotoURL: source];
             }
         }
     ];

     [начало соединения];
 }

Они следуют этому сообщению с публикацией действия 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 🙂

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

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

Безусловно, самое ясное решение, с которым я столкнулся, прост и работает с последним API.

  • Сравнение поплавковых и двойных типов данных в объекте C
  • Как получить счетчик ссылок NSObject?
  • Xcode - обновить текст метки ViewController с другого вида
  • UITextView внутри UIScrollView с AutoLayout
  • Получить текущего первого ответчика без использования частного API
  • Как распознать салфетки во всех четырех направлениях?
  • Как использовать VideoToolbox для распаковки видеоstreamа H.264
  • канонический способ рандомизации NSArray в Objective C
  • Содержимое HTML соответствует UIWebview без масштабирования
  • Изменить цвет курсора в UITextField
  • Ссылка с UITableViewCell на родительский UITableView?
  • Interesting Posts

    Будет ли сборщик мусора звонить IDisposable.Dispose для меня?

    Вызывается: java.lang.NullPointerException в org.apache.spark.sql.Dataset

    Значение по умолчанию для типа в Runtime

    Неустранимая ошибка среды выполнения Java

    Как автоматически выбрать весь текст в фокусе в WPF TextBox?

    Как закодировать счетчик для ожидающих процессов в пакетном файле?

    Требуется автономное приложение для резервного копирования папки в папку (Windows)

    Как слушать клавиатуру в фоновом режиме и стрелять по нажатию клавиши по требованию?

    jQuery: удалить элемент, кроме внутреннего элемента

    Запуск сразу нескольких конфигураций запуска

    Android: я хочу встряхнуть его

    Как написать текстовые значения в файл .txt с помощью vb.net

    Решение для «Проверка не выполнена для одного или нескольких объектов. Дополнительную информацию см. В разделе Свойство EntityValidationErrors. “

    Как проверить, поддерживает ли мой порт eSATAp мощность 12 В?

    Как записывать веб-камеру и аудио с помощью webRTC и одноранговое соединение на сервере

    Давайте будем гением компьютера.