Когда я должен возобновить ACAccount? Или, как проверить, истек ли срок действия учетных данных. (Facebook)

Недавно мне было поручено опросить, как использовать iOS Framework ACAccount и Social для реализации функции публикации в Facebook. Получить доступ к учетной записи, настроенной в настройке, довольно просто.

if(!_accountStore)
    _accountStore = [[ACAccountStore alloc] init];

ACAccountType *facebookTypeAccount = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

// Check if there is any faceboook account
NSArray *accounts = [_accountStore accountsWithAccountType:facebookTypeAccount];
if (![accounts count]) {
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"alert" message:@"No facebook account configured in setting." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    return;
}

[_accountStore requestAccessToAccountsWithType:facebookTypeAccount
                                       options:@{ACFacebookAppIdKey: @"FACEBOOK-APP-ID", ACFacebookPermissionsKey: @[@"email"]}
                                    completion:^(BOOL granted, NSError *error) {
                                        if(granted){
                                            NSArray *accounts = [_accountStore accountsWithAccountType:facebookTypeAccount];
                                            _facebookAccount = [accounts lastObject];
                                            NSLog(@"Success");
                                        }else{
                                            // ouch
                                            NSLog(@"Failed, Error: %@", error);
                                            dispatch_async(dispatch_get_main_queue(), ^{
                                                NSString *message = [NSString stringWithFormat:@"App access denied, please grant access in Setting->Facebook. Error message::%@", error];
                                                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                                                [alert show];
                                            });
                                        }
                                    }];

Как только приложение получит доступ к Facebook, оно может отправить сообщение с помощью SLComposeViewController:

- (IBAction)postButtonPressed:(id)sender {
if (!_facebookAccount) {
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"alert" message:@"login first" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    return;
}

SLComposeViewController *fbController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];

if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
    SLComposeViewControllerCompletionHandler __block completionHandler=^(SLComposeViewControllerResult result){

        [fbController dismissViewControllerAnimated:YES completion:nil];

        switch(result){
            case SLComposeViewControllerResultCancelled:
            default:
            {
                NSLog(@"Cancelled.....");

            }
                break;
            case SLComposeViewControllerResultDone:
            {
                NSLog(@"Posted....");
            }
                break;
        }};

    [fbController setInitialText:@"Test message"];
    [fbController setCompletionHandler:completionHandler];
    [self presentViewController:fbController animated:YES completion:nil];
} else {
    NSLog(@"no facebook setup");
}

Здесь возникает мой вопрос. Я обнаружил, что в ACAccountStore есть метод, который используется для обновления учетных данных ACAccount с истекшим сроком действия:

- (void)renewCredentialsForAccount:(ACAccount *)account completion:(ACAccountStoreCredentialRenewalHandler)completionHandler;

Но я даже не знаю, как проверить, истек ли срок действия учетных данных, чтобы я мог продлить его. Кто-нибудь получил представление об этом?

О, кстати, мы просто хотим использовать нативную социальную среду, чтобы выполнять простую работу, такую ​​как публикация некоторого сообщения или рисунка. Так что, если не нужно, мы не будем использовать Facebook SDK.

Если вы знаете что-либо о том, как проверить учетные данные, действительны или нет, пожалуйста, оставьте комментарий или отправьте ответ, спасибо:)

Обновления 2013.11.20 11:10

Я изучаю кое-что из моих экспериментов к этой проблеме..

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

  2. Обновление уведомления вызывается, когда приложение, использующее ACAccount, находится в фоновом режиме после изменения учетной записи Facebook. В настоящее время я видел только изменения прав доступа запускает уведомление.

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

Я думаю, что мониторных уведомлений об изменении учетной записи достаточно для обработки изменений. Я приму первый ответ.

2 ответа

Решение

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

Йо может знать, что вы находитесь в этом сценарии, используя следующее уведомление:

ACAccountStoreDidChangeNotification

Я не думаю, что есть активный способ, лучше всего написать функцию refresh и вызвать renewCredentialsForAccount платформы

Другие вопросы по тегам