iOS 5 Twitter Framework: Tweeting without user input and confirmation (modal view controller)

前端 未结 4 1098
鱼传尺愫
鱼传尺愫 2020-11-27 17:18

Essentially what I want is for the app, once the user has allowed access to their Twitter account, to be able to tweet whatever the user has selected in a UITableView<

相关标签:
4条回答
  • 2020-11-27 17:41

    It's definitely possible to tweet without it, the following is in production iOS 5 apps. It even takes the user to the requisite section of preferences if they haven't registered an account.

    - (void)postToTwitter
    {
        // Create an account store object.
        ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    
        // Create an account type that ensures Twitter accounts are retrieved.
        ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    
        // Request access from the user to use their Twitter accounts.
        [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
            if(granted) {
                // Get the list of Twitter accounts.
                NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];
    
    
                if ([accountsArray count] > 0) {
                    // Grab the initial Twitter account to tweet from.
                    ACAccount *twitterAccount = [accountsArray objectAtIndex:0];
                    TWRequest *postRequest = nil;
    
                    postRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://api.twitter.com/1/statuses/update.json"] parameters:[NSDictionary dictionaryWithObject:[self stringToPost] forKey:@"status"] requestMethod:TWRequestMethodPOST];
    
    
    
                    // Set the account used to post the tweet.
                    [postRequest setAccount:twitterAccount];
    
                    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
                        [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                            dispatch_async(dispatch_get_main_queue(), ^(void) {
                                if ([urlResponse statusCode] == 200) {
                                    Alert(0, nil, @"Tweet Successful", @"Ok", nil);
                                }else {
    
                                    Alert(0, nil, @"Tweet failed", @"Ok", nil);
                                }
                            });
                        }];
                    });
    
                }
                else
                {
                    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=TWITTER"]];
                }
            }
        }];
    }
    
    0 讨论(0)
  • 2020-11-27 17:41

    This would be an updated version using SLRequest instead of TWRequest, which was deprecated in iOS 6. Note this needs the Social and Accounts framework to be added to your project...

    - (void) postToTwitterInBackground {
    
        // Create an account store object.
        ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    
        // Create an account type that ensures Twitter accounts are retrieved.
        ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    
        // Request access from the user to use their Twitter accounts.
        [accountStore requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
            if(granted) {
                // Get the list of Twitter accounts.
                NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];
    
                if ([accountsArray count] > 0) {
                    // Grab the initial Twitter account to tweet from.
                    ACAccount *twitterAccount = [accountsArray objectAtIndex:0];
                    SLRequest *postRequest = nil;
    
                    // Post Text
                    NSDictionary *message = @{@"status": @"Tweeting from my iOS app!"};
    
                    // URL
                    NSURL *requestURL = [NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update.json"];
    
                    // Request
                    postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:requestURL parameters:message];
    
                    // Set Account
                    postRequest.account = twitterAccount;
    
                    // Post
                    [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                         NSLog(@"Twitter HTTP response: %i", [urlResponse statusCode]);
                     }];
    
                }
            }
        }];
    
    }
    
    0 讨论(0)
  • 2020-11-27 17:55

    The accepted answer is no longer valid due to several changes. This one works with iOS 10, Swift 3, and version 1.1 of Twitter's API.

    ** UPDATE **

    This answer has been updated as the previous one relied upon a deprecated Twitter endpoint.

    import Social
    import Accounts
    
    func postToTwitter() {
        let accountStore = ACAccountStore()
        let accountType = accountStore.accountType(withAccountTypeIdentifier: ACAccountTypeIdentifierTwitter)
    
        accountStore.requestAccessToAccounts(with: accountType, options: nil) { (granted, error) in
            if granted, let accounts = accountStore.accounts(with: accountType) {
                // This will default to the first account if they have more than one
    
                if let account = accounts.first as? ACAccount {
                    let requestURL = URL(string: "https://api.twitter.com/1.1/statuses/update.json")
                    let parameters = ["status" : "Tweet tweet"]
                    guard let request = SLRequest(forServiceType: SLServiceTypeTwitter, requestMethod: .POST, url: requestURL, parameters: parameters) else { return }
                    request.account = account
                    request.perform(handler: { (data, response, error) in
                        // Check to see if tweet was successful
                    })
                } else {
                    // User does not have an available Twitter account
                }
            }
        }
    }
    

    This is the API that is being used.

    0 讨论(0)
  • 2020-11-27 17:59

    Update: The TwitterKit in Fabric by Twitter is quite handy and if you aim to post from your Twitter app when the user tries to Tweet in your app then it might be a good option to consider.

    (YES, this method will allow you to post to twitter without any dialog box or confirmation).

    The TwitterKit will handle the permissions part and using the TWTRAPIClient we perform the tweet through the Twitter rest APIs.

     //Needs to performed once in order to get permissions from the user to post via your twitter app.
    [[Twitter sharedInstance]logInWithCompletion:^(TWTRSession *session, NSError *error) {
        //Session details can be obtained here
        //Get an instance of the TWTRAPIClient from the Twitter shared instance. (This is created using the credentials which was used to initialize twitter, the first time) 
        TWTRAPIClient *client = [[Twitter sharedInstance]APIClient];
    
        //Build the request that you want to launch using the API and the text to be tweeted.
        NSURLRequest *tweetRequest = [client URLRequestWithMethod:@"POST" URL:@"https://api.twitter.com/1.1/statuses/update.json" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"TEXT TO BE TWEETED", @"status", nil] error:&error];
    
       //Perform this whenever you need to perform the tweet (REST API call)
       [client sendTwitterRequest:tweetRequest completion:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
       //Check for the response and update UI according if necessary.            
       }];
    }];
    

    Hope this helps.

    0 讨论(0)
提交回复
热议问题