Twitter iOS Streaming API:未收到任何数据

我正在尝试修改Apple的示例代码以使用Twitter API,以便我可以使用流API来过滤推文。 我正在尝试实施针对此问题建议的方法:

TWRequest是否适用于twitter流API?

我按照建议创建了签名的NSURLRequest和NSURLConnection对象,并设置了连接对象的委托。 选择有效的Twitter帐户并用于对URL进行签名。 问题是委托连接:didReceiveData:方法永远不会被调用。

这是我的代码:

@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"); } 

该计划的输出是:

 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 

正如您所看到的,一切似乎都可以正常工作,唯一的问题是委托方法永远不会被调用,我目前不知道为什么。

任何帮助将非常感激…

麦克风

我花了一些时间来启动并运行,所以我认为我应该为其他人发布我的代码。 在我的情况下,我试图让推文靠近某个位置,所以你会看到我使用了locations参数和我在范围内的位置结构。 你可以在params字典中添加你想要的任何参数。

另请注意,这很简单,您需要做一些事情,例如通知用户未找到帐户,并允许用户选择他们想要使用的Twitter帐户(如果存在多个帐户)。

快乐流媒体!

 //First, we need to obtain the account instance for the user's 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) }];