Twitter認証で困っています。ご助言頂けますと幸いです。
ユーザーがアプリに新規登録の際に、Twitter認証を可能にしたく思います。TwitterのAPIを用いて、情報を取得し、Firebaseに連携させています。Twitterのアプリが入っていれば、そのままアプリが開き、連携ボタンをワンプッシュするだけ登録できるようにしたいです。
下記のコードで実行しますと、スクリーンショットの通り上手く行きますが、
![
キャンセルを押すと、次にWeb版のTwitter?(SFSafariView)が呼ばれてしまいます。
あるいは、最初のTwitterネイティブアプリで連携を押しても、時たま、その後にWeb版Twitter画面が出てくることがあります。(呼び出されず、そのまま先に進めることもあります。)一切Web版が出てこないようにする、あるいは、Twitterアプリがインストールされていない時にだけWeb版を呼び出すといった処理をするにはどうしたら良いでしょうか。アドバイス頂けますと幸いです。下記コード記載します。
Swift
1import TwitterKit 2 3class LoginVC: UIViewController { 4 var twitterSession: TWTRSession? 5 var uid2: String = "" 6 var name: String = "" 7 var username: String = "" 8 var profileImage: UIImage? 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 } 14 15 @IBAction func loginWithTwitter(_ sender: Any) { 16 TWTRTwitter.sharedInstance().logIn { (session, err) in 17 if let err = err { 18 return 19 } 20 guard let session = session else { return } 21 self.twitterSession = session 22 self.signupToFirebaseWithTwitter() 23 } 24 25 } 26 27 func signupToFirebaseWithTwitter(){ 28 guard let twitterSession = twitterSession else {return} 29 let credential = TwitterAuthProvider.credential(withToken: twitterSession.authToken, secret: twitterSession.authTokenSecret) 30 Auth.auth().signIn(with: credential) { (user, err) in 31 if let err = err { 32 print("Failed to create Firebase user:", err) 33 } 34 self.fetchTwitterUser() 35 } 36 } 37 38 func fetchTwitterUser() { 39 guard let twitterSession = twitterSession else { return } 40 let client = TWTRAPIClient() 41 client.loadUser(withID: twitterSession.userID) { (user, err) in 42 if let err = err { 43 return 44 } 45 guard let user = user else { return } 46 self.name = user.name 47 self.username = twitterSession.userName 48 let profilePictureUrl = user.profileImageLargeURL 49 guard let url = URL(string: profilePictureUrl) else { 50 return 51 } 52 53 URLSession.shared.dataTask(with: url, completionHandler: { (data, response, err) in 54 if err != nil { 55 return 56 } 57 guard let data = data else { 58 return 59 } 60 self.profileImage = UIImage(data: data) 61 self.saveUserIntoFirebaseDatabase() 62 63 }).resume() 64 65 } 66 67 } //func end 68 69 func saveUserIntoFirebaseDatabase() { 70 71 guard let uid = Auth.auth().currentUser?.uid, 72 let profileImageUploadData = profileImage?.jpegData(compressionQuality: 1) else {return} 73 74 let imageName = UUID().uuidString 75 76 Storage.storage().reference().child("profile_images").child(imageName).putData(profileImageUploadData, metadata: nil) { (metadata, err) in 77 let profileImageUrl = metadata?.downloadURL()?.absoluteString 78 print("Successfully uploaded profile image into Firebase storage with URL") 79 let dictionaryValues = ["name": self.name, 80 "username": self.username, 81 "profileImageUrl": profileImageUrl, 82 "uid": uid 83 ] 84 let values = [uid: dictionaryValues] 85 86 Database.database().reference().child("Contacts").updateChildValues(values, withCompletionBlock: { (err, reference) in 87 print("success") 88 }) 89 } 90 let storyboard: UIStoryboard = self.storyboard! 91 let nextVC = storyboard.instantiateViewController(withIdentifier: "TabBarController") 92 self.present(nextVC, animated: true, completion: nil) 93 } 94} 95
あなたの回答
tips
プレビュー