Не удается опубликовать на стене Facebook с iOS SDK (проблема с авторизацией) - PullRequest
2 голосов
/ 01 июля 2011

Сначала я создаю объект facebook с помощью своего appId:

facebook = [[Facebook alloc] initWithAppId:kAppId];

Когда я звоню

[_facebook authorize:_permissions delegate:self] 

, открывается мое сафари, а после ввода имени пользователя и пароля FB, сафари закрывается ивсе возвращается в мое приложение (как и должно).Мои разрешения:

_permissions =  [[NSArray arrayWithObjects:@"read_stream", @"publish_stream", @"offline_access",nil] retain];

Странно то, что мой метод делегата - (void) fbDidLogin или - (void) fbDidNotLogin: (BOOL) отменен, не вызывается, как в примере приложения FB, которое поставляется с SDK.В моем файле .h я реализую протоколы «FBRequestDelegate, FBDialogDelegate, FBSessionDelegate», а в файле .m у меня есть необходимые методы.* я получаю сообщение об ошибке "req fail with error Операция не может быть завершена. (facebookErrDomain error 10000.)".Это должно быть что-то, связанное с авторизацией, но так как я не получаю сообщения после авторизации вызова, я не знаю, что делать.

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 01 июля 2011
NSMutableDictionary *params = [NSMutableDictionary  dictionaryWithObjectsAndKeys:
                      @"My new status message", @"message",
                      nil];
[_facebook requestWithGraphPath:@"/me/feed"
                  andParams:params
                  andHttpMethod:@"POST"
            andDelegate:self];

или

Возвращенный объект ошибки содержит подробную информацию о том, что происходит. Я предлагаю реализовать этот метод, чтобы получить больше информации:

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
    NSLog(@"%@", [error localizedDescription]);
    NSLog(@"Err details: %@", [error description]);
};

Например, для моей проблемы дал мне эту информацию, и я исправил ее:

2011-05-27 11:19:57.313 Challengein[7704:207] The operation couldn’t be completed. (facebookErrDomain error 10000.)
2011-05-27 11:19:57.314 Challengein[7704:207] Err details: Error Domain=facebookErrDomain Code=10000 "The operation couldn’t be completed. (facebookErrDomain error 10000.)" UserInfo=0x6878b90 {error=<CFBasicHash 0x6879be0 [0x141c400]>{type = mutable dict, count = 2,
entries =>
    2 : <CFString 0x6877f70 [0x141c400]>{contents = "type"} = <CFString 0x686f9a0 [0x141c400]>{contents = "OAuthException"}
    3 : <CFString 0x686d610 [0x141c400]>{contents = "message"} = <CFString 0x686f970 [0x141c400]>{contents = "(#100) picture URL is not properly formatted"}
}
}

пожалуйста, попробуйте эту ссылку http://www.capturetheconversation.com/technology/-facebook-oauth-2-0-and-the-graph-api-a-tutorial-part-2

0 голосов
/ 18 июля 2011

Позвольте мне предположить, что вы извлекли свой код FB в другой класс вместо того, чтобы реализовывать его в своем AppDelegate?

Я считаю, что проблема заключается в том, что страница FB указала нам сделать что-то подобное в их демонстрационном коде:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [facebook handleOpenURL:url];
}

Однако демонстрационный код Facebook реализовал всю логику внутри AppDelegate.Если вы, как и я, извлек код связи FB в другой класс, приведенный выше код не будет выполнен должным образом (если у вас есть код в вашей AppDelegate, переменная facebook не указывает на нужный объект. Если у вас есть код вваш извлеченный класс, он не будет вызван) и информация о вашем токене не будет включена.

В итоге я сделал следующее:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [fbModel handleOpenURL:url];
}

, где fbModel - это переменная экземпляра, указывающая на код, выполняющий FB.А затем в моей реализации fbMode я делаю что-то вроде этого:

- (BOOL)handleOpenURL:(NSURL *)url
{
    return [facebook handleOpenURL:url];
}

Где facebook - это переменная instacne в моем классе FBModel, так что facebook = [[Facebook alloc] initWithAppId: AppID] вызывался при инициализации.

0 голосов
/ 09 июля 2011

Чтобы я мог решить ошибку 10000, просто добавьте

[facebook handleOpenURL:url];

в обратном вызове:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

info: этот обратный вызов вызывается после разрешения запроса, например:

permissions =  [[NSArray arrayWithObjects:@"publish_stream",
                                          @"offline_access",
                                          nil] retain];
facebook = [[Facebook alloc] initWithAppId:@"yourappid"];
[facebook authorize:permissions delegate:self];

Тогда в этом обратном вызове просто позвоните [facebook handleOpenURL:url], прежде чем пытаться опубликовать на стене.Вызов [facebook handleOpenURL:url] вызов обратного вызова fbDidLogin !!

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    NSLog(@"URL: %@",url);  
    [facebook handleOpenURL:url];
    [facebook requestWithGraphPath:@"me/feed" 
                         andParams:[NSMutableDictionary dictionaryWithObject:@"test wall post"
                                                                      forKey:@"message"]
                     andHttpMethod:@"POST"
                       andDelegate:self];
}

Twil

0 голосов
/ 01 июля 2011

то же самое здесь.Я последовал за блогом Бена Биддингтона , чтобы получить токен доступа.Та же ошибка при попытке его использовать.Реализация OAuth в Facebook не полностью соответствует спецификации, с ней все в порядке, пока документ ясен, что, очевидно, не так.Также было бы неплохо, если бы идентификатор пользователя и имя пользователя возвращались с токеном доступа.

или

Просто чтобы уточнить - после того, как вы позвоните

https://graph.facebook.com/oauth/authorize?

, вам следуетполучить КОД, который вместе с вашими CLIENT_ID и CLIENT_SECRET (при условии, что вы зарегистрировали свое приложение) можно обменять на access_token по

https://graph.facebook.com/oauth/access_token?

Если это действительно так, как вы пришли по ACCESS_TOKEN, вам следуетбыть в состоянии запросить

https://graph.facebook.com/me/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...