消息工具包消息DataSoure代理未被调用

时间:2019-10-31 12:41:07

标签: swift firebase-realtime-database firebase-authentication xcode10 messagekit

我使用MessageKit关注了raywenderlich的聊天应用程序教程https://www.raywenderlich.com/5359-firebase-tutorial-real-time-chat#toc-anchor-008。 MessageKit有点过时了,因此我必须进行一些更改,才能最终摆脱所有错误。 我已成功将Chat App集成到我自己的项目中,并且在单击“发送”按钮之前,它一直有效,文本不会离开消息输入栏。此外,教程团队创建的先前消息也不会显示(应该显示,因为我正在使用其包标识符以及GoogleService-info plist文件。)

我相信它与Message.Swift文件中的'senderId'或Firebase的用户身份验证有关(我正在使用'Auth.auth()。signInAnonymously(completion:nil)'),但我仍然无法弄清楚它是什么。

Message.Swift文件:

struct Message: MessageType {

 let id: String?
 let content: String
 let sentDate: Date
 let sender: SenderType

 var kind: MessageKind {
  if let image = image {
    return .photo(image as! MediaItem)
 } else {
  return .text(content)
 }
}

var messageId: String {
  return id ?? UUID().uuidString
}

var image: UIImage? = nil
var downloadURL: URL? = nil

init(user: User, content: String) {
  sender = Sender(id: user.uid, displayName: AppSettings.displayName)
  self.content = content
  sentDate = Date()
  id = nil
}

init(user: User, image: UIImage) {
  sender = Sender(id: user.uid, displayName: AppSettings.displayName)
  self.image = image
  content = ""
  sentDate = Date()
  id = nil
 }

 init?(document: QueryDocumentSnapshot) {
  let data = document.data()

  guard let sentDate = data["created"] as? Date else {
  return nil
 }
 guard let senderID = data["senderID"] as? String else {
  return nil
}
guard let senderName = data["senderName"] as? String else {
  return nil
}

id = document.documentID

self.sentDate = sentDate
sender = Sender(id: senderID, displayName: senderName)

if let content = data["content"] as? String {
  self.content = content
  downloadURL = nil
} else if let urlString = data["url"] as? String, let url = URL(string: urlString) {
  downloadURL = url
  content = ""
} else {
  return nil
 }
}

}

extension Message: DatabaseRepresentation {

 var representation: [String : Any] {
  var rep: [String : Any] = [
    "created": sentDate,
    "senderID": sender.senderId,
    "senderName": sender.displayName
   ]

  if let url = downloadURL {
  rep["url"] = url.absoluteString
} else {
  rep["content"] = content
}

  return rep
 }

}

extension Message: Comparable {

  static func == (lhs: Message, rhs: Message) -> Bool {
  return lhs.id == rhs.id
 }

   static func < (lhs: Message, rhs: Message) -> Bool {
   return lhs.sentDate < rhs.sentDate
 }

}

ChatViewController:

private func save(_ message: Message) {
reference?.addDocument(data: message.representation) { error in
  if let e = error {
    print("Error sending message: \(e.localizedDescription)")
    return
  }

  self.messagesCollectionView.scrollToBottom()
 }
}



extension ChatViewController: MessagesLayoutDelegate {

func avatarSize(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGSize {
return .zero
 }

func footerViewSize(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGSize {
return CGSize(width: 0, height: 8)
}

func heightForLocation(message: MessageType, at indexPath: IndexPath, with maxWidth: CGFloat, in messagesCollectionView: MessagesCollectionView) -> CGFloat {

return 0
}

}


extension ChatViewController: MessagesDataSource {
func currentSender() -> SenderType {
     return Sender(id: user.uid, displayName: AppSettings.displayName)
}

func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int {
     return messages.count
}

func numberOfMessages(in messagesCollectionView: MessagesCollectionView) -> Int {
    return messages.count
}


func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType {
return messages[indexPath.section]
}

func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
let name = message.sender.displayName
return NSAttributedString(
  string: name,
  attributes: [
    .font: UIFont.preferredFont(forTextStyle: .caption1),
    .foregroundColor: UIColor(white: 0.3, alpha: 1)
  ]
)
 }

}


extension ChatViewController: MessageInputBarDelegate {

  func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) {
  let message = Message(user: user, content: text)

  save(message)
  inputBar.inputTextView.text = ""
}

我的viewDidLoad():

override func viewDidLoad() {
super.viewDidLoad()

guard let id = channel.id else {
  navigationController?.popViewController(animated: true)
  return
}

reference = db.collection(["channels", id, "thread"].joined(separator: "/"))

messageListener = reference?.addSnapshotListener { querySnapshot, error in
  guard let snapshot = querySnapshot else {
    print("Error listening for channel updates: \(error?.localizedDescription ?? "No error")")
    return
  }

  snapshot.documentChanges.forEach { change in
    self.handleDocumentChange(change)
  }
}

  messageInputBar.delegate = self
  messagesCollectionView.messagesDataSource = self
  messagesCollectionView.messagesLayoutDelegate = self
  messagesCollectionView.messagesDisplayDelegate = self
}

1 个答案:

答案 0 :(得分:0)

看来,您的Pod或迦太基文件使用了最新版本(例如“ 3.0.0”)的messageKit。因此,委托中有一些更改。 尝试更改这种代码的稳定性:

extension ChatViewController: MessageInputBarDelegate {

  func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) {
    let message = Message(user: user, content: text)

    save(message)
    inputBar.inputTextView.text = ""
}

下面带有代码

extension ChatViewController: MessageInputBarDelegate {
  func inputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) {

    let message = Message(user: user, content: text)

    save(message)
    inputBar.inputTextView.text = ""
  }
}

如果要使用旧语法,请在pod或迦太基文件中将messageKit版本设置为旧版本。