質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Firebase

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

Swift

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

Q&A

1回答

2155閲覧

Firebaseのリアルタイムデータベースを使ったチャットで個別に連絡を取れるようにしたい

madao

総合スコア24

Firebase

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

Swift

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

0グッド

0クリップ

投稿2017/04/10 06:36

swift

1import UIKit 2import JSQMessagesViewController 3import Firebase 4import FirebaseDatabase 5 6class ChatViewController: JSQMessagesViewController { 7 var messages = [JSQMessage]() 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 senderDisplayName = "A" 12 senderId = FIRAuth.auth()?.currentUser?.uid 13 let ref = FIRDatabase.database().reference() 14 ref.observe(.value, with: { snapshot in 15 guard let dic = snapshot.value as? Dictionary<String, AnyObject> else { 16 return 17 } 18 guard let posts = dic["messages"] as? Dictionary<String, Dictionary<String, AnyObject>> else { 19 return 20 } 21 // keyとdateが入ったタプルを作る 22 var keyValueArray: [(String, Int)] = [] 23 for (key, value) in posts { 24 keyValueArray.append((key: key, date: value["date"] as! Int)) 25 } 26 keyValueArray.sort{$0.1 < $1.1} // タプルの中のdate でソートしてタプルの順番を揃える(配列で) これでkeyが順番通りになる 27 // messagesを再構成 28 var preMessages = [JSQMessage]() 29 for sortedTuple in keyValueArray { 30 for (key, value) in posts { 31 if key == sortedTuple.0 { // 揃えた順番通りにメッセージを作成 32 let senderId = value["senderId"] as! String! 33 let text = value["text"] as! String! 34 let displayName = value["displayName"] as! String! 35 preMessages.append(JSQMessage(senderId: senderId, displayName: displayName, text: text)) 36 } 37 } 38 } 39 self.messages = preMessages 40 41 self.collectionView.reloadData() 42 }) 43 } 44 45 46 override func collectionView(_ collectionView: JSQMessagesCollectionView, messageDataForItemAt indexPath: IndexPath) -> JSQMessageData { 47 return messages[indexPath.item] 48 } 49 50 51 override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath) -> JSQMessageBubbleImageDataSource? { 52 if messages[indexPath.row].senderId == senderId { 53 return JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage( 54 with: UIColor(red: 112/255, green: 192/255, blue: 75/255, alpha: 1)) 55 } else { 56 return JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage( 57 with: UIColor(red: 229/255, green: 229/255, blue: 229/255, alpha: 1)) 58 } 59 } 60 61 //cellForItemAtIndexPathのIndexPathを削除、whiteColor()、grayColor()のColor()を削除。 62 63 override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 64 65 let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as? JSQMessagesCollectionViewCell 66 if messages[indexPath.row].senderId == senderId { 67 cell?.textView?.textColor = UIColor.white 68 } else { 69 cell?.textView?.textColor = UIColor.darkGray 70 } 71 return cell! 72 } 73 74 override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 75 return messages.count 76 } 77 78 79 80 override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath) -> JSQMessageAvatarImageDataSource? { 81 82 return JSQMessagesAvatarImageFactory.avatarImage( 83 withUserInitials: messages[indexPath.row].senderDisplayName, 84 backgroundColor: UIColor.lightGray, textColor: UIColor.white, 85 font: UIFont.systemFont(ofSize: 10), diameter: 30) 86 } 87 88 89 90 91 override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) { 92 inputToolbar.contentView.textView.text = "" 93 let ref = FIRDatabase.database().reference() 94 ref.child("messages").childByAutoId().setValue( 95 ["senderId": senderId, "text": text, "displayName": senderDisplayName , "date":[".sv": "timestamp"]]) 96 } 97}

上記のように実装したんですが、固有のsenderIdとのチャットをするにはどうすればいいんでしょうか?

枠をif文を変えてなくしたりは、できるんですがやはり、文字が無くなりません。文字を乗せるようなif文もないため、どこを変えるべきかわかりません。
この場合Firebaseのルールを変えるしかないのでしょうか?ご教授願います。

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

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

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

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

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

guest

回答1

0

セキュリティを特に気にする必要がなければ、whereFieldでの絞り込み

https://firebase.google.com/docs/firestore/query-data/queries

投稿2019/11/18 05:27

編集2019/11/18 08:01
smapira

総合スコア33

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問