Опубликовать фотографию на стене пользователя, используя Facebook iOS SDK
Я пытаюсь загрузить фотографию с камеры на стенку Facebook пользователя. Я не совсем уверен, какова правильная страtagsя, но из чтения вокруг этого, кажется, нужно сделать, это загрузить фотографию в альбом, а затем кто-то опубликовать на стене ссылку на этот альбом / фотографию. В идеале это связано с диалогом, но из того, что я могу сказать, это невозможно.
Мне удалось загрузить фотографию в альбом и вернуть идентификатор для этой фотографии, но я не уверен, что делать после этого.
Может ли кто-нибудь предоставить простой код для достижения этого?
- Пользовательские цвета в UITabBar
- Нарисуйте часть круга
- Проверка доступности iPhone
- Возвратитесь к поведению приложения после разговора по телефону в собственном коде, чем UIWebView
- Запустите NSRunLoop в командной строке программы Cocoa
Бонусный вопрос: возможно ли разместить фотографию на стене приложения (или вместо этого)?
Edit: Graph API предпочтительнее, но все, что работает на этом этапе, хорошо.
- канонический способ рандомизации NSArray в Objective C
- глубокая изменчивая копия NSMutableDictionary
- как отобразить тестовый баннер IAd в симуляторе
- Значение предупреждения "во время презентации!"
- В чем разница между «отображаемым именем пакета» и «именем пакета» в информационном plist приложения cocoa
- Как передать объект с помощью NSNotificationCenter
- Могу ли я отключить прокрутку звука UIPickerView?
- Измените NSEvent для отправки другого ключа, кроме того, который был нажат
Понятно, что вы хотите сделать – отправьте фотографию в 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 – это то, что вы указали в параметре «имя» на шаге 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.