我将我的应用配置为使用通过Twitter登录功能。但在Safari上授权应用程序成功后,我无法回到我的应用程序。我在堆栈溢出use 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上的网页,如下图所示(当我复制时它不是真正的网址,所以我发布了图片):
答案 0 :(得分:3)
注意对于仍在使用STTwitter的用户,我建议切换到Twitter的官方SDK here
您需要确保oauthCallback是Apps plist中列出的方案。您还可以使用更清晰的反向域主机方案,以确保您永远不会与任何其他应用程序冲突。
所以你的App plist看起来像这样:
我使用 com.twitteroauthcallback.sutrixsnowball 作为网址方案。
您需要在应用代理中处理此回调。像这样:
- (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
}];
事实证明,为了工作,STTwitter要求oauthCallback看起来像这样
oauthCallback:@"<YOUR_URL_SCHEME>://twitter_access_tokens/"