🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2622閲覧

FirebaseでのTwitterの認証データをFirestoreに保存したい

Soul3725

総合スコア21

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2019/11/29 08:06

実装したいこと

FirebaseでのTwitterログイン成功時に返ってきたresult?.additionalUserInfo?.profileからid, name, screen_nameを取得してFirestoreに保存する。
ドキュメント名はAuth.auth().currentUser!から取得したuidを使用。

問題点

 下記コードを実行するとsetDataの部分で以下のようなエラーが出てクラッシュします。
Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
uIDnilになってしまってるのではと思い書き込みの直前でprintにて値を確認しましたがきちんと値は入っていました。
その他のエラーはありませんでした。
調べてみましたがlabelのOutlet接続がされてないパターンしか見つけることができず今回の件にはあまり関係がないように感じ解決方法を見つけれずにいます。
解決策をご教授いただけると幸いです。

書き込みたいデータ構造

users{ uID{ "ID": "displayName": "screenName": } … }

現在記述中のコード(2019/11/29最終更新)

swift

1 var provider: OAuthProvider? 2 var db: Firestore! 3 4 func signInWithTwitter(){ 5 provider!.getCredentialWith(nil) { credential, error in 6 if error != nil { 7 //Handleエラー 8 print("error") 9 return 10 } 11 if credential != nil { 12 Auth.auth().signIn(with: credential!) { (result, error) in 13 if error != nil { 14 //ログインエラー 15 print("error") 16 return 17 } 18 //アクセストークン・シークレットトークンをunwrap 19 let credential = result?.credential as? OAuthCredential 20 let accessToken = credential?.accessToken 21 let secretToken = credential?.secret 22 //Twitterアクセストークン・シークレットトークンの値を保存 23 UserDefaults.standard.set(accessToken, forKey:"twitterAccessToken") 24 UserDefaults.standard.set(secretToken, forKey:"twitterSecretToken") 25 26 //ユーザー別のDBを構築 27 let user = Auth.auth().currentUser! 28 let uID = user.uid 29 let userInfo = result?.additionalUserInfo?.profile 30 let twtrID = userInfo!["id"] as! Int 31 let displayName = userInfo!["name"] as! String 32 let screenName = userInfo!["screen_name"] as! String 33 self.db.collection("users").document(uID).setData([ 34 "ID": twtrID, 35 "displayName": displayName, 36 "screenName": screenName 37 ]) { err in 38 if let err = err { 39 print("Error writing document: (err)") 40 } else { 41 print("Document successfully written!") 42 //HomeViewControllerへtoMainを介して遷移 43 self.performSegue(withIdentifier: "toMain", sender: nil) 44 } 45 } 46 } 47 } 48 } 49 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Firestoreインスタンスの生成の仕方がおかしい気がします。

誤 self.db.collection("users") 正 self.db.firestore().collection("users")

公式ドキュメント
https://firebase.google.com/docs/firestore/quickstart?hl=ja#initialize

投稿2019/11/29 10:35

popai306

総合スコア157

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Soul3725

2019/12/02 15:08

初期に記述したつもりでしたが修正を繰り返しているうちに誤って消えていたみたいです。 無事書き込みができるようになりましたご教授ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問