我应该在什么时候续订ACAccount?或者,如何检查凭证是否过期。 (Facebook)的

时间:2013-11-19 07:26:12

标签: ios facebook ios6 acaccount

最近我被分配到调查如何使用iOS框架ACAccount和Social来实现facebook post功能。访问设置中配置的帐户非常简单。

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 AM

我从这个问题的实验中学到了一些东西..

  1. 在获得访问权限之前,我无法从帐户存储中获取某些类型的帐户,因此在请求访问之前我不应该检查帐户计数。

  2. 在Facebook帐户更改后,使用ACAccount的应用在后台时调用的续订通知。目前,我只看到访问权限的更改会触发通知。

  3. 如果用户更改密码,系统会在用户尝试发布内容时弹出警告,要求用户更改密码。

  4. 我认为帐户更改的监控通知足以处理更改。我会接受第一个答案。

2 个答案:

答案 0 :(得分:2)

每次不同步时,您都应该续订用户acc。如果用户更改了密码或acc会话已过期,则可能会发生这种情况。

你可以使用以下通知知道你在那个场景中:

ACAccountStoreDidChangeNotification

答案 1 :(得分:0)

我认为没有主动方式,最好是写更新功能和通话 renewCredentialsForAccount框架