我在使用 Firebase UI 在我的应用程序上登录 Twitter 时遇到问题。
我已经设置了google、facebook和twitter。 google 和 facebook 运作良好。
但是推特不行。
当我点击使用 Twitter 登录时,它会打开 Twitter 应用程序并显示此屏幕。
但是,在我点击连接按钮并返回我正在创建的应用程序之后,没有任何反应。
我现在的代码是这样的:
import UIKit
import Firebase
import FirebaseAuthUI
import FirebaseGoogleAuthUI
import FirebaseFacebookAuthUI
import FirebaseTwitterAuthUI
import FirebaseDatabaseUI
import TwitterKit
class WelcomeViewController: UIViewController {
var authUI: FUIAuth { get { return FUIAuth.defaultAuthUI()!}}
let providers: [FUIAuthProvider] = [FUIGoogleAuth(),FUITwitterAuth(),
FUIFacebookAuth()]
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
}
@IBAction func startButtonTapped(_ sender: Any) {
checkLoggedIn()
}
func authUI(_ authUI: FUIAuth, didSignInWith user: User?, error: Error?) {
if user != nil {
self.performSegue(withIdentifier: "toNewUser", sender: nil)
}
}
}
extension WelcomeViewController: FUIAuthDelegate {
func checkLoggedIn() {
self.setupLogin()
Auth.auth().addStateDidChangeListener{auth, user in
if user != nil{
print("success")
self.performSegue(withIdentifier: "toNewUser", sender: nil)
} else {
print("fail")
self.login()
}
}
}
func setupLogin() {
authUI.delegate = self
authUI.providers = providers
authUI.isSignInWithEmailHidden = true
}
func login() {
let authViewController = authUI.authViewController()
self.present(authViewController, animated: true, completion: nil)
}
}
控制台日志是这样的:
2018-11-04 14:49:28.269684+0900 ciel[8190:2052631] [BoringSSL] nw_protocol_boringssl_error(1584) [C13.1:2][0x104715070] Lower protocol stack error: 53
2018-11-04 14:49:28.272673+0900 ciel[8190:2052631] TIC Read Status [13:0x283b98a80]: 1:53
2018-11-04 14:49:28.272744+0900 ciel[8190:2052631] TIC Read Status [13:0x283b98a80]: 1:53
我检查了 AppDelegate 和 info.plist 中的 TWTRTwitter.sharedInstance().start()。我错了什么?
我意识到的一件事是,只有当我点击 Twitter 时,它会打开 Twitter iOS 应用程序,但其他 2 个会打开浏览器。
最佳答案
您好,将下面的建议添加到您的文件中
在 plist 文件中
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>twitterkit-yourConsumerKey</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>twitter</string>
<string>twitterauth</string>
</array><key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>twitterkit-yourConsumerKey</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>twitter</string>
<string>twitterauth</string>
</array>
在 AppDelegate 中
import TwitterKit
func application(_ application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
TWTRTwitter.sharedInstance().start(withConsumerKey:”yourConsumerKey”,
consumerSecret:”yourSecretKey”)
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
TWTRTwitter.sharedInstance().application(app, open: url, options: options)
return true
}
在您的登录屏幕中
import TwitterKit
btn_Twitter.addTarget(self, action: #selector(loginWithTwitter), for: .touchUpInside)
func loginWithTwitter(){
TWTRTwitter.sharedInstance().logIn(completion: { (session, error) in
if (session != nil) {
print("signed in as \(session?.userName ?? "")");
self.getEmailAddress(session:session!)
} else {
print("error: \(error?.localizedDescription ?? "")");
}
})
}
func getEmailAddress(session:TWTRSession){
var theTwitterID:String = "No Email"
let client = TWTRAPIClient.withCurrentUser()
let request = client.urlRequest(withMethod: "GET",
urlString: "https://api.twitter.com/1.1/account/verify_credentials.json",
parameters: ["include_email": "true", "skip_status": "true"],
error: nil)
client.sendTwitterRequest(request, completion: { (response, data, connectionError) in
if (connectionError == nil) {
do{
let json = try JSONSerialization.jsonObject(with: data!, options: [])
print("Json response: ", json)
let myDict:NSDictionary = json as! NSDictionary
print(myDict.value(forKey: "name") ?? "")
let screenName:String = myDict.value(forKey: "screen_name") as! String;
let fullName:String = myDict.value(forKey: "name") as! String
let picture:String = myDict.value(forKey: "profile_image_url") as! String
if let emailId:String = myDict.value(forKey: "email") as? String{
print("Twitter Email: \(emailId)")
print("Twitter Screen Name: \(screenName)")
print("Twitter Full Name: \(fullName)")
print("Twitter Picture: \(picture)")
theTwitterID = screenName
let fullNameArr = fullName.characters.split{$0 == " "}.map(String.init)
let firstName: String = fullNameArr[0]
let lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil
print("Twitter FirstName: \(firstName)")
print("Twitter LastName: \(lastName!)")
}else{
print("Error getting your email id. Please check permission for Twitter.")
}
}catch{
}
}else {
print("Error: \(connectionError!)")
}
})
}
关于ios - swift4 Firebase UI 身份验证不适用于 twitter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53138151/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我正在尝试复制此GETcurl请求:curl-D--XGET-H"Authorization:BasicdGVzdEB0YXByZXNlYXJjaC5jb206NGMzMTg2Mjg4YWUyM2ZkOTY2MWNiNWRmY2NlMTkzMGU="-H"Content-Type:application/json"http://staging.example.com/api/v1/campaigns在Ruby中,通过电子邮件+apikey生成身份验证:auth="Basic"+Base64::encode64("test@example.com:4c3186288ae23fd9661c
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我需要在rail3中使用标准注册/登录/忘记密码功能进行身份验证。是否有大多数人为此使用的插件或其他东西? 最佳答案 我不确定最常用的方法是什么-但可以肯定的是,Plataformatec的“Devise”是一个非常流行的方法:http://github.com/plataformatec/devise我已经尝试了一些authgem,对我来说,它是最简单的设置和修改以满足我的需要。它内置了密码恢复、帐户确认(如果需要)和其他一些非常方便的功能。 关于ruby-on-rails-在Rail
我正在为我的用户实现一些rubyonrails代码推特内容。我正在创建正确的oauth链接...类似http://twitter.com/oauth/authorize?oauth_token=y2RkuftYAEkbEuIF7zKMuzWN30O2XxM8U9j0egtzKv但在我的测试帐户授予对twitter的访问权限后,它会弹出一个页面,上面写着“您已成功授予对.我不知道用户应该在哪里输入此PIN以及他们为什么必须这样做。我认为这不是必要的步骤。Twitter应该将用户重定向到我在应用程序设置中提供的回调URL。有谁知道为什么会这样?更新我找到了thisarticle声明我需
当我尝试启动sinatra时,出现以下错误/var/lib/gems/1.9.1/gems/sinatra-1.4.4/lib/sinatra/base.rb:1488:instart_server':undefinedmethodrun'forHTTP:模块(NoMethodError)require'sinatra/base'require_relative"twt.rb"classSinatraApp在“twt.rb”中我需要Twitter(5.7.1)require'twitter'classTwitattr_accessor:clientdefinitialize(consu