【问题标题】:Turn back to app after authorize Twitter Successful授权推特成功后返回应用
【发布时间】:2015-02-02 01:24:36
【问题描述】:

我将我的应用配置为使用 通过 twitter 登录 功能。但是在 safari 上授权应用程序成功后,我无法返回我的应用程序。我在堆栈溢出use UrlShemes 上看到了另一个与相同问题的问题,但这对我不起作用(我没有足够的声誉来添加 cmets 来询问他们接受的答案)。所以请告诉我:如果授权成功后我可以返回我的应用程序(就像 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,所以我发布了图像):

【问题讨论】:

    标签: ios iphone twitter


    【解决方案1】:

    注意对于那些仍在使用 STTwitter 的人,我建议切换到 Twitter 的官方 SDK,发现 here

    原帖

    您需要确保您的 oauthCallback 是您的 Apps plist 中列出的方案。您还可以使用更简洁的反向域名托管方案,以确保您不会与任何其他应用发生冲突。

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

    我在哪里使用 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
            }];
    

    编辑

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

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

    【讨论】:

    • NSString *token = d[@"oauth_token"]; 在哪里可以得到d?并请说明您在这里使用的postAccessTokenRequestWithPINsetOAuthToken 的用途?
    • 答案已更新并使用 postAccessTokenRequest 以便我们可以检索 OAuth 令牌并获取用户。获得令牌后,您可以使用它们再次登录。会更新我的答案
    • 授权成功后,我的应用程序甚至没有调用该函数:- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation。它只是像以前一样在 safari 上打开mobile.twitter.com
    • 您的应用 plist 在 URL 类型下是什么样的?
    • @haatlee 很高兴听到,我将不得不花一些时间来找到我从哪里得到的,但我的第一个猜测是来自演示项目。但很高兴听到它奏效了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2016-07-25
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多