iOS TWTRComposer请求失败:未经授权(401)

时间:2017-06-12 04:20:56

标签: ios twitterkit

使用以下代码和我尝试过的其他一些变体,我总是会收到未经授权的错误。我使用CocoaPods使用 TwitterKit 3.0 。我已经完成了我的plist设置,我的twitter应用程序配置,以及这样的代码:

// In didFinishLaunchingWithOptions
Twitter.sharedInstance().start(withConsumerKey:"XX", consumerSecret:"YYY")

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
{
    return Twitter.sharedInstance().application(app, open: url, options: options)
}

// In response to a click
Twitter.sharedInstance().logIn { session, error in
    if session != nil { // Log in succeeded
        let composer = TWTRComposer()

        composer.setText(tweetText)

        composer.show(from: self.navigationController!) { result in
            if (result == .done) {
                print("Successfully composed Tweet")
            } else {
                print("Cancelled composing")
            }
        }
    }
}
  

"发送Tweet时遇到错误:错误   Domain = TWTRNetworkingErrorDomain Code = -1011"请求失败:   未经授权(401)"的UserInfo = {NSLocalizedFailureReason =,   TWTRNetworkingStatusCode = 401,   NSErrorFailingURLKey = https://api.twitter.com/1.1/statuses/update.json,   NSLocalizedDescription =请求失败:未授权(401)"

4 个答案:

答案 0 :(得分:2)

如果在遵循Twitter的设置说明后它仍然无效,请尝试重新生成使用者密钥。这解决了我的问题。

答案 1 :(得分:0)

使用TWTRComposer时没有理由登录。 SDK将使用Twitter应用程序中的当前会话(如果有),或者它将以智能方式回退。我无法说明您的登录失败的原因,但我建议您将其删除以解决问题。

let composer = TWTRComposer()

composer.setText(tweetText)

composer.show(from: self.navigationController!) { (result in
    if (result == .done) {
        print("Successfully composed Tweet")
    } else {
        print("Cancelled composing")
    }
}

你说你已经设置了所有内容,但如果你错过了一步,我会给你一份安装清单:

  • 初始化Twitter工具包

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        Twitter.sharedInstance().start(withConsumerKey:"xxx", consumerSecret:"xxx")
    
        return true
     }
    
  • 配置Info.Plist

    // Info.plist
    <key>CFBundleURLTypes</key>
    <array>
      <dict>
        <key>CFBundleURLSchemes</key>
        <array>
          <string>twitterkit-<consumerKey></string>
        </array>
      </dict>
    </array>
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>twitter</string>
        <string>twitterauth</string>
    </array>
    

如果您仍然遇到问题,请务必在https://apps.twitter.com/检查您应用的状态。有多种方法可以限制甚至取消激活您的应用密钥。如果是这种情况,应用名称下方会有一个红色标签。

答案 2 :(得分:0)

我也面临同样的问题。我使用的是Twitter,FB和Google登录。 URLSchemes的plist序列中的问题

我首先添加了推文计划

我的前 -

 <key>CFBundleURLTypes</key>
        <array>
            <dict>
                <key>CFBundleURLSchemes</key>
                <array>
                    <string>twitterkit-xxxx</string>
                </array>
            </dict>
            <dict>
                <key>CFBundleURLSchemes</key>
                <array>
                    <string>fbxxxxx</string>
                </array>
            </dict>
            <dict>
                <key>CFBundleTypeRole</key>
                <string>Editor</string>
                <key>CFBundleURLSchemes</key>
                <array>
                    <string>com.googleusercontent.apps.xxxx-xxxx</string>
                </array>
            </dict>
        </array>

答案 3 :(得分:0)

在TwitterKit 3.3.0中,basically

  

虽然您的Twitter中的Twitter Kit不会请求回调网址   应用程序,必须将其设置为应用程序才能使用SDK的有效URL。

即使您尝试创建Twitter app时,也没有说它是强制性的 - 如果您希望以下流量可以使用

如果不这样做将会破坏整个流程,并且不会自动发生任何事情:

  

如果设备上没有安装Twitter,它会自动回退以通过Web视图使用OAuth(对于第一个用户使用SFSafariViewController,为后续其他用户使用UIWebView。)

如果拥有callback_url,将会有什么作用:

只有当用户安装了Twitter应用程序时,我们才能编写twit或登录 - 其余部分无效。

当Twitter应用未安装时:

  • 使用composer.show(from: self) { (result) in时,您将获得.cancelled
  • 使用TWTRTwitter.sharedInstance().logIn(completion: { (session, error) in时,您将获得Request failed: unauthorized (401)

一般说明:

  • 如果API密钥/机密无效,TwitterKit执行的任何操作都会导致应用崩溃

  • 确保单身start("key", "secret")方法和价值为plist的项目twitterkit-{API KEY}具有相同的键,否则您的应用会崩溃