Facebook SDK для iOS, fbDidLogin никогда не вызывался в приложении с несколькими перьями

это моя первая публикация, так как я обычно просто прихожу, чтобы исследовать проблемы, но с этим я не могу разобраться сам.

В основном моя проблема аналогична другим разработчикам, использующим facebook sdk для iOS, моя функция fbDidLogin никогда не вызывается даже после того, как я вхожу в систему, и могу сделать так, чтобы мои сообщения были успешно загружены. Я просмотрел другие темы здесь, такие как fbDidLogin никогда не вызывался (facebook-ios-sdk) и fbDidLogin не вызывается, однако мне это не удалось. В моем приложении есть основное представление, которое загружается, и при нажатии кнопки оно вытягивает второй наконечник и заменяет представление. Этот второй контроллер представления имеет функциональность facebook, и я чувствую, что моя проблема может заключаться в подключении от Appdelegate к этому secondViewController. Я заметил в примере приложения, что все настроено в appdelegate, но моя программа работает иначе.

Я новичок в программировании на языке C, но до сих пор у меня все получалось с точки зрения создания некоторых приложений, только этот facebook sdk меня убивает.

Я ценю любое направление, которое люди могут бросить мне. Спасибо.

Вот часть кода:

- (void)login {
    facebook=[[Facebook alloc]initWithAppId:FB_APP_ID];
    NSLog(@"Inside login/post to wall function.");
    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                       @"mystuff",@"test",
                                       @"mystuff", @"link",
                                       @"mystuff", @"picture",
                                       mystuff, @"name",
                                       @"mystuff", @"caption",
                                       @"mystuff", @"description",
                                       @"mystuff",  @"message",
                                       nil];
    [facebook dialog:@"feed" andParams:params andDelegate:self];
}

/**
 * Invalidate the access token and clear the cookie.
 */
- (void)logout {
    [facebook logout:self];
}

/**
 * Called when the user has logged in successfully.
 */
-(void)fbDidLogin{
    NSLog(@"Inside fbDidLogin function.");
}

/**
 * Called when the user canceled the authorization dialog.
 */
-(void)fbDidNotLogin:(BOOL)cancelled {
    NSLog(@"User did not login.");
}

person Quintin    schedule 01.08.2011    source источник
comment
Было бы здорово, если бы вы могли опубликовать то, что у вас уже есть в коде.   -  person squinlan    schedule 01.08.2011
comment
@squinlan Добавил часть кода, спасибо!   -  person Quintin    schedule 01.08.2011


Ответы (1)


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

Например, у вас может быть класс, который делает следующее (этот код покрывает 80% — надеюсь, он направит вас по правильному пути):

typedef void (^completionHandler)(id);

@interface FacebookController : NSObject <FBSessionDelegate>
{
    completionHandler handler;
}

- (void)postToWallWithOptions:(NSDictionary *)options;
- (void)login:(completionHandler)handler;
- (void)fbDidLogin;

И реализация будет:

@implementation FacebookController

- (void)postToWallWithOptions:(NSDictionary *)options
{
    completionHandler handler = ^(id data)
        {
    // If you want this class to also be the delegate dialog, it will need to implement FBDialogDelegate
            [facebook dialog:@"feed"
                   andParams:options
                 andDelegate:self];
        };
[self login:handler];
}

- (void)login:(completionHandler)handler
{
completionHandler = handler;
// Be sure to add in your permissions here
[facebook authorize:yourPermissions 
               delegate:self];
}

- (void)fbDidLogin
{
// You could pass any object you needed to here
completionHandler(nil);
}

@end

Вам нужно будет определить этот класс как свойство вашего делегата приложения:

@property (nonatomic, retain) FacebookController *fbController;

Теперь, когда вам понадобится ваш FacebookController, вы просто можете сделать это:

FacebookController *fbController = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] fbController];
person dtuckernet    schedule 01.08.2011
comment
Большое спасибо за ваш ответ. Я понимаю, о чем вы говорите, но мне трудно записать это в код. Не могли бы вы показать мне небольшой пример того, что вы упомянули? Извините, что беспокою, я все еще привыкаю к ​​используемым формулировкам и помещаю их в код. Большое спасибо. - person Quintin; 01.08.2011
comment
Большое спасибо! Я собираюсь поработать над этим сегодня и, надеюсь, у меня будут хорошие новости! - person Quintin; 02.08.2011
comment
Вы всегда можете проголосовать за мой ответ (и пометить его как ответ, если он работает). - person dtuckernet; 02.08.2011
comment
Большое спасибо, ваш пример указал мне правильное направление и позволил мне заставить это работать. Очень признателен! - person Quintin; 03.08.2011