在授权Twitter成功后回到应用程序

我configuration我的应用程序使用Twitterfunctionlogin 。 但是,在Safari上授权应用程序成功之后,我无法回到我的应用程序。 我看到另一个问题,堆栈溢出使用UrlShemes相同的问题,但这不适用于我(我没有足够的声誉添加评论,要求他们进入接受的答案)所以请让我知道: 如果我可以回头到授权成功后我的应用程序(如Facebook API可以)? 如果这是可能的,那么如何做到这一点?

这是我的代码:

self.twitter = [STTwitterAPI twitterAPIWithOAuthConsumerKey:Twitter_API_KEY consumerSecret:Twitter_API_SECRET]; [_twitter postTokenRequest:^(NSURL *url, NSString *oauthToken) { NSLog(@"-- url: %@", url); NSLog(@"-- oauthToken: %@", oauthToken); [[UIApplication sharedApplication] openURL:url]; } authenticateInsteadOfAuthorize:NO forceLogin:@(YES) screenName:nil oauthCallback:@"sutrixsnowball://" errorBlock:^(NSError *error) { NSLog(@"-- error: %@", error); }];// The "sutrixsnowball" is URL Schemes item into plist file 

它只是像下面的图像打开Safari浏览器的网页(当我复制,这不是一个真正的url,所以我张贴图像):

在这里输入图像说明

注意对于那些仍然使用STTwitter,我build议切换到Twitter的官方SDK在这里find

原始post

您需要确保您的oauthCallback是您的Apps plist中列出的scheme。 您也可以使用更清洁的反向域名主机scheme,以确保您永远不会与其他任何应用程序发生冲突。

所以你的应用程序plist会看起来像这样:

在这里输入图像说明

我在哪里使用com.twitteroauthcallback.sutrixsnowball作为URLscheme。

您需要在应用程序委托中处理此callback。 像这样的东西:

 - (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:的成功块postAccessTokenRequestWithPin:方便地传回一个令牌和一个秘密。 看STTwitterAPI你会看到下面的构造函数:

 + (instancetype)twitterAPIWithOAuthConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret oauthToken:(NSString *)oauthToken oauthTokenSecret:(NSString *)oauthTokenSecret 

因此,如果您将这些值保存在设备的某个位置,则可以在下次启动时login到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 }]; 

编辑

事实certificate,为了工作,STTwitter要求oauthCallback看起来像这样

 oauthCallback:@"<YOUR_URL_SCHEME>://twitter_access_tokens/"