【问题标题】:How to Authorize Twitter with Swifter如何使用 Swifter 授权 Twitter
【发布时间】:2015-03-16 08:29:55
【问题描述】:

有人可以向我解释如何使用 Swifter for 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

    // ...

})

我收到一条错误消息,提示“回调 URL 的未解析标识符”,这显然是因为我没有定义它,但是当我定义它时,它会显示“调用中的额外参数”。还有没有更简单的授权方式?在此之后,我应该如何让用户屏幕名称/用户 ID 在 get-home-timeline 部分中使用。我知道我在做一些完全错误的事情,而且我对这一切都很陌生,所以任何帮助都将不胜感激。

【问题讨论】:

    标签: ios xcode swift twitter


    【解决方案1】:

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

    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 类中添加以下内容。不要忘记导入SwifteriOS

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

    现在在 Project Explorer 中单击您的项目,选择 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)
        }
    

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

    【讨论】:

    • 嗨@atif-farrukh。重载的 application() 函数——带有“openURL url: NSURL!”的函数在其中 - 如何让自己的应用调用该方法?
    • right @atif-farrukh,在 URL 类型中添加一个 URL 方案应该足以使所说的 application() 函数被调用,如“注册自定义 URL 方案”标题下所述页面:developer.apple.com/library/ios/documentation/iPhone/Conceptual/…。但是,仍然没有调用 func 。可能是因为我使用的是 6.3 Beta 版本的 XCode,我现在将对其进行测试。
    • 没有@atif-farrukh,“openURL url:NSURL!” func application()... 的版本也没有在稳定版 XCode 6.2 中被调用。如何强制调用它?
    • @TheMotherofJosephBeuys:从 Xcode 6.3.2 开始,应用程序委托的方法 - application:openURL:sourceApplication:annotation: 将按预期调用 — 在 Twitter 回调您的自定义 url 方案的那一刻。
    • 拜托,我到处找,但似乎找不到这个解决方案。我是如何做到的,所以用户不必每次都登录。保存访问令牌和密码?我已经尝试过 let newSwifter = Swifter(consumerKey: TWITTER_CONSUMER_KEY, consumerSecret: TWITTER_CONSUMER_SECRET_KEY, oauthToken: AuthViewController.MYACCESSTOKEN, oauthTokenSecret: AuthViewController.MYSECRET)。但它现在可以工作了,请帮忙。
    【解决方案2】:

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

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

    2. 在您的 podfile 中,确保您有以下行:

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

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

    1. 在项目浏览器中单击您的项目,选择信息选项卡。在底部,您将看到 URL 类型。展开它并单击加号。在 URL Schemes 中输入 YOURAPPNAME(如果您的应用名称是“demoApp”,请输入 demoApp 而不是 demoApp://
    2. 如果您的应用程序代理尚未在您的应用程序代理中使用开放 url 功能(标准是没有,但我的是因为我有 google 登录,在我的情况下我不需要做任何事情)在您的应用程序代理中 import 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")
            }
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 2011-04-09
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 2013-01-25
      • 2011-12-14
      • 2015-09-16
      • 2011-07-28
      相关资源
      最近更新 更多