2

最近被指派调查如何使用iOS框架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;

但我什至不知道如何检查凭证是否过期,以便我可以更新它。有人对此有所了解吗?

哦,对了,我们只是想使用原生的Social框架来做一些简单的工作,比如发布一些消息或图片。因此,如果不需要,我们不会使用 facebook SDK。

如果您知道如何检查凭证是否有效,请发表评论或提交答案,谢谢:)

更新 2013.11.20 11:10 AM

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

  1. 一个人在获得访问权限之前无法从帐户商店获取某些类型的帐户,因此我不应该在请求访问之前检查帐户数量。

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

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

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

4

2 回答 2

2

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

您可以使用以下通知知道您处于该场景中:

ACAccountStoreDidChangeNotification

于 2013-11-19T08:11:17.993 回答
0

我认为没有积极的方式,最好是编写更新函数并调用框架的 renewCredentialsForAccount

于 2013-11-20T04:01:43.770 回答