setAccessToken时出现twitpic API GSTwitPicEngine错误

时间:2011-04-08 06:58:53

标签: cocoa-touch api ios4 twitter-oauth twitpic

我尝试使用GSTwitPicEngine类https://github.com/Gurpartap/GSTwitPicEngine在Twitter上分享图像 但它给出错误

因为我们必须设置[twitpicEngine setAccessToken:token];
如果我是对的,我使用_accessTokenSA_OAuthTwitterEngine作为标记

_accessToken在课程SA_OAuthTwitterEngine中是私有的,我将其设置为公开,也是

@property (nonatomic, readonly) OAToken *accessToken;
@synthesize accessToken = _accessToken;

然后在行动

twitPicEngine = [GSTwitPicEngine twitpicEngineWithDelegate:self];
[twitPicEngine setAccessToken:twitterObj.accessToken];
[twitPicEngine uploadPicture:[shareDict objectForKey:@"image"] withMessage:[shareDict objectForKey:@"image_msg"]];

但是,当setAccessToken与log

时,应用程序崩溃
-[OAToken parameters]: unrecognized selector sent to instance 0x6327e30
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[OAToken parameters]: unrecognized selector sent to instance 0x6327e30'

如果您能找到任何错误,请提供帮助

Amit Battan

2 个答案:

答案 0 :(得分:7)

不幸的是,GSTwitPicEngine没有使用相同版本的oauth-consumer而不是神话般的Twitter + Oauth库(SAOAuthTwitterEngine)。我假设您正在使用该库向Twitter发送消息。

崩溃是因为来自Twitter + Oauth的OAToken没有实现“参数”方法。

今天我花了整个上午调整了几个库来避免崩溃。 在这里,您可以下载我创建的示例项目,用于将带有消息的twitpic照片发布到Twitter。

TestTwitpic

该项目拥有github所有库的所有最新版本。

使我的TestTwitpic项目有效的说明

在TestTwitpic-Prefix.pch中设置变量:

#define kTwitterOAuthConsumerKey @""
#define kTwitterOAuthConsumerSecret @""
#define kTwitPicAPIKey @""

在RootViewController中,您可以根据需要更改这些行。要更改照片:

//change [UIImage imageNamed:@"image.jpg"] for whatever UIImage you want to upload
//change @"my photo" for whatever title you want for your photo in twitpic website
[twitpicEngine uploadPicture:[UIImage imageNamed:@"image.jpg"] withMessage:@"my photo"];

并将此消息发送给Twitter:

//I post to twitter the title of the photo and the twitpic url but you can post whatever you want
[engine sendUpdate:[NSString stringWithFormat:@"%@ %@", [[[response objectForKey:@"request"] userInfo] objectForKey:@"message"], [[response objectForKey:@"parsedResponse"] objectForKey:@"url"]]];

如果您想根据此示例创建自己的项目。执行以下操作:

  1. 将包含所有库内的Twitpic文件夹导入项目(拖放)。
  2. 将这些框架添加到您的项目中:
    • CoreGraphics中
    • libz.1.2.3
    • 的libxml2
    • MobileCoreServices
    • SystemConfiguration
    • CFNetwork的
    • 安全
  3. 在构建设置中,将“$ SDKROOT / usr / include / libxml2”添加到“标题搜索路径”(将其标记为递归)
  4. 在构建设置中,将-lxml2添加到“其他链接器标志”
  5. 如果你想知道我为修复库做了什么,我会告诉你或多或少我记得我做过的事情:

    1. 导入Twitter + Oauth,GSTwitPicEngine,OARequestHeader,TouchJSON和ASIHTTPRequest库。
    2. GSTwitPicEngine设置为使用TouchJSON而不是YAJL
    3. 在oauth-consumer github项目中添加了类别NSString + URLEncoding,因为 OARequestHeader 缺少它。
    4. 使用以下行修改 OARequestHeader 内所有出现的NSDictionary * foo = [toke参数]:
      • NSDictionary *foo = [NSDictionary dictionaryWithObject:[token key] forKey:@"oauth_token"];
    5. 在SAOAuthTwitterEngine中创建了一个方法getAccessToken,以返回私有_accessToken变量。
    6. 在requestFinished中:在GSTwitPicEngine中
      • 更改行:
        • response = [[CJSONDeserializer deserializer] deserialize:responseString error:&error];
      • 与该行:
        • response = [[CJSONDeserializer deserializer] deserialize:[responseString dataUsingEncoding:NSUTF8StringEncoding] error:&error];
      • 因为GSTwitPicEngine错误地假设反序列化:error:方法接受NSString而不是NSData。

答案 1 :(得分:0)

您可以设置访问令牌和放大器从twitter引擎获取twitpic后访问密码,即

SA_OAuthTwitterEngine.m

  • (void)setAccessToken:(OAServiceTicket *)ticket withData:(NSData *)data

在“SA_OAuthTwitterEngine.m”中创建“GSTwitPicEngine.m”类的对象。传递访问令牌&访问“GSTwitPicEngine.m”的秘密并在“SA_OAuthTwitterEngine.m”中设置“GSTwitPicEngine.m”的委托方法

还有一个改变......

必须在生成OAuth标头时交叉检查URLEncoding,即

[requestHeader generateRequestHeaders]

这将根据Twitter库中的“OAuthConsumer”类