如何在Swift中不使用fireBase的情况下制作MessageKit Chat应用?

时间:2018-09-12 14:33:07

标签: ios swift4 messagekit

我需要制作 MessageKit 聊天应用程序,而无需在Swift中使用FireBase。任何人都有源代码,请把我放在这里。

谢谢。

2 个答案:

答案 0 :(得分:1)

您完全可以使用想要的任何数据库来将消息工具包绑定到Firebase。

答案 1 :(得分:1)

您可以这样做:

  1. 创建一个 MyMessagesViewController 并从 MessagesViewController MessageKit 扩展它。
final class MyMessagesViewController: MessagesViewController {
   ...
}
  1. 创建您自己的 InputBarAccessoryView 从它扩展,覆盖 override func setup() 并设置您的子视图和布局。
final class MyInputBarAccessoryView: InputBarAccessoryView {
   override func setup() {
      super.setup()
      // All your setup here
   }
}

并在 MyMessagesViewController 中创建 messageInputBar

required init(...) {
   messageInputBar = MyInputBarAccessoryView()
}

override var canBecomeFirstResponder: Bool {
   return true
}

override var inputAccessoryView: UIView? {
   return messageInputBar
}
  1. 创建您自己的 MessagesCollectionViewFlowLayout,覆盖 cellSizeCalculatorForItem(at:) 并创建您自己的 CellSizeCalculator,覆盖 messageContainerSize(for:) 以便为每条新消息返回一个 CGSize
class MyMessagesCollectionViewFlowLayout: MessagesCollectionViewFlowLayout {

   private let sizeCalculator = MyMessageSizeCalculator()

   public override func cellSizeCalculatorForItem(at indexPath: IndexPath) -> CellSizeCalculator {
      if case .custom = message.kind {
         return sizeCalculator
      }

      return super.cellSizeCalculatorForItem(at: indexPath)
   }
}
class MyMessageSizeCalculator: MessageSizeCalculator {
   override func messageContainerSize(for message: MessageType) -> CGSize {
      return size // Here you have to calculate your cell size based on message
   }
}
  1. MyMessagesViewController viewDidLoad 方法中,创建 MessageCollectionView,为单元格注册笔尖并设置委托。
override func viewDidLoad() {
   super.viewDidLoad()
   messageCollectionView = MessageCollectionView(
      frame: .zero,
      collectionViewLayout: MyCollectionViewFlowLayout()
   )

   // Common setups here

   // delegates
   messagesCollectionView.messagesDataSource = self
}
  1. MessagesDataSourceDelegate 方法上,实现 currentSender() 并返回您的 OWN currentSender,就像您在使用 Firebase 时必须做的那样,但现在您必须使用服务器发送者 ID 或类似的东西。在您创建自己的自定义单元格时,实施 customCell(for:, at:, in:) 并正确地将您注册的单元格出列。
func currentSender() -> SenderType {
   // You have to create some model that extends from SenderType and return here okay?
   return myClientSender
}

func customCell(
   for message: MessageType,
   at indexPath: IndexPath,
   in messagesCollectionView: MessagesCollectionView) -> UICollectionViewCell {
   
   // dequeue correctly the cell based on message and indexPath
   return cell
}

这是 MessageKit 自定义单元的基本实现。显然你想实现更多的东西。

希望能帮到你 :)