Как опубликовать приложение iOS на стене facebook без изменения пользователем сообщения
Я пишу iPhone-игру и хочу опубликовать счет пользователя в своем фиде в facebook.
Мне удалось сбить пример, когда пользователь согласен с авторизацией, а затем появится диалоговое окно, которое они могут подтвердить, чтобы опубликовать на стене или не публиковать. Это почти идеально, за исключением того, что текст является редактируемым полем - поэтому пользователь может изменить свой рейтинг, а затем опубликовать. В идеале, я хочу точно такой же механизм, но без возможности изменить сообщение.
Я предполагаю сделать это, мне нужно будет спросить разрешения publish_stream, за которым следует вызов Graph api для отправки сообщения. Я получил это, но получаю сообщение об ошибке "Активный токен доступа должен использоваться для запроса информации о текущем пользователе".
Я с радостью пойду в правильном направлении по поводу фактического изменения кода - любая помощь, которую очень ценят.
Это мой первый пост stackOverflow, поэтому будьте осторожны.
Спасибо, ребята.
-Duncan
Оригинальный код (который публикуется на стене, но с изменяемым текстовым полем)
//offer to facebook connect your score
facebook = [[Facebook alloc] initWithAppId:@"210645928948875"];
[facebook authorize:nil delegate:self];
NSMutableString *facebookMessage = [NSMutableString stringWithString:@"I scored a whopping "];
[facebookMessage appendString: [NSMutableString stringWithFormat:@"%d", currentScore]];
[facebookMessage appendString: [NSMutableString stringWithString:@". Can you beat me?"]];
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"210645928948875", @"app_id",
@"http://duncan.co.uk/", @"link",
@"http://d.yimg.com/gg/goran_anicic/dunc.jpeg", @"picture",
@"dunc", @"name",
//@"Reference Documentation", @"caption",
@"Download the app NOW from the App Store", @"description",
facebookMessage, @"message",
nil];
[facebook dialog:@"stream.publish" andParams:params andDelegate:self];
Код для публикации непосредственно на стене (не доказан) (что приводит к активной ошибке токена):
/*Facebook Application ID*/
NSString *client_id = @"210645928948875";
//alloc and initalize our FbGraph instance
self.fbGraph = [[FbGraph alloc] initWithFbClientID:client_id];
//begin the authentication process..... andExtendedPermissions:@"user_photos,user_videos,publish_stream,offline_access"
[fbGraph authenticateUserWithCallbackObject:self andSelector:@selector(fbGraphCallback:) andExtendedPermissions:@"user_photos,user_videos,publish_stream,offline_access"];
NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:4];
[variables setObject:@"the message" forKey:@"message"];
[variables setObject:@"http://duncan.co.uk" forKey:@"link"];
[variables setObject:@"bold copy next to image" forKey:@"name"];
[variables setObject:@"plain text score." forKey:@"description"];
FbGraphResponse *fb_graph_response = [fbGraph doGraphPost:@"me/feed" withPostVars:variables];
NSLog(@"postMeFeedButtonPressed: %@", fb_graph_response.htmlResponse);
Ответы
Ответ 1
Решение найдено. Сначала нужно вызвать аутентификацию. После аутентификации это вызовет функцию fbGraphCallback, которая будет выполнять запись потока пользователей.
Все это стало возможным благодаря http://www.capturetheconversation.com/technology/iphone-facebook-oauth2-graph-api. И бонусные очки идут в The Mad Gamer. Большое спасибо.
-(IBAction)buttonPublishOnFacebookPressed:(id)sender {
/*Facebook Application ID*/
NSString *client_id = @"123456789012345";
//alloc and initalize our FbGraph instance
self.fbGraph = [[FbGraph alloc] initWithFbClientID:client_id];
//begin the authentication process.....
[fbGraph authenticateUserWithCallbackObject:self andSelector:@selector(fbGraphCallback:)
andExtendedPermissions:@"publish_stream" andSuperView:self.view];
}
-(void)fbGraphCallback:(id)sender {
if ((fbGraph.accessToken == nil) || ([fbGraph.accessToken length] == 0)) {
NSLog(@"You pressed the 'cancel' or 'Dont Allow' button, you are NOT logged into Facebook...I require you to be logged in & approve access before you can do anything useful....");
} else {
NSLog(@"------------>CONGRATULATIONS<------------, You're logged into Facebook... Your oAuth token is: %@", fbGraph.accessToken);
NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:4];
[variables setObject:@"http://farm6.static.flickr.com/5015/5570946750_a486e741.jpg" forKey:@"link"];
[variables setObject:@"http://farm6.static.flickr.com/5015/5570946750_a486e741.jpg" forKey:@"picture"];
[variables setObject:@"You scored 99999" forKey:@"name"];
[variables setObject:@" " forKey:@"caption"];
[variables setObject:@"Download my app for the iPhone NOW." forKey:@"description"];
FbGraphResponse *fb_graph_response = [fbGraph doGraphPost:@"me/feed" withPostVars:variables];
NSLog(@"postMeFeedButtonPressed: %@", fb_graph_response.htmlResponse);
//parse our json
SBJSON *parser = [[SBJSON alloc] init];
NSDictionary *facebook_response = [parser objectWithString:fb_graph_response.htmlResponse error:nil];
[parser release];
NSLog(@"Now log into Facebook and look at your profile...");
}
[fbGraph release];
}
Ответ 2
Похоже, что ваши разрешения - это NSString, разделенный запятой, а не NSArray. FB authorize:
ожидает NSArray, а не NSString.
Ожидаете ли вы ответа от аутентификации, который вызывает fbGraphCallback
(этот код перефразирован?) Я предполагаю, что ваш обратный вызов вызовет ошибку auth, потому что ваши perms недействительны. Вам нужно дождаться завершения авторизации, иначе вы можете не иметь токен auth, прежде чем продолжить.
FWIW - FB, возможно, изменили свои правила в том, что приложение не должно отправлять сообщения в поток, не позволяя пользователю изменять текст сообщения. Лучшим маршрутом может быть использование вашего исходного кода (ожидающий авторизации, если это проблема?). Вы можете поместить ссылку на свою игру в параметрах post, а затем поместить оценку в параметры подписи или описания (не редактируемые поля). Затем вы можете использовать диалог FB и не позволять людям менять баллы.
Ответ 3
Вы можете использовать Graph API.
[_facebook requestWithMethodName:@"stream.publish"
andParams:params
andHttpMethod:@"POST"
andDelegate:nil];