Я использую FBConnect SDK для публикации сообщений в профиле пользователя через мое приложение. У меня есть ряд проблем с этим:
Когда соответствующий код запускается на устройстве в первый раз, пользователь перенаправляется по желанию на приложение / веб-сайт Facebook, который просит его авторизовать его. если пользователь авторизует его, он возвращается обратно в приложение, которое открывает контроллер представления «Connect to facebook», который просит пользователя войти в систему. Это странно, поскольку пользователь уже вошел в систему, иначе как он мог авторизовать приложение ? но я думаю, что это может быть хорошо, так как он еще не вошел через приложение. после того, как он входит в систему, он ничего не делает. только во второй раз код запускается, после того как он авторизовал приложение, пользователь получает диалог публикации.
Если пользователь не авторизовал приложение, когда оно возвращается в мое приложение после диалога авторизации, он просит пользователя войти в систему (как если бы он авторизовался) и ничего не делает после того, как он вошел в систему. Только во второй раз код запускается, открывается диалоговое окно авторизации с опциями «Авторизовать» и «Выйти из приложения» вместо «Авторизовать» и «Не авторизовать» / «Разрешить» и «Не разрешать».
Кроме того, если пользователь удалил свою авторизацию через настройки своей учетной записи на Facebook, вместо того, чтобы просто попросить его повторно авторизовать его, появится диалоговое окно facebook (вместо диалога публикации / авторизации), говорящее: «Ошибка произошло. Пожалуйста, попробуйте позже. " Попытка позже не поможет. он будет появляться всегда, даже если вы перезапустите приложение. Единственный способ сделать это - переустановить приложение, после чего оно снова откроет диалоговое окно авторизации.
Вот чего я хочу достичь:
- После того, как пользователь авторизует приложение, ему больше не нужно будет входить в систему.
- После того, как пользователь авторизует приложение, диалоговое окно публикации появится сразу, без необходимости повторного запуска кода (который запускается, между прочим, с помощью кнопки).
- Если пользователь отменяет авторизацию приложения, ему снова будет предложено диалоговое окно авторизации вместо диалогового окна ошибки
- Если он отказался от авторизации, я вызову функцию, которая отображает ошибку / и т. Д.
Вот соответствующий код:
MyViewController.m
- (void)shareOnFacebook
{
Facebook *facebook = [[Facebook alloc] initWithAppId:myAppID];
[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] setFacebook:facebook];
[facebook release];
facebook = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] facebook];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) {
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
if (![facebook isSessionValid]) {
[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]];
}
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
//Giving the dictionary some parameters for posting defaults
[facebook dialog:@"feed" andParams:dictionary andDelegate:self]; //Note: we have 2 different delegates! appDelegate for connections & url switching, and self for dialogs
}
MyAppDelegate.h
@interface MyAppDelegate : NSObject <UIApplicationDelegate, FBSessionDelegate, FBDialogDelegate>
{
Facebook *facebook; // kept for facebook sharing, accessed only from MyViewController although delegate methods are handeled in here
}
@property (nonatomic, retain) Facebook *facebook;
@end
MyAppDelegate.m
- (void)fbDidLogin
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [self.facebook handleOpenURL:url];
}
Возможно ли, что мне не хватает нескольких функций делегата в MyViewController? Потому что я вижу, по какой-то причине, я пометил его как реализующий протокол FBDialogDelegate, хотя он оттуда не реализует никаких функций.
Я был бы очень рад, если бы вы, ребята, помогли мне, потому что это очень расстраивает меня. Я не мог ничего найти об этом в Интернете, и я чувствую, что я тону здесь.
Tnx заранее!