Как опубликовать приложение из iOS на стене Facebook без сообщения пользователя о внесении изменений - PullRequest
12 голосов
/ 21 марта 2011

Я пишу игру для 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);

Ответы [ 3 ]

12 голосов
/ 31 марта 2011

Решение найдено. Проверка подлинности должна быть вызвана первой. После аутентификации это вызовет функцию 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 голосов
/ 30 марта 2011

Похоже, ваши разрешения - это разделенная запятыми строка NSString, а не NSArray.FB authorize: ожидает NSArray, а не NSString.

Вы ожидаете ответа от аутентификации, которая вызывает fbGraphCallback (перефразирован ли этот код?) Я предполагаю, что ваш обратный вызов будет показывать ошибку аутентификации, потому что ваши разрешения недействительны.Вам нужно дождаться завершения аутентификации - иначе у вас может не быть токена авторизации, прежде чем продолжить.

FWIW - FB, возможно, изменил свои правила в этом приложении, которое не должно публиковаться в потоке, не позволяя пользователю изменятьтекст поста.Лучшим маршрутом может быть использование исходного фрагмента кода (ожидание аутентификации, если в этом проблема?).Вы можете поместить ссылку на свою игру в параметрах поста, а затем поставить счет в параметрах заголовка или описания (не редактировать поля).Затем вы можете использовать диалог FB и не позволять людям менять оценки.

1 голос
/ 24 мая 2011

Вы можете использовать Graph API.

[_facebook requestWithMethodName:@"stream.publish"
                   andParams:params
               andHttpMethod:@"POST"
                 andDelegate:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...