Acceda a la línea de time de usuario de Twitter utilizando Fabric SDK iOS

Estoy tratando de luchar con este problema por dos días. Estoy usando el Kit de SDK y Rest de Tela, intentando jugar con diferentes web services de Rest API para Twitter. Puedo iniciar session correctamente usando TWTRLogInButton tiene object de session con authTokenSecret , authToken y otros valores. Cuando trato de get la escala de time del usuario, siempre obtengo respuesta de falla a cambio como:

{"errors":[{"code":215,"message":"Bad Authentication data. " {"errors":[{"code":215,"message":"Bad Authentication data. }]}

El logging completo de errores es:

 E restkit.network:RKObjectRequestOperation.m:297 Object request failed: Underlying HTTP request operation failed with error: Error Domain=org.restkit.RestKit.ErrorDomain Code=-1011 "Expected status code in (200-299), got 400" UserInfo=0x1780f6f80 {NSLocalizedRecoverySuggestion={"errors":[{"code":215,"message":"Bad Authentication data."}]}, NSErrorFailingURLKey=https://api.twitter.com/1.1/statuses/user_timeline.json?user_id=3116882322&count=2&screen_name=ann_10p, AFNetworkingOperationFailingURLRequestErrorKey=<NSMutableURLRequest: 0x178202740> { URL: https://api.twitter.com/1.1/statuses/user_timeline.json?user_id=3116882322&count=2&screen_name=ann_10p }, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x1702271e0> { URL: https://api.twitter.com/1.1/statuses/user_timeline.json?user_id=3116882322&count=2&screen_name=ann_10p } { status code: 400, headers { "Content-Encoding" = gzip; "Content-Length" = 87; "Content-Type" = "application/json;charset=utf-8"; Date = "Wed, 01 Apr 2015 09:46:42 GMT"; Server = "tsa_a"; "Strict-Transport-Security" = "max-age=631138519"; "x-connection-hash" = 4c123a59a023cd86b2e9a3e9fc84cd7b; "x-response-time" = 4; } }, NSLocalizedDescription=Expected status code in (200-299), got 400} 2015-04-01 14:47:13.223 TwitterIntegration[1086:60b] I restkit.network:RKHTTPRequestOperation.m:154 GET 'https://api.twitter.com/1.1/statuses/user_timeline.json?user_id=3116882322&count=2&screen_name=ann_10p' 2015-04-01 14:47:13.225 TwitterIntegration[1086:60b] E restkit.network:RKHTTPRequestOperation.m:178 GET 'https://api.twitter.com/1.1/statuses/user_timeline.json?user_id=3116882322&count=2&screen_name=ann_10p' (400 Bad Request) [0.0013 s]: Error Domain=org.restkit.RestKit.ErrorDomain Code=-1011 "Expected status code in (200-299), got 400" UserInfo=0x1780f6f80 {NSLocalizedRecoverySuggestion={"errors":[{"code":215,"message":"Bad Authentication data."}]}, NSErrorFailingURLKey=https://api.twitter.com/1.1/statuses/user_timeline.json?user_id=3116882322&count=2&screen_name=ann_10p, AFNetworkingOperationFailingURLRequestErrorKey=<NSMutableURLRequest: 0x178202740> { URL: https://api.twitter.com/1.1/statuses/user_timeline.json?user_id=3116882322&count=2&screen_name=ann_10p }, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x1702271e0> { URL: https://api.twitter.com/1.1/statuses/user_timeline.json?user_id=3116882322&count=2&screen_name=ann_10p } { status code: 400, headers { "Content-Encoding" = gzip; "Content-Length" = 87; "Content-Type" = "application/json;charset=utf-8"; Date = "Wed, 01 Apr 2015 09:46:42 GMT"; Server = "tsa_a"; "Strict-Transport-Security" = "max-age=631138519"; "x-connection-hash" = 4c123a59a023cd86b2e9a3e9fc84cd7b; "x-response-time" = 4; } }, NSLocalizedDescription=Expected status code in (200-299), got 400} 

Código:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self addLoginButton]; } -(void) addLoginButton { TWTRLogInButton *logInButton = [TWTRLogInButton buttonWithLogInCompletion:^(TWTRSession *session, NSError *error) { // play with Twitter session if(session) { NSLog(@"logged in success! with session : %@", session); [Global shanetworkingInstance].session = session; [self requestUserTimeline]; } else { NSLog(@"session is null"); } }]; logInButton.center = self.view.center; [self.view addSubview:logInButton]; } -(void) requestUserTimeline { RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[UserTimeline class]]; [mapping addAttributeMappingsFromDictionary:@{ @"text": @"tweetText", @"favorited": @"favourited", @"created_at": @"createdAt", @"user.name": @"name", @"id": @"tweetID", @"user.profile_image_url": @"profileImageURL" }]; NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:nil keyPath:nil statusCodes:statusCodes]; NSString *params = [NSString stringWithFormat:@"?user_id=3116882322&count=2&screen_name=ann_10p",[Global shanetworkingInstance].session.userID,[Global shanetworkingInstance].session.userName]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[@"https://api.twitter.com/1.1/statuses/user_timeline.json" stringByAppendingString:params]]]; [request setHTTPMethod:@"GET"]; RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) { UserTimeline *timeline = [result firstObject]; NSLog(@"Mapped the article: %@", timeline); } failure:^(RKObjectRequestOperation *operation, NSError *error) { NSLog(@"Failed with error: %@", [error localizedDescription]); }]; [operation start]; } 

Por favor, ayúdame a depurar este problema. Gracias.

Después de experimentar con Fabric SDK, tuve éxito en su integración. Llegué con algunas conclusiones y quiero compartir con ustedes.

1) La primera vez que inicia session en Twitter con éxito, se creó una session de TWTRSession para el usuario. Dura incluso después de cerrar la aplicación y volver a abrirla.

2) Si la session ya se ha creado para usted e intenta iniciar session para get otro object de session sin cerrar session , se devolverá el error de authentication.

3) Puede verificar si la session existe o no:

 if([[Twitter shanetworkingInstance] session]) { NSLog(@"session already present!!!"); NSLog(@"signed in as %@", [[[Twitter shanetworkingInstance] session] userName]); } else { NSLog(@"you need to login!!"); } 

4) Recomendare iniciar session usando

[[Twitter shanetworkingInstance] logInWithCompletion:^(TWTRSession *session, NSError *error)];

en lugar de:

[TWTRLogInButton buttonWithLogInCompletion:^(TWTRSession *session, NSError *error)];

Utilice el button de inicio de session de Twitter solo, cuando esté seguro de que no existe session actualmente.

5) Si la authentication de Twitter realmente te fastidia, desinstala la aplicación y testing con la installation nueva. ¡Esta es la última solución!

6) Para cerrar session de la session, use [[Twitter shanetworkingInstance] logOut];

Parte codificante:

Estoy asumiendo que ya has seguido todos los pasos de la aplicación fabric mac.

Primer usuario de inicio de session, luego haga una request de línea de time.

 -(void) loginUserToTwitter { if([[Twitter shanetworkingInstance] session]) { NSLog(@"session already present!!!"); NSLog(@"signed in as %@", [[[Twitter shanetworkingInstance] session] userName]); [self getUserTimeline]; } else { NSLog(@"session not found. Make new request!"); [[Twitter shanetworkingInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) { if(error) NSLog(@"error occurnetworking... %@",error.localizedDescription); else { NSLog(@"Successfully logged in with session :%@",session); [self getUserTimeline]; } }]; } } -(void) getUserTimeline { NSURLRequest *request = [[[Twitter shanetworkingInstance] APIClient] URLRequestWithMethod:@"GET" URL:@"https://api.twitter.com/1.1/statuses/user_timeline.json" parameters:@{@"userid": [Twitter shanetworkingInstance].session.userID, @"count" : @"5", @"screen_name" : [Twitter shanetworkingInstance].session.userName} error:nil]; NSURLResponse *response; NSError *error; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if(!data) { NSLog(@"error....: %@",error.localizedDescription); } else { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",string); [twitterResponse removeAllObjects]; NSArray *arrayRep = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; twitterResponse = [NSMutableArray arrayWithArray:[TWTRTweet tweetsWithJSONArray:arrayRep]]; [_tableView reloadData]; } } 

Preferiré el método de Twitter SDK para extraer los tweets utilizando [TWTRTweet tweetsWithJSONArray:arrayRep] lugar de Restkit . Las cosas serán realmente fáciles de manejar aquí.

Mostrar Tweets en el estilo estándar de Twitter:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // Setup tableview self.tableView.estimatedRowHeight = 150; self.tableView.rowHeight = UITableViewAutomaticDimension; // Explicitly set on iOS 8 if using automatic row height calculation self.tableView.allowsSelection = NO; [self.tableView registerClass:[TWTRTweetTableViewCell class] forCellReuseIdentifier:@"TweetCell"]; } #pragma mark - Tableview Methods - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return twitterResponse.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellID = @"TweetCell"; TWTRTweetTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath]; TWTRTweet *tweet = twitterResponse[indexPath.row]; [cell configureWithTweet:tweet]; return cell; } // Calculate the height of each row. Must to implement - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { TWTRTweet *tweet = twitterResponse[indexPath.row]; return [TWTRTweetTableViewCell heightForTweet:tweet width:CGRectGetWidth(self.view.bounds)]; } 

Nota:

Descarga Fabric SDK desde aquí . Deberá ingresar la dirección de correo electrónico. Le enviarán un enlace por correo electrónico para download, debe seguir algunos pasos. La aplicación Fabric Mac le permitirá configurar completamente el proyecto xcode.

¡Espero eso ayude!

Referencias:

Twitter Login

Mostrar Tweets

Proyecto de muestra Cannonball

https://github.com/fhsjaagshs/FHSTwitterEngine

intenta con este FHSTTwitterEngine funciona bien

Puede mostrar una línea de time de usuario directamente. No es necesario manejar el inicio de session u otras llamadas de networking directamente. Esto gestionará automáticamente Guest Auth , y luego cargará los Tweets iniciales y también se UITableView más cuando se scope el final de UITableView :

 class UserTimelineViewController: TWTRTimelineViewController, TWTRTweetViewDelegate { convenience init() { // Set up the User Timeline let dataSource = TWTRUserTimelineDataSource(screenName: "TomCruise", APIClient: TWTRAPIClient()) // Set the data source (will automatically load Tweets in `viewWillAppear` self.init(dataSource: dataSource) // Update the title displayed in the Navigation bar self.title = "@\(dataSource.screenName)" } func tweetView(tweetView: TWTRTweetView, didSelectTweet tweet: TWTRTweet) { // Log a message when a cell is tapped print("Selected tweet with ID: \(tweet.tweetID)") } }