Twitter iOS Streaming API: Data Not Accepted

I am trying to modify a sample Apple code to use the Twitter API so that I can use the streaming API to filter tweets. I am trying to implement the method proposed in response to this question:

Does TWRequest work for twitter streaming?

I created the signed objects NSURLRequest and NSURLConnection, as suggested, and assigned a delegate to the connection object. A valid twitter account is selected and used to sign the URL. The problem is that connecting delegates: the didReceiveData: method is never called.

Here is my code:

@implementation Twitter -(id)init{ if (self=[super init]) { NSLog(@"Twitter init"); // Tell the notification centre to inform the app if the twitter account changes [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(twitterAccountChanged) name:ACAccountStoreDidChangeNotification object:nil]; // 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) { NSLog(@"Twitter: Access to twitter accounts granted"); // Get the list of Twitter accounts. NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; // Pick the twitter account to use if ([accountsArray count] > 0) { // Grab the initial Twitter account to tweet from. ACAccount *twitterAccount = [accountsArray objectAtIndex:0]; // This is for a status filter NSURL *url=[NSURL URLWithString:@"https://stream.twitter.com/1/statuses/filter.json"]; // Create the parameters dictionary NSDictionary *dictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"twitter", @"track", nil]; // Create TWRequest object TWRequest *req=[[TWRequest alloc] initWithURL:url parameters:dictionary requestMethod:TWRequestMethodPOST]; // Set the account [req setAccount:twitterAccount]; // Get a signed URL request NSURLRequest *signedRequest=[req signedURLRequest]; // Initate the connection [NSURLConnection connectionWithRequest:signedRequest delegate:self]; } else { NSLog(@"Twitter: No twitter accounts to access"); } } else { NSLog(@"Twitter: Access to twitter accounts denied"); } }]; return self; } return nil; } -(void)twitterAccountChanged{ NSLog(@"Twitter twitterAccountChanged"); } -(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ NSLog(@"data received"); } 

Exit the program:

 2012-07-24 09:50:03.668 TwitterAPITest[36722:10403] Twitter init 2012-07-24 09:50:03.836 TwitterAPITest[36722:11d03] Twitter: Access to twitter accounts granted 

As you can see, everything is working fine, the only problem is that the delegate method is never called, and currently I have no idea why.

Any help would be greatly appreciated ...

Mike

+2
source share
1 answer

It took me a while to get this to work, so I thought I should post my code to others. In my case, I tried to get tweets in a specific place, so you will see that I used the locations parameter and the location structure that I had in scope. You can add any parameters you want to the params dictionary.

Also note that these are bare bones, and you will want to do things like notifying the user that the account was not found, and allowing the user to select the Twitter account that they would like to use if there are multiple accounts.

Happy streams!

 //First, we need to obtain the account instance for the user Twitter account ACAccountStore *store = [[ACAccountStore alloc] init]; ACAccountType *twitterAccountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; // Request permission from the user to access the available Twitter accounts [store requestAccessToAccountsWithType:twitterAccountType withCompletionHandler:^(BOOL granted, NSError *error) { if (!granted) { // The user rejected your request NSLog(@"User rejected access to the account."); } else { // Grab the available accounts NSArray *twitterAccounts = [store accountsWithAccountType:twitterAccountType]; if ([twitterAccounts count] > 0) { // Use the first account for simplicity ACAccount *account = [twitterAccounts objectAtIndex:0]; NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; [params setObject:@"1" forKey:@"include_entities"]; [params setObject:location forKey:@"locations"]; [params setObject:@"true" forKey:@"stall_warnings"]; //set any other criteria to track //params setObject:@"words, to, track" forKey@ "track"]; // The endpoint that we wish to call NSURL *url = [NSURL URLWithString:@"https://stream.twitter.com/1.1/statuses/filter.json"]; // Build the request with our parameter TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:params requestMethod:TWRequestMethodPOST]; // Attach the account object to this request [request setAccount:account]; NSURLRequest *signedReq = request.signedURLRequest; // make the connection, ensuring that it is made on the main runloop self.twitterConnection = [[NSURLConnection alloc] initWithRequest:signedReq delegate:self startImmediately: NO]; [self.twitterConnection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [self.twitterConnection start]; } // if ([twitterAccounts count] > 0) } // if (granted) }]; 
+1
source

Source: https://habr.com/ru/post/1387089/


All Articles