Опубликовать фото на стене пользователя с помощью Facebook iOS SDK
Я пытаюсь загрузить фотографию с камеры на стену пользователя Facebook. Я не совсем уверен, какова правильная стратегия, но из чтения вокруг этого, кажется, нужно сделать, это загрузить фотографию в альбом, а затем кто-то опубликовать на стене ссылку на этот альбом/фотографию. В идеале это будет диалог, но я могу сказать, что это невозможно.
Мне удалось загрузить фотографию в альбом и вернуть идентификатор для этой фотографии, но я не уверен, что делать после этого.
Может ли кто-нибудь предоставить простой код для достижения этого?
Бонусный вопрос: возможно ли разместить фотографию на стене приложения (или вместо нее)?
Редактировать: графический API предпочтительнее, но все, что работает на этом этапе, хорошо.
Ответы
Ответ 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.