【问题标题】:Posting tweet with new api (1.1) in iOS在 iOS 中使用新的 api (1.1) 发布推文
【发布时间】:2013-06-16 20:37:59
【问题描述】:

由于 twitter api 已更改,我的应用程序不再发布推文。之前每件事都运行良好,并且根据新的 API,只有请求模式应该改变?初始化引擎的所有其他内容和其余部分应该相同?

并且分享的方法应该修改了,所以我修改了它但得到“Bad Authentication 215”。我从 twitter 本身生成的身份验证标头中获得的所有令牌信息和其他内容:

- (void) shareOnTwitter
{         
    NSString *urlString = [NSString stringWithFormat:@"https://api.twitter.com/1.1/statuses/update.json"];

    NSURL *url = [NSURL URLWithString:urlString];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

    [request setHTTPMethod:@"POST"];

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

    [dict setValue:@"check Check CHECK" forKey:@"status"];

    [dict setValue:@"-- - - - - -" forKey:@"oauth_consumer_key"];

    [dict setValue:@"- - - - - - -" forKey:@"oauth_nonce"];

    [dict setValue:@"- - - - - - -" forKey:@"oauth_signature"];

    [dict setValue:@"HMAC-SHA1" forKey:@"oauth_signature_method"];

    [dict setValue:@"- - - - - - -" forKey:@"oauth_timestamp"];

    [dict setValue:@"- - - - - - -" forKey:@"oauth_token"];

    [dict setValue:@"1.0" forKey:@"oauth_version"];

    NSString *jsonString = [dict JSONRepresentation];

    NSData *jsonData = [NSData dataWithBytes:[jsonString UTF8String] length:jsonString.length];

    [request setHTTPBody:jsonData];

    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

    NSLog(@"My request...%@", jsonString);

    NSData *urlData;

    NSURLResponse *response1;

    NSError *error = nil;

    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response1 error:&error];

    if(error)
    {
        NSLog(@"Error %@",error);
    }

    if(!urlData)
    {
        NSLog(@"No connection!");
    }

    NSString *responseStr = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];

    NSLog(@" Twitter : ... %@", responseStr);
}

【问题讨论】:

    标签: iphone ios twitter-oauth


    【解决方案1】:

    试试下面的代码。它对我有用:

        ACAccountStore *accountStore = [[ACAccountStore alloc] init];
        ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
        [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error)
         {
             if (granted)
             {
                 NSArray *accounts = [accountStore accountsWithAccountType:accountType];
                 if (accounts.count)
                 {
                     NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
                     [dict setValue:@"check Check CHECK" forKey:@"status"];
    
                     NSString *retweetString = [NSString stringWithFormat:@"https://api.twitter.com/1.1/statuses/update.json"];
                     NSURL *retweetURL = [NSURL URLWithString:retweetString];
                     TWRequest *request = [[TWRequest alloc] initWithURL:retweetURL parameters:dict requestMethod:TWRequestMethodPOST];
                     request.account = [accounts objectAtIndex:0];
    
                     [request performRequestWithHandler:^(NSData *responseData1, NSHTTPURLResponse *urlResponse, NSError *error)
                      {
                          if (responseData1)
                          {
                              NSError *error1 = nil;
                              id response = [NSJSONSerialization JSONObjectWithData:responseData1 options:NSJSONReadingMutableLeaves error:&error1];
                          }
                      }];
                 }
             }
    
         }];
    

    【讨论】:

    • ACAccountStore 仅适用于 ios5 及更高版本
    • 你也想要 iOS 4 吗?
    【解决方案2】:

    Twitter 在其新文档中解释了从身份验证到大量琐碎内容的所有内容,但对于以前使用 1.0 api 的应用程序来说,如何发布推文或升级并不容易。

    使其工作的一些更改(适用于 OAuth):

    打开 MGTwitterEngine.m >

    确保宏是这样定义的:

    #define TWITTER_DOMAIN          @"api.twitter.com/1.1"
    #define HTTP_POST_METHOD        @"POST"
    #define TWITTER_SEARCH_DOMAIN   @"search.twitter.com"
    #define DEFAULT_CLIENT_VERSION  @"1.0"
    
    
    #if YAJL_AVAILABLE
        #define API_FORMAT @"xml"
    
        #import "MGTwitterStatusesYAJLParser.h"
        #import "MGTwitterMessagesYAJLParser.h"
        #import "MGTwitterUsersYAJLParser.h"
        #import "MGTwitterMiscYAJLParser.h"
        #import "MGTwitterSearchYAJLParser.h"
    #else
        #define API_FORMAT @"json"
    
        #if USE_LIBXML
            #import "MGTwitterStatusesLibXMLParser.h"
            #import "MGTwitterMessagesLibXMLParser.h"
            #import "MGTwitterUsersLibXMLParser.h"
            #import "MGTwitterMiscLibXMLParser.h"
        #else
            #import "MGTwitterStatusesParser.h"
            #import "MGTwitterUsersParser.h"
            #import "MGTwitterMessagesParser.h"
            #import "MGTwitterMiscParser.h"
        #endif
    #endif
    

    您会惊讶于- (void) requestSucceeded: (NSString *) requestIdentifier- (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) error 会被调用。但是很容易检查是否调用了成功,而不是在失败的方法中不做任何事情。

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2013-08-26
      • 2014-02-21
      • 2011-09-03
      相关资源
      最近更新 更多