授权Twitter成功后,返回应用程序

时间:2014-12-04 08:31:07

标签: ios iphone twitter

我将我的应用配置为使用通过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上的网页,如下图所示(当我复制时它不是真正的网址,所以我发布了图片):

enter image description here

1 个答案:

答案 0 :(得分:3)

注意对于仍在使用STTwitter的用户,我建议切换到Twitter的官方SDK here

原帖

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

所以你的App plist看起来像这样:

enter image description here

我使用 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/"