Приложение чата, использующее firebase - PullRequest
0 голосов
/ 04 февраля 2020

1.Первый из всех установленных следующих модулей:

модуль 'Модуль Firebase / Core' Модуль 'Firebase / Storage' Модуль 'Firebase / Auth' Модуль 'Firebase / База данных' Модуль 'JSQMessagesViewController'

2. Затем создайте учетную запись в учетной записи firebase, получите файл googleService-info.plist и добавьте его в каталог проекта

Реализация класса ниже

импорт UIKit импорт FirebaseAuth импорт FirebaseDatabase импорт JSQMessagesViewController

struct Constants {struct refs {stati c let database Root = Database.database () .reference () stati c let databaseChats = database Root .child ("chats")}} class FirstViewController: JSQMessagesViewController {

var messages = [JSQMessage]()

lazy var outgoingBubble: JSQMessagesBubbleImage = {
    return JSQMessagesBubbleImageFactory()!.outgoingMessagesBubbleImage(with: UIColor.jsq_messageBubbleBlue())
}()

lazy var incomingBubble: JSQMessagesBubbleImage = {
    return JSQMessagesBubbleImageFactory()!.incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleLightGray())
}()

override func viewDidLoad() {
    super.viewDidLoad()

    let defaults = UserDefaults.standard

    if  let id = defaults.string(forKey: "jsq_id"),
        let name = defaults.string(forKey: "jsq_name")
    {
        senderId = id
        senderDisplayName = name
    }
    else
    {
        senderId = String(arc4random_uniform(999999))
        senderDisplayName = ""

        defaults.set(senderId, forKey: "jsq_id")
        defaults.synchronize()

        showDisplayNameDialog()
    }

    title = "Chat: \(senderDisplayName!)"

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(showDisplayNameDialog))
    tapGesture.numberOfTapsRequired = 1

    navigationController?.navigationBar.addGestureRecognizer(tapGesture)

    inputToolbar.contentView.leftBarButtonItem = nil
    collectionView.collectionViewLayout.incomingAvatarViewSize = CGSize.zero
    collectionView.collectionViewLayout.outgoingAvatarViewSize = CGSize.zero


    let query = Constants.refs.databaseChats.queryLimited(toLast: 10)

    _ = query.observe(.childAdded, with: { [weak self] snapshot in

        if  let data        = snapshot.value as? [String: String],
            let id          = data["sender_id"],
            let name        = data["name"],
            let text        = data["text"],
            !text.isEmpty
        {
            if let message = JSQMessage(senderId: id, displayName: name, text: text)
            {
                self?.messages.append(message)

                self?.finishReceivingMessage()
            }
        }
    })
}


@IBAction func btnNextClicked(_ sender: UIButton) {

    let vc = SecondViewController()
    self.navigationController?.pushViewController(vc, animated: true)
}

@IBAction func btnSignInClicked(_ sender: UIButton) {

    Auth.auth().signInAnonymously(completion: nil)
}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData!
{
    return messages[indexPath.item]
}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
    return messages.count
}
override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource!
{
    return messages[indexPath.item].senderId == senderId ? outgoingBubble : incomingBubble
}
override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource!
{
    return nil
}
override func collectionView(_ collectionView: JSQMessagesCollectionView!, attributedTextForMessageBubbleTopLabelAt indexPath: IndexPath!) -> NSAttributedString!
{
    return messages[indexPath.item].senderId == senderId ? nil : NSAttributedString(string: messages[indexPath.item].senderDisplayName)
}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForMessageBubbleTopLabelAt indexPath: IndexPath!) -> CGFloat
{
    return messages[indexPath.item].senderId == senderId ? 0 : 15
}
override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!)
{
    let ref = Constants.refs.databaseChats.childByAutoId()

    let message = ["sender_id": senderId, "name": senderDisplayName, "text": text]

    ref.setValue(message)

    finishSendingMessage()
}

@objc func showDisplayNameDialog()
{
    let defaults = UserDefaults.standard

    let alert = UIAlertController(title: "Your Display Name", message: "Before you can chat, please choose a display name. Others will see this name when you send chat messages. You can change your display name again by tapping the navigation bar.", preferredStyle: .alert)

    alert.addTextField { textField in

        if let name = defaults.string(forKey: "jsq_name")
        {
            textField.text = name
        }
        else
        {
            let names = ["Ford", "Arthur", "Zaphod", "Trillian", "Slartibartfast", "Humma Kavula", "Deep Thought"]
            textField.text = names[Int(arc4random_uniform(UInt32(names.count)))]
        }
    }

    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak self, weak alert] _ in

        if let textField = alert?.textFields?[0], !textField.text!.isEmpty {

            self?.senderDisplayName = textField.text

            self?.title = "Chat: \(self!.senderDisplayName!)"

            defaults.set(textField.text, forKey: "jsq_name")
            defaults.synchronize()
        }
    }))

    present(alert, animated: true, completion: nil)
}

}

enter code here
...