2

ストリーミング API を使用してツイートをフィルタリングできるように、Twitter API を使用するための Apple のサンプル コードを変更しようとしています。この質問に応じて提案された方法を実装しようとしています:

TWRequest は Twitter ストリーミング API で機能しますか?

署名された NSURLRequest および NSURLConnection オブジェクトを提案どおりに作成し、接続オブジェクトのデリゲートを設定しました。有効な Twitter アカウントが選択され、URL の署名に使用されます。問題は、デリゲートの connection: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

ご覧のとおり、すべて正常に動作しているように見えますが、唯一の問題はデリゲート メソッドが呼び出されないことであり、現時点ではその理由がわかりません。

どんな助けでも大歓迎です...

マイク

4

1 に答える 1

1

これを起動して実行するのに少し時間がかかったので、他の人のために自分のコードを投稿する必要があると思いました. 私の場合、特定の場所に近いツイートを取得しようとして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) 
                 }];
于 2012-09-18T21:32:11.390 に答える