我正在为iOS 9及之后编写iPhone应用程序。我对此应用程序的目标之一是它应该能够通过用户拥有的一个或多个Twitter帐户代表我的用户发送推文。
我已将STWitter库集成到我的应用程序中,并且我已经获得了我想要的功能,几乎就像我一样。我说几乎'因为它的一小部分没有像我预期的那样工作,而且这部分我想集中在这里。
我可能会说我认为这个问题不是STTwitter相关问题,因为另一张海报发布了类似的问题here,正在使用Twitteroauth库。
目前,在我正在测试的应用程序版本中,我有两个标记为" @ acct1"和" @ acct2"。
每个按钮代表我拥有的Twitter帐户。我的Twitter帐户都使用相同的密码。
如果我触摸其中一个按钮,该应用程序将创建并发送一条推文到我的与该按钮相关联的Twitter帐户。
我的应用程序处于测试模式,所以目前我存储了在非持久性内存中收到的oauth令牌。因此,如果我重新启动App,我的oauth令牌就会消失。之后,当所有内容都整理好后,我会将它们存储在用户默认值中。
因此,在应用程序重启后第一次按下@ acct1或@ acct2按钮时,我将无法获得所需的oauth令牌,我将不得不启动往返Twitter以获取它们。
在重新启动应用程序之前,如果再次使用该按钮,我仍然会拥有oauth令牌,并且我不会首先访问Twitter。
任何整合了STTwitter图书馆并通过OAuth的奇迹工作的人都会熟悉所有这些的基本概要。
我认为这有足够的背景。现在来看问题:
现在假设我刚刚重启了我的应用程序。当我触摸@ acct1时,我的代码确定我没有持有oauth令牌,所以我开始顺序到Twitter去往它们。
首先我发送一个postTokenRequest。
它成功返回,其sucess_block包含一个带有各种数据的URL,然后我将其传递给Safari。
Safari使用该URL访问Twitter网站,当该网站页面出现时,我正在寻找一个名为“#34;授权使用您的帐户?”的屏幕,并且#34;
该屏幕显示两个文本框。一个用于userID(或电话号码或电子邮件地址),另一个用于密码。我只对这里的userID选项感兴趣。
这是我的问题/问题--------------
在我通过postTokenRequest传递的参数中,我可以选择包含一个'屏幕名称的值。参数。
注意'屏幕名称'我认为,userID是可互换的术语。
我的假设是,如果我添加一个“屏幕名称”'在我的postTokenRequest的传递参数中,然后当Safari提出其#34;授权使用您的帐户时#34;屏幕显示给我的用户,该屏幕上的userID字段将自动填入我传递的屏幕名称'。
我还假设如果我为屏幕名称传递nil,则显示的userID字段将为空,我将被要求填写。
下面是两张表。
Table 1 - this is what I expect to happen:
I Rqst Safari userID
Press Token userID I
case button Sends shows enter
---- ----- ----- ------ ------
1a @acct1 nil nil @acct1
1b @acct2 nil nil @acct2
<App restarted here so saved oauth tokens evaporate>
2a @acct1 acct1 acct1 none
2b @acct2 acct2 acct2 none
讨论表1:
在案例1a和1b中,当我触摸@ acct1或@ acct2时,我使用postRequestToken发送的屏幕名称为nil。在这两种情况下,我希望Safari提供的用户ID是空白的,并且要求我输入它。
在情况2a和2b中,当我触摸@ acct1或@ aact2时,我发送的带有postRequestToken的屏幕名称包含正确的acct1或acct2值。在这两种情况下,Safari提供的userID都是正确的,我不需要进行任何数据输入。
Table 2 - but this is what actually happens:
I Rqst Safari userID
Press Token userID I
case button Sends shows enter
---- ----- ----- ------ ------
1a @acct1 nil nil acct1
1b @acct2 nil acct1 acct2
<App restarted here so saved oauth tokens evaporate>
2a @acct1 acct1 acct1 none
2b @acct2 acct2 acct1 acct2
表2的讨论:
案例1a按预期工作,但案例1b没有。在1b中,Safari显示acct1作为用户ID,即使发送的请求令牌为屏幕名称为nil。
案例2a按预期工作,但案例2b没有。 Safari将acct1显示为用户ID,即使请求令牌为屏幕名称发送了acct2。
一般性讨论:
我认为this post也在描述这个问题,但海报没有得到任何帮助。
在我看来,Twitter上的一个问题就是上次成功发布oauth令牌时无意间持续存在数据(屏幕名称/用户ID)。在表1中注意,一旦案例1a被批准,1a的屏幕名称仍然存在,并在1b的请求中显示为屏幕名称。 2a和2b也是如此。
我还注意到,如果您在请求之间等待一段时间,则持久数据会消失。
在这篇文章的开头,我提到我的两个Twitter帐户共享相同的p / w。这使得这个持久性问题对我或我的任何选择使用相同密码的用户来说可能是一个大问题。
如果这样的用户使用我的应用程序快速连续设置多个Twitter帐户,并且没有注意到Twitter将先前批准的帐户的屏幕名称保持为当前所请求帐户的屏幕名称,那么新的Twitter帐户会被误导。
如果正在设置的每个Twitter帐户都有不同的p / w,则可能会遇到此问题。在这种情况下,屏幕名称/用户ID与p / w之间的不匹配会导致拒绝。
我并不热衷于建议我的用户为他们的几个Twitter帐户使用不同的p / w。我也不能强制执行它,因为OAuth的全部内容是应用程序应该不知道用户的p / w。
到目前为止,我能看到的最好的是
(1)总是在postTokenRequest中为屏幕名称发送一个nil。
(2)通知我的用户,因为他们在我的应用程序上设置了一个新的Twitter帐户,他们应该从不接受Twitter预先加载的&#34;授权使用你的用户ID字段帐户&#34;屏幕,但总是用他们知道的用户ID替换他们在那里找到的任何东西。
任何和所有评论都将不胜感激。