授权 Twitter 成功后返回应用

2023-12-05

我将我的应用程序配置为使用通过推特登录特征。但在 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 上打开网页,如下图所示(我复制时不是真实的网址,所以我发布了图片):

enter image description here


Note对于那些仍在使用 STTwitter 的人,我建议切换到 Twitter 的官方 SDKhere

原帖

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

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

enter image description here

我在哪里使用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/"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

授权 Twitter 成功后返回应用 的相关文章

  • 在横向模式下向 UIScrollView 添加子视图

    我有一个以横向模式启动的视图控制器 其中有一个 UIScrollView 我尝试创建子视图并将它们添加到 UIScrollView 但视图的框架大小都是纵向大小 这是我的代码 void viewDidLoad super viewDidLo
  • Emoji 字符无法编码为 JSON

    我有一个UITextView我称之为messageField 其中的数据messageField is POST ed 以 JSON 格式发送到服务器 当用户输入表情符号字符时 我无法将数据编码为JSON 我认为 Emoji 使用 Unic
  • 特定时间的 iPhone 本地通知

    我想每周晚上 10 点 无论哪个国家 地区 发出通知 我需要使用时区吗 目前 我使用下面的代码每周触发通知 但如何在晚上 10 点准确触发通知 NSDate date NSDate date NSDate myNewDate date da
  • 如何将 UIPopoverPresentationController 的高度设置为与 UITableView 相同

    我在我的应用程序上使用 UIPopoverPresentationController 在我的 iPhone 上显示弹出窗口 使用 UIModalPresentationNone 我希望尺寸随着 UITableView 的高度而动态变化 但
  • 在 Flurry 中记录比错误 ID 更多信息的方法?

    我目前使用 iOS 版 Flurry 5 4 0 我担心在方法方面是否能够记录更多信息 而不仅仅是错误 ID void logError NSString errorID message NSString message error NSE
  • 在 iOS 中擦除绘图

    我正在开发一个绘图应用程序 我有一个UIBezierPath 我用它在touchesMoved中绘制 并将其转换为CGPath 然后在tCGplayer上绘制 这是我的代码 void touchesMoved NSSet touches w
  • iOS 4.0 contentScaleFactor 和比例 - 在 3.1.3 中如何处理?

    我的任务是制作一个在 iOS 4 0 中运行的应用程序再次在 3 1 3 和 3 2 中运行 大多数情况下 它很简单 但处理新 API 的扩展和其他必须传递 返回值的情况很困难 respondsToSelector performSelec
  • ios 使用 HTTP POST 上传图像和文本

    谢谢阅读 我是 iOS 新手 我正在尝试使用上传图像和文本multi part form encoding在 iOS 中 The curl等价的是这样的 curl F param1 value1 F email protected cdn
  • 有什么方法可以让dispatch_queue_t在单线程中工作吗?

    这是我的代码 interface MyObject property nonatomic dispatch queue t queue end implementation MyObject NSThread check id init s
  • 在iPhone上将CSV文件读入sqlite3

    有没有办法在iPhone上将CSV文件读入sqlite3 sqlite3 是否有类似于 SQL 命令的功能 LOAD DATA LOCAL INFILE file csv INTO TABLE TABLENAME FIELDS TERMIN
  • 将两个字符的字符串转换为布尔数组的快速方法是什么?

    我有一个很长的字符串 有时超过 1000 个字符 我想将其转换为布尔值数组 它需要非常快速地多次执行此操作 let input String 001 let output Bool false false true 我天真的尝试是这样的 i
  • iPad 2 检测

    由于我没有 iPad 2 因此我需要知道调用 UIDevice currentDevice model 时它返回什么 我以为它只返回 iPad 但看来我错了 有人可以告诉我吗 Thanks 检查是否有带摄像头的 iPad BOOL isIP
  • 在运行时动态创建核心数据模型

    是否可以在运行时从服务器上的一组实体生成核心数据模型 例如SharePoint 列表或 SQL MySQL Parse 我正在尝试采用动态路线 因为 SharePoint 列表 SQL Parse 中的字段可能会在将来随时添加 这意味着应用
  • 方向改变时重新定位控件

    我知道自动布局可用于在方向改变时使尺寸和位置保持一致 当方向改变时 是否可以完全改变布局 例如 请查看下面的纵向模式下简单登录屏幕的线框 现在 如果我旋转设备 我想完全重新定位控件 这种事情可以用自动布局来完成吗 如果没有 我该怎么办 谢谢
  • iOS推送通知:当应用程序处于后台时,如何检测用户是否点击了通知?

    关于这个主题有很多 stackoverflow 线程 但我仍然没有找到好的解决方案 如果应用程序不在后台 我可以检查launchOptions UIApplicationLaunchOptionsRemoteNotificationKey
  • 如何在我的应用程序中添加应用内购买

    我想在我的应用程序中使用应用程序购买应用程序 但我不知道如何执行此操作 任何人都可以帮助我如何做以及源代码在哪里 给我链接或代码 这里有一堆链接 应用内购买编程指南 http developer apple com iphone libra
  • 使用 UItableviewCell 实现 Google 地图

    我正在尝试在 UItableviewCell 组件内实现谷歌地图 我这样做的方法是在原型单元中定义 GMSMapView 然后使用 dequeueReusableCell 方法配置地图单元 但是 我尝试应用的任何更改都会失败 例如添加标记
  • 从xcode上触摸屏的坐标获取ImageView的像素数据?

    单击视图并从视图内的图像获取正确的像素数据似乎存在问题 func handleTap gestureRecognizer UIGestureRecognizer print You tapped at gestureRecognizer l
  • 使用 Protobuf-net,我收到有关 List 未知线路类型的异常

    我已经开始将 Unity iOS 游戏转换为使用 Protobuf net 保存状态 看起来一切正常 直到我将此实例变量添加到GameState ProtoMember 10 public List
  • iOS Safari Mobile 禁用上一个和下一个选择输入

    上周五我发现了关于此问题的类似问题 但似乎无法再次找到它 如果有人能指出我正确的方向 那就太好了 本质上我在一个页面上有多个选择菜单 第一个在加载时填充 第二个在第一个选择时填充 够简单的 但是 在 iOS 设备中 当您点击选择元素时 它会

随机推荐

  • Scalaz 管道运算符与列表方法连接

    我是新手Scala 但我有一些使用经验OCaml 我正在考虑采用中定义的管道运算符Scalaz通过以下方式 import scalaz import Scalaz def test def length2 x String List x l
  • 保存与 Cakephp 3 的关联

    我在使用 CakePHP 3 和通过一项操作保存新实体及其关联时遇到问题 在我看来 我按照文档中的建议进行操作 这是我的控制器 articles TableRegistry get Articles article articles gt
  • AngularJS 中指令隔离范围与 ng-repeat 范围

    我有一个带有隔离范围的指令 以便我可以在其他地方重用该指令 并且当我将此指令与ng repeat 它无法工作 我已阅读有关此主题的所有文档和 Stack Overflow 答案并了解这些问题 我相信我已经避免了所有常见的问题 所以我知道我的
  • jQuery .each 在 Safari 上比 Chrome/Firefox 慢

    我有一个大型 HTML 表格 1 000 1 500 行 40 列宽 我有一些输入和选择框 以便用户可以过滤行 附加的相关 javascript jquery 注意 没有粘贴整个代码库 因为它不是瓶颈 如下所示 function autoR
  • 错误:文档未定义,在构建角度通用应用程序时

    Error factory require jquery document window navigator ReferenceError document is not defined 面对角度通用渲染服务器端的问题 我用谷歌搜索了这个并
  • 如何理解UML中类似自反关联的“自反聚合”关系

    这个类图是什么意思 自反关联的类图使用了实线和箭头 但这里用空心菱形代替 和递归有关系吗 这个类图会生成什么 如果能举个例子就最好了 另外这个递归关系应该是一对多 如果存储数据库怎么建表 这是什么意思 这个类图意味着Unit can与其他几
  • 如何保持Python脚本输出窗口打开?

    我刚刚开始使用Python 当我在 Windows 上执行 python 脚本文件时 输出窗口出现但立即消失 我需要它留在那里 以便我可以分析我的输出 我怎样才能保持它打开 您有几个选择 从已打开的终端运行该程序 打开命令提示符并键入 py
  • Android Studio Arctic Fox (Adb) - 连接的设备在一段时间后断开连接

    我有 7 部不同的 Android 手机 它们都有不同的 Android 操作系统 他们都面临着同样的断线问题 大约一小时后 设备将断开连接 当它断开连接时 Allow USB debugging 出现弹出窗口twice并希望我允许已批准的
  • 将 RIGHT 外连接转换为左外连接 SQLite

    我需要为 Sqlite 设计一个查询 原来的查询是这样的 FROM PhysicianActivity INNER JOIN Activity ON PhysicianActivity ActivityID Activity ID RIGH
  • 在运行时将 byte[] 加载到 System.Windows.Controls.Image 中

    我有一个代表 png 文件的 byte 我正在通过 WebClient 下载此 png 当 WebClient 下载了我通过 URL 引用的 png 时 我得到一个 byte 我的问题是 如何将 byte 加载到 WPF 中的 System
  • 调整大小后 QRubberBand 在 QGraphicsView 上移动

    我在这个主题中遇到了同样的问题 当我调整窗口大小时 QRubberBand 移动 经过几次尝试 我意识到本主题的解决方案不适用于 QGraphics 视图 当我调整窗口大小时 为什么我的选择会围绕 QgraphicsView 移动 impo
  • 如何使用seaborn displot 将直方图条形围绕刻度线居中?堆叠酒吧是必不可少的

    我搜索了许多制作以刻度线为中心的直方图的方法 但无法找到适用于 seaborn displot 的解决方案 函数 displot 允许我根据数据框中的列堆叠直方图 因此更喜欢使用 displot 的解决方案或允许基于数据框中的列进行堆叠的解
  • 遍历整个 PDF 并将蓝色更改为黑色(同时更改下划线的颜色)+ iText

    我正在使用下面的代码从 pdf 文本中删除蓝色 它运行良好 但它不是改变下划线颜色 而是正确改变文本颜色 原始文件部分 被操纵的文件 正如您在上面的操作文件中看到的 下划线颜色没有改变 两周以来我一直在寻找解决这个问题的方法 任何人都可以帮
  • Firebase 中的嵌套列表[重复]

    这个问题在这里已经有答案了 尝试了解如何在 Firebase 中实现嵌套列表 问题可简化为 一个 1 对 N 消息传递系统 其中 对于每条消息 您希望维护已接收并阅读该消息的用户列表 已读过 Firebase 中数组的最佳实践 尝试避免使用
  • 如何更改 pandas groupby.agg 函数的输入参数?

    我在使用 groupby object agg 方法和想要更改输入参数的函数时遇到问题 是否有可用的函数名称资源 agg 接受 以及如何将参数传递给它们 请参阅下面的示例 import pandas as pd import numpy a
  • Jenkins 无法访问已安装的驱动程序

    我的 Jenkins 服务器在 Windows 2008 服务器上的 Tomcat 中运行 我在CentOS上搭建了一个NFS服务器 Win2008服务器可以通过mount命令访问NFS共享文件夹 我在 Windows 上以管理员用户身份运
  • 阻止孩子覆盖父母的轮廓?

    由于某些元素位于幻灯片内 我使用带有负偏移量的轮廓而不是边框 然而 子元素覆盖了轮廓 但我想要它们上面的边框 我用它来构建内容 http jsfiddle net z22kw2zq 1 parent position relative ou
  • 有效地查找数组中元素的行列?

    如何有效地找到数组中每个元素的排名 在平局的情况下求平均值 例如 float rank T T input Implementation auto foo rank 3 6 4 2 2 foo 3 5 4 1 5 1 5 我能想到的唯一方法
  • 当应用程序处于后台或关闭状态时,无法从 Firebase 消息服务将记录插入 SQLite 数据库

    我正在尝试 Firebase 通知 我能够使用通知正常工作this文档 消息已收到 我能够从内部向通知栏发送通知MyFirebaseMessagingService服务等级 即使应用程序处于后台或关闭时也会发生这种情况 我需要的是收集通知中
  • 授权 Twitter 成功后返回应用

    我将我的应用程序配置为使用通过推特登录特征 但在 Safari 上授权应用程序成功后 我无法返回到我的应用程序 我在堆栈溢出上看到了另一个有同样问题的问题使用 URLShemes但这对我不起作用 我没有足够的声誉来添加评论来要求他们接受答案