我将展示如何(在 2021 年)不需要每次都登录。请按照以下步骤操作(将 YOURAPPNAME 替换为您的应用名称):
在身份验证设置下,将 YOURAPPNAME:// 添加为 Twitter 开发人员门户上的回调 URL。为此,您需要启用 3-legged OAuth,并将其添加到回调 URLS 中。您还需要输入一个网站 URL,但它可以是任何东西(我有https://www.google.com)。
在您的 podfile 中,确保您有以下行:
pod 'Swifter' , :git => 'https://github.com/mattdonnelly/Swifter.git'
不要只使用 pod 'Swifter',因为有另一个名为 Swifter 的项目不是由 mattdonnelly 开发的,并且无法运行。
- 在 Project Explorer 中单击您的项目,选择 info 选项卡。在底部,您将看到 URL 类型。展开它并单击加号。在 URL Schemes 中输入 YOURAPPNAME(如果您的应用名称是“demoApp”,请输入 demoApp 而不是 demoApp://
- 如果您的应用程序委托尚未使用开放 url 功能(标准是没有,但我的是因为我有 google 登录,在我的情况下,我不需要做任何事情)在您的应用程序委托中导入 Swifter并添加此功能:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
Swifter.handleOpenURL(url, callbackURL: URL(string: "YOURAPPNAME://")!)
return true
}
- 在您的视图控制器中,您需要首先授权 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")
}
}
}