如何使用 Swifter 授权 Twitter

How to Authorize Twitter with Swifter

有人可以向我解释如何使用 Swifter 为 iOS 成功授权 Twitter (oAuth)。我正在尝试创建一个时间表。

let twitterAccount = Swifter(consumerKey: "CONSUMER-KEY", consumerSecret: "CONSUMER-SECRET")

然后我需要授权,我很困惑如何授权。

swifter.authorizeWithCallbackURL(callbackURL, success: {
(accessToken: SwifterCredential.OAuthAccessToken?, response: NSURLResponse) in

// ...

},
failure: {
    (error: NSError) in

    // ...

})

我收到一条错误消息 'Unresolved Identifier of callbackURL',这显然是因为我没有定义它,但是当我定义它时却显示 'extra argument in call'。还有更简单的授权方式吗?在此之后我应该如何让用户 screen-name/user-id 在 get-home-timeline 部分中使用。我知道我做的事情完全错了,而且我对这一切都很陌生,所以任何帮助都将不胜感激。

也许您已经找到了答案,但我写在这里是为了那些仍在寻找答案的人。

swifter.authorizeWithCallbackURL(NSURL(string: "swifter://success")!, success: {
            (accessToken: SwifterCredential.OAuthAccessToken?, response: NSURLResponse) in

            println("Access Token key \(accessToken?.key)")
            println("userId\(accessToken?.userID)")
            println("userName\(accessToken?.screenName)")
            println("Access Token secret\(accessToken?.secret)")
            //Save the values that you need in NSUserDefaults 
            },
            failure: failureHandler)

您可以使用任何您喜欢的 callbackURL。但是要让您的应用响应此 URL,您必须进行一些更改。在 AppDelegate class 添加以下内容。不要忘记导入 SwifteriOS

func application(application: UIApplication!, openURL url: NSURL!, sourceApplication: String!, annotation: AnyObject!) -> Bool {
        Swifter.handleOpenURL(url)

        return true
    }

现在在 Project Explorer 中单击您的项目,select info 选项卡。在底部你会看到 URL Types。展开它并单击加号。在 URL Schemes 中输入您的 callbackURL 方案。在此示例中,它 swifter 并在 identifier 中写入您的应用程序标识符。

现在,在任何其他 ViewController 中,您需要先调用以下内容,然后才能调用任何需要身份验证的 API。

required init(coder aDecoder: NSCoder) {

        var oauthToken : String = NSUserDefaults.standardUserDefaults().valueForKey("oauth_token") as String
        var oauthTokenSecret : String  = NSUserDefaults.standardUserDefaults().valueForKey("oauth_secret") as String

        self.swifter = Swifter(consumerKey: Twitter["consumerKey"]!, consumerSecret: Twitter["consumerSecret"]!, oauthToken: oauthToken, oauthTokenSecret: oauthTokenSecret)
        super.init(coder: aDecoder)
    }

在此之后您可以发送消息、post 推文、建立友谊等

Swifter 有一些更新,但 Atifs 的答案仍然很棒。我将展示如何(在 2021 年)不需要每次都登录。请按照以下步骤操作(将 YOURAPPNAME 替换为您的应用名称):

  1. 在 Twitter 开发者门户的身份验证设置下添加 YOURAPPNAME:// 作为回调 URL。为此,您需要启用 3-legged OAuth,并将其添加到回调 URLS 中。您还需要输入一个网站 URL,但它可以是任何内容(我有 https://www.google.com)。还要确保(如果你想发推文)你在设置中将应用权限更改为读写

  2. 在您的播客文件中,确保您有以下行:

pod 'Swifter' , :git => 'https://github.com/mattdonnelly/Swifter.git'

不要只使用 pod 'Swifter',因为还有另一个名为 Swifter 的项目不是由 mattdonnelly 开发的,将无法运行。

  1. 在 Project Explorer 中单击您的项目,select 信息选项卡。在底部,您将看到 URL 类型。展开它并单击加号。在 URL 方案中输入 YOURAPPNAME(如果您的应用程序名称是“demoApp”,请输入 demoApp 而不是 demoApp://
  2. 如果您的应用委托尚未使用开放 url 功能(标准是没有,但我的是因为我已经 google 登录,在我的情况下我不需要做任何事情)在你的应用委托 导入 Swifter 并添加此功能:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        
    Swifter.handleOpenURL(url, callbackURL: URL(string: "YOURAPPNAME://")!)
        
    return true
}
  1. 在您的视图控制器中,您需要先授权 twitter,然后您可以执行任何操作(推文、查找提要等)。您可以使用 swifter.authorize 来打开浏览器。对于那些希望在第一次之后不需要它的人来说,这就是 swifter.verifyAccountCredentials 的用武之地。要找到 CONSUMER_KEY 和 CONSUMER_SECRET,请转到 Twitter 开发人员门户的密钥和令牌区域。
import Swifter
import AuthenticationServices

class ViewController: UIViewController, ASWebAuthenticationPresentationContextProviding {
    func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
        return self.view.window!
    }
    
    var swifter: Swifter!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if UserDefaults.standard.string(forKey: "twitterOAuthToken") == nil {
            swifter = Swifter(consumerKey: CONSUMER_KEY, consumerSecret: CONSUMER_SECRET)
            if let url = URL(string: "YOURAPPNAME://") {
                swifter.authorize(withProvider: self, callbackURL: url) { (token, response) in
                    UserDefaults.standard.set(token?.key, forKey: "twitterOAuthToken")
                    UserDefaults.standard.set(token?.secret, forKey: "twitterOAuthSecret")
                    print("signed in!!")
                }
            }
            
        } else {
            swifter = Swifter(consumerKey: CONSUMER_KEY, consumerSecret: CONSUMER_SECRET, oauthToken: UserDefaults.standard.string(forKey: "twitterOAuthToken") ?? "", oauthTokenSecret: UserDefaults.standard.string(forKey: "twitterOAuthSecret") ?? "")
            swifter.verifyAccountCredentials(includeEntities: nil, skipStatus: nil, includeEmail: nil) { (json) in
                print("signed in!")
            } failure: { (error) in
                self.swifter = Swifter(consumerKey: CONSUMER_KEY, consumerSecret: CONSUMER_SECRET)
                if let url = URL(string: "YOURAPPNAME://") {
                    self.swifter.authorize(withProvider: self, callbackURL: url) { (token, response) in
                        UserDefaults.standard.set(token?.key, forKey: "twitterOAuthToken")
                        UserDefaults.standard.set(token?.secret, forKey: "twitterOAuthSecret")
                        print("signed in!!")
                    }
                }
            }
        }
        
        
        
       let button = UIButton()
        button.layer.backgroundColor = #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1)
        button.frame = CGRect(x: 200, y:0, width: 200, height: 200)
        button.center = view.center
        button.addTarget(self, action: #selector(tweet), for: .touchUpInside)
        view.addSubview(button)

    }
    
    @objc func tweet() {
        swifter.postTweet(status: "wild") { (json) in
            print("tweeted!")
        } failure: { (error) in
            print("tweet failed")
        }
    }
}