Note对于那些仍在使用 STTwitter 的人,我建议切换到 Twitter 的官方 SDKhere
原帖
您需要确保您的 oauthCallback 是您的 Apps plist 中列出的方案。您还可以使用更干净的反向域名托管方案,以确保您不会与任何其他应用程序发生冲突。
所以你的应用程序 plist 看起来像这样:
![enter image description here](https://i.stack.imgur.com/zeNFt.png)
我在哪里使用com.twitteroauthcallback.sutrixsnowball作为 URL 方案。
您需要在应用程序委托中处理此回调。像这样的东西:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
if ([[[url scheme] lowercaseString] isEqualToString:@"com.twitteroauthcallback.sutrixsnowball"] == NO) {
return NO;
}
NSMutableDictionary *twitterParamsDictionary = [NSMutableDictionary dictionary];
NSArray *queryComponents = [[url query] componentsSeparatedByString:@"&"];
for(NSString *s in queryComponents) {
NSArray *pair = [s componentsSeparatedByString:@"="];
if([pair count] != 2) continue;
NSString *key = pair[0];
NSString *value = pair[1];
twitterParamsDictionary[key] = value;
}
NSString *token = twitterParamsDictionary[@"oauth_token"];
NSString *verifier = twitterParamsDictionary[@"oauth_verifier"];
if (token && verifier) {
[self setOAuthToken:token oauthVerifier:verifier];
return YES;
}
return NO;
}
- (void)setOAuthToken:(NSString *)token oauthVerifier:(NSString *)verifier {
__weak typeof (self)weakself = self;
[self.twitterAPI postAccessTokenRequestWithPIN:verifier
successBlock:^(NSString *oauthToken, NSString *oauthTokenSecret, NSString *userID, NSString *screenName) {
[weakself.twitterAPI getUserInformationFor:screenName
successBlock:^(NSDictionary *user) {
///we have an account
} errorBlock:^(NSError *error) {
/// error
}];
} errorBlock:^(NSError *error) {
///error
}];
}
您会注意到成功块postAccessTokenRequestWithPin:
方便地传回令牌和秘密。查看 STTwitterAPI,您将看到以下构造函数:
+ (instancetype)twitterAPIWithOAuthConsumerKey:(NSString *)consumerKey
consumerSecret:(NSString *)consumerSecret
oauthToken:(NSString *)oauthToken
oauthTokenSecret:(NSString *)oauthTokenSecret
因此,如果您将这些值保留在设备上的某个位置,您可以在下次启动时登录 Twitter:
/// Next app launch
STTwitterAPI *twitterAPI = [STTwitterAPI twitterAPIWithOAuthConsumerKey:consumerKey consumerSecret:consumerSecret oauthToken:oauthToken oauthTokenSecret:oauthTokenSecret];
[twitterAPI verifyCredentialsWithSuccessBlock:^(NSString *username) {
/// we still good to go
} errorBlock:^(NSError *error) {
/// token has expired. User needs to login again
}];
EDIT
事实证明,为了工作 STTwitter 要求 oauthCallback 看起来像这样
oauthCallback:@"<YOUR_URL_SCHEME>://twitter_access_tokens/"