有没有适用于Twitter的Firebase iOS简单登录示例?

3
我在Simple Login iOS快速启动指南中遇到了以下问题:由于一个设备可能绑定多个Twitter账户,您需要提供一个代码块来确定要登录哪个账户。请在下方用您自己的代码替换"[yourApp selectUserName:usernames]"以从用户名列表中进行选择。所提供的代码如下:
[authClient loginToTwitterAppWithId:@"YOUR_CONSUMER_KEY"
multipleAccountsHandler:^int(NSArray *usernames) {

// If you do not wish to authenticate with any of these usernames, return NSNotFound.
return [yourApp selectUserName:usernames];
} withCompletionBlock:^(NSError *error, FAUser *user) {
    if (error != nil) {
        // There was an error authenticating
    } else {
        // We have an authenticated Twitter user
    }
}];

是否最好使用UIActionSheet来让用户选择要使用哪个帐户?该如何实现?

2个回答

1
#import <Twitter/Twitter.h>
#import <Accounts/Accounts.h>

登录:

  ACAccountStore *accountStore = [[ACAccountStore alloc] init];

// Create an account type that ensures Twitter accounts are retrieved.
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
[accountStore requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {


    // Request access from the user to use their Twitter accounts.
    //    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {

    //NSLog(@"%@",error);
    if(granted) {

        // Get the list of Twitter accounts.
        NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];
        //NSLog(@"%@",accountsArray);
        twitterAccountsArray=[accountsArray mutableCopy];



        if ([twitterAccountsArray count] > 0){
            sheet = [[UIActionSheet alloc] initWithTitle:@"Choose an Account" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
            for (ACAccount *acct in twitterAccountsArray) {
                [sheet addButtonWithTitle:acct.username];
            }




        }

    }

    else{
        dispatch_async(dispatch_get_main_queue(), ^{
            //NSLog(@"%@",error);

            if (![error.localizedDescription isEqual:[NSNull null]] &&[error.localizedDescription isEqualToString:@"No access plugin was found that supports the account type com.apple.twitter"]) {



            }
            else


            [Utility showAlertWithString:@"We could not find any Twitter account on the device"];

        });
    }

}];

它将打开一个操作表,其中会显示您的设备拥有的帐户列表。
对于发布:
在您的iPhone设备上必须添加至少一个有效的Twitter帐户。
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])
{

  NSString *initialText=@"Text to be posted";


    SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];

    tweetSheet.completionHandler = ^(SLComposeViewControllerResult result) {


        switch(result) {
                //  This means the user cancelled without sending the Tweet
        case SLComposeViewControllerResultCancelled:{

        }
        break;

        case SLComposeViewControllerResultDone:{



    }
                break;
    }

    };
    [tweetSheet setInitialText:initialText];
    if (initialText) {


        [self presentViewController:tweetSheet animated:YES completion:nil];

    }

}

不幸的是,最新的iOS 8测试版似乎无法正常工作。苹果已经弃用UIActionSheet,转而使用UIAlertViewController。 - dlanmaar

0

我发现一个使用Awesome Chat的代码来完成这个目标的好例子。它使用了一个 UIActionSheet,就像我一开始尝试的那样。

//-------------------------------------------------------------------------------------------------------------------------------------------------
- (IBAction)actionTwitter:(id)sender
//-------------------------------------------------------------------------------------------------------------------------------------------------
{
    [ProgressHUD show:@"In progress..." Interaction:NO];
    //---------------------------------------------------------------------------------------------------------------------------------------------
    selected = 0;
    //---------------------------------------------------------------------------------------------------------------------------------------------
    ACAccountStore *account = [[ACAccountStore alloc] init];
    ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    //---------------------------------------------------------------------------------------------------------------------------------------------
    [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error)
    {
        if (granted)
        {
            accounts = [account accountsWithAccountType:accountType];
            //-------------------------------------------------------------------------------------------------------------------------------------
            if ([accounts count] == 0)
                [self performSelectorOnMainThread:@selector(showError:) withObject:@"No Twitter account was found" waitUntilDone:NO];
            //-------------------------------------------------------------------------------------------------------------------------------------
            if ([accounts count] == 1)  [self performSelectorOnMainThread:@selector(loginTwitter) withObject:nil waitUntilDone:NO];
            if ([accounts count] >= 2)  [self performSelectorOnMainThread:@selector(selectTwitter) withObject:nil waitUntilDone:NO];
        }
        else [self performSelectorOnMainThread:@selector(showError:) withObject:@"Access to Twitter account was not granted" waitUntilDone:NO];
    }];
}

//-------------------------------------------------------------------------------------------------------------------------------------------------
- (void)selectTwitter
//-------------------------------------------------------------------------------------------------------------------------------------------------
{
    UIActionSheet *action = [[UIActionSheet alloc] initWithTitle:@"Choose Twitter account" delegate:self cancelButtonTitle:nil
                                          destructiveButtonTitle:nil otherButtonTitles:nil];
    //---------------------------------------------------------------------------------------------------------------------------------------------
    for (NSInteger i=0; i<[accounts count]; i++)
    {
        ACAccount *account = [accounts objectAtIndex:i];
        [action addButtonWithTitle:account.username];
    }
    //---------------------------------------------------------------------------------------------------------------------------------------------
    [action addButtonWithTitle:@"Cancel"];
    action.cancelButtonIndex = accounts.count;
    [action showInView:self.view];
}

//-------------------------------------------------------------------------------------------------------------------------------------------------
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
//-------------------------------------------------------------------------------------------------------------------------------------------------
{
    if (buttonIndex != actionSheet.cancelButtonIndex)
    {
        selected = buttonIndex;
        [self loginTwitter];
    }
    else [ProgressHUD dismiss];
}

//-------------------------------------------------------------------------------------------------------------------------------------------------
- (void)loginTwitter
//-------------------------------------------------------------------------------------------------------------------------------------------------
{
    Firebase *ref = [[Firebase alloc] initWithUrl:FIREBASE];
    FirebaseSimpleLogin *authClient = [[FirebaseSimpleLogin alloc] initWithRef:ref];
    //---------------------------------------------------------------------------------------------------------------------------------------------
    [authClient loginToTwitterAppWithId:TWITTER_KEY multipleAccountsHandler:^int(NSArray *usernames)
    {
        return (int) selected;
    }
    withCompletionBlock:^(NSError *error, FAUser *user)
    {
        if (error == nil)
        {
            if (user != nil) [delegate didFinishLogin:ParseUserData(user.thirdPartyUserData)];
            [self dismissViewControllerAnimated:YES completion:^{ [ProgressHUD dismiss]; }];
        }
        else
        {
            NSString *message = [error.userInfo valueForKey:@"NSLocalizedDescription"];
            [self performSelectorOnMainThread:@selector(showError:) withObject:message waitUntilDone:NO];
        }
    }];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接