Вы должны вручную вызвать нужный метод, в вашем случае - (void) initFacebook, в - (void) fbDidLogin FBSessionDelegate.
Кроме того, чтобы сделать это более общим, я сделал небольшой трюк после [facebook authorize: nil]; Я установил ожидающую цель и селектор для хранения ожидающей команды, которую необходимо выполнить после входа в систему. Как то так ...
id fbPendingTarget;
SEL fbPendingAction;
if (![delegate.facebook isSessionValid]) {
[delegate.facebook authorize:nil]; // Facebook app or Safari login, mustitask
// Save pending actions
delegate.fbPendingTarget = self;
delegate.fbPendingAction = @selector(facebookButtonPressed);
[self retain]; // *** hold on to self if you will release self and is using fbPendingTarget as self
}
и когда делегат увольняется, он выполняет ожидающее действие ...
- (void)fbDidLogin {
[self storeAuthData:[facebook accessToken] expiresAt:[facebook expirationDate]];
[self apiFQLIMe]; // request user info
// perform any pending actions after login
if ([fbPendingTarget respondsToSelector:fbPendingAction]) {
[fbPendingTarget performSelector:fbPendingAction];
}
self.fbPendingTarget = nil;
self.fbPendingAction = nil;
[self release]; // *** let go of self after we finished everything
}
Это поможет выполнить любые ожидающие действия, которые вам нужны после входа в систему. И не забудьте очистить их после выполнения или неудачного входа в систему.
-(void)fbDidNotLogin:(BOOL)cancelled {
UIAlertView *alertView = [[[UIAlertView alloc] initWithTitle:@"Cannot Connect"
message:@"There was an error while connecting to Facebook. Please try Again."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil] autorelease];
[alertView show];
self.fbPendingTarget = nil;
self.fbPendingAction = nil;
[self release]; // *** let go of self after we finished everything
}
Надеюсь, это поможет:)
Редактировать: Я считаю, что лучше установить fbPendingTarget
для какого-либо объекта, который существует в течение всего времени жизни приложения (например, appDelegate
), чем для установки self
. Это потому, что во многих случаях ваш self
является представлением, которое будет опубликовано сразу после того, как пользователь отправит сообщение в Facebook. Отправка сообщения освобожденному объекту приведет к сбою вашего приложения.
Грязный способ обойти это - явно использовать [self retain]
перед отправкой, а затем [self release]
в вашем fbPendingAction
. Но это сохранило бы все остальное, что должно было быть выпущено в себе к тому времени. Мне просто легче установить значение appDelegate
, поскольку большинство действий, которые вы будете выполнять, - это просто отображать предупреждение. Я буду редактировать код только ради безопасности.