IOS开发入门之如何利用Firebase开发iOS 实时聊天功能
凌雪 2018-10-23 来源 :网络 阅读 1287 评论 0

摘要:本文将带你了解IOS开发入门如何利用Firebase开发iOS 实时聊天功能,希望本文对大家学IOS有所帮助。

本文将带你了解IOS开发入门如何利用Firebase开发iOS 实时聊天功能,希望本文对大家学IOS有所帮助。


       

如何利用Firebase开发iOS   实时聊天功能。貌似市场上的主流 app 都有聊天功能,所以,我们的 app   也应当添加聊天功能啦。

然而,开发一个聊天工具是一个令人畏惧的工作。除了要有专门用于聊天的本地 UIKit   控件,我们还需要一个服务器来协调用户之间的消息和对话。

幸运的是,有一些不错的框架可以帮助我们:在Firebase   的帮助下,我们可以不用写一行后端代码就可同步实时数据,而JSQMessagesViewController 则给我们提供了一个与原生消息 app   相似的消息传递 UI 。

在这篇 Firebase 教程中,我们将开发一个   RIC(Really Instant Chat) – 匿名聊天应用。如果你使用过 IRC 或者 Slack,这种   app 你应该很熟悉了。

在此教程,您将学习到如下内容:

使用   CocoaPods 设置 Firebase SDK 和 JSQMessagesViewController。 使用 Firebase 数据库实时同步数据。 Firebase 匿名身份验证。 使用   JSQMessagesViewController 做为完整的聊天界面。 指示用户何时输入。 使用 Firebase 存储。

开始

下载初始工程 the starter project here   。现在,它包含一个简单的虚拟登录界面。

我们使用 CocoaPods 下载 Firebase SDK   和JSQMessagesViewController。如果你还不会使用 CocoaPods ,请先学习我们这篇教程 Cocoapods with   Swift tutorial。

在项目目录下,进入终端,打开根目录下的 Podfile   文件,添加如下依赖代码:


   

pod   'Firebase/Storage'

pod 'Firebase/Auth'

pod 'Firebase/Database'

pod 'JSQMessagesViewController'

   

保存文件,命令行执行如下命令:


pod   install

   

完成依赖包下载后,在   Xcode 打开 ChatChat.xcworkspace 。在运行之前,先配置 Firebase   。

如果你从未使用过   Firebase,首先你需要创建一个账号。不用担心,这些是免费的。

注:Firebase   的操作细节,可以看这里Getting Started with Firebase   tutorial.

创建 Firebase 账号

登录 the   Firebase signup site,创建账号,然后创建一个工程。

按照指示将 Firebase 添加到 iOS   应用程序,复制 GoogleService-Info.plist 配置文件到你的项目。它包含与应用程序的   Firebase 集成所需的配置信息。

build and run   ,你将看到如下界面:

允许匿名认证

Firebase允许用户通过电子邮件或社交帐户登录,但它也可以匿名地对用户进行身份验证,为用户提供唯一的标识符,而不需要了解他们任何信息。

要设置匿名验证,打开   Firebase 应用程序的 Dashboard,选择左侧的 Auth 选项,单击 “Sign-In” 方法,然后选择“ Anonymous”,打开 “   Enable” 按钮,然后单击 “Save”。

像这样,我们启用了超级秘密隐形模式   ! 好吧,虽然这只是匿名身份验证,但它仍然很酷。

登录

打开 LoginViewController.swift,添加   import UIKit:


   

import Firebase

   

要登录聊天,app   需要使用 Firebase 身份验证服务进行身份验证。将以下代码添加到loginDidTouch(_:):


   

if nameField?.text != "" { //   1

  FIRAuth.auth()?.signInAnonymously(completion: { (user, error)   in //   2

    if let err = error { // 3

      print(err.localizedDescription)

      return

    }

 

    self.performSegue(withIdentifier:   "LoginToChat", sender: nil) // 4

  })

}

   

注释如下:
1.   首先,确保 name field 非空。
2.使用 Firebase Auth API 匿名登录,该方法带了一个方法块儿,方法块儿传递   user 和 error 信息。
3. 在完成方法块里,检查是否有认证错误,如果有,终止运行。
4.   最后,如果没有错误异常,进入 ChannelListViewController 页面。

Build and   run,输入你的名字,然后进入 app。

创建 Channels 列表

一旦用户登录了,   app 导航到 ChannelListViewController 页面, 该页面展示给用户当前频道列表, 给他们提供选择创建新通道。该页面使用两个 section   的表视图。第一个 section 提供了一个表单,用户可以在其中创建一个新的通道,第二 section   列出所有已知通道。

本小节,我们将学到:
1.   保存数据到 Firebase 数据库
2. 监听保存到数据库的新数据。

在   ChannelListViewController.swift 的头部添加如下代码:


   

import Firebase

 

enum Section: Int {

  case createNewChannelSection   = 0

  case currentChannelsSection   

}

   

紧随导入语句之后的   enum 中包含两个表视图 section   。

接下来,在类内,添加如下代码:


   

// MARK: Properties

var senderDisplayName: String? // 1

var newChannelTextField: UITextField? // 2

private var channels: [Channel] = [] // 3     

   

注释如下   :

添加一个存储 sender name 的属性。 添加一个 text field ,稍后我们会使用它添加新的 Channels。   添加一个空的 Channel 对象数组,存储你的 channels。这是 starter   项目中提供的一个简单的模型类,它只包含一个名称和一个ID。

接下来,我们需要设置 UITableView   来呈现新的通道和可用的通道列表。在 ChannelListViewController.swift   中添加以下代码:


   

// MARK:   UITableViewDataSource

override func numberOfSections(in tableView: UITableView)   -> Int {

  return 2 //   1

}

 

override func   tableView(_ tableView: UITableView, numberOfRowsInSection section: Int)   -> Int { //   2

  if let   currentSection: Section = Section(rawValue: section)   {

    switch currentSection   {

    case .createNewChannelSection:

      return 1

    case .currentChannelsSection:

      return channels.count

    }

  } else {

    return 0

  }

}

 

// 3

override func tableView(_ tableView: UITableView, cellForRowAt   indexPath: IndexPath) -> UITableViewCell   {

  let reuseIdentifier = (indexPath as   NSIndexPath).section == Section.createNewChannelSection.rawValue ?   "NewChannel" : "ExistingChannel"

  let cell = tableView.dequeueReusableCell(withIdentifier:   reuseIdentifier, for: indexPath)

 

  if (indexPath as NSIndexPath).section ==   Section.createNewChannelSection.rawValue {

    if let createNewChannelCell = cell as? CreateChannelCell   {

      newChannelTextField =   createNewChannelCell.newChannelNameField

    }

  } else if (indexPath as NSIndexPath).section == Section.currentChannelsSection.rawValue   {

    cell.textLabel?.text = channels[(indexPath as   NSIndexPath).row].name

  }

 

  return   cell

}

   

对于以前使用过   UITableView 的人来说,这应该是非常熟悉的,但简单地说几点:
1. 设置   Sections。请记住,第一部分将包含一个用于添加新通道的表单,第二部分将显示一个通道列表。
2. 为每个部分设置行数。第一部分设置为   1,第二部分设置个数为通道的个数。
3. 定义每个单元格的内容。对于第一个部分,我们将 cell 中的 text field   存储在newChannelTextField 属性中。对于第二部分,您只需将单元格的 text field   标签设置为通道名称。

为了确保这一切正常工作,请在属性下面添加以下代码:


   

override func viewDidAppear(_ animated: Bool)   {

  super.viewDidAppear(animated)

 

  channels.append(Channel(id: "1", name: "Channel1"))

  channels.append(Channel(id: "2", name: "Channel2"))

  channels.append(Channel(id: "3", name: "Channel3"))

  self.tableView.reloadData()

}

   

这只是向通道数组添加了一些虚拟通道。

Build   and run app ; 再次登录,我们现在应该可以看到表单创建一个新的通道和三个虚拟通道:

太棒了!   接下来,我们需要让它与 Firebase 一起工作了。 :]

Firebase 数据结构

在实现实时数据同步之前,首先让我们花一会儿功夫想想数据结构。

Firebase   database 以 NoSQL JSON   格式存储数据。

基本上,Firebase数据库中的所有内容都是JSON对象,而这个JSON对象的每个键都有自己的URL。

下面是一个说明我们的数据如何作为   JSON 对象的示例:


   

{

  "channels": {

    "name": "Channel 1"

    "messages": {

      "1": {

        "text": "Hey person!",

        "senderName": "Alice"

        "senderId": "foo"

      },

      "2": {

        "text": "Yo!",

        "senderName": "Bob"

        "senderId": "bar"

      }

    }

  }

}

   

Firebase   数据库支持非规范化的数据结构,因此可以为每个消息项包含   senderId。一个非规范化的数据结构意味着我们将复制大量的数据,但好处是可以更快的检索数据。

实时 Channel   同步

首先,删除上面添加的viewDidAppear(_:)代码,然后在其他以下属性中添加以下属性:


   

private lazy var channelRef: FIRDatabaseReference =   FIRDatabase.database().reference().child("channels")

private var channelRefHandle:   FIRDatabaseHandle?

   

channelRef   将用于存储对数据库中通道列表的引用;channelRefHandle 将为引用保存一个句柄,以便以后可以删除它。

接下来,我们需要查询Firebase数据库,并得到一个在我们的表视图中显示的通道列表。添加以下代码:


   

// MARK: Firebase related methods

private func observeChannels() {

  // Use the observe method to listen for   new

  // channels being written to the Firebase   DB

  channelRefHandle = channelRef.observe(.childAdded, with: {   (snapshot) -> Void in //   1

    let channelData = snapshot.value as!   Dictionary<string, anyobject=""> // 2

    let id =   snapshot.key

    if let name = channelData["name"] as! String!, name.characters.count >   0 { // 3

      self.channels.append(Channel(id: id, name:   name))

      self.tableView.reloadData()

    } else {

      print("Error! Could not decode channel   data")

    }

  })

}</string,>

   

代码解释:
1.   我们在通道引用上调用 observe:with: 方法,将句柄存储到引用。每当在数据库中添加新的通道时,就调用 completion block   。
2. completion 后接收到一个 FIRDataSnapshot   (存储在快照中),其中包含数据和其它有用的方法。
3. 我们将数据从快照中提取出来,如果成功,创建一个通道模型并将其添加到我们的通道数组中。


   

// MARK: View Lifecycle

override func viewDidLoad() {

  super.viewDidLoad()

  title = "RW RIC"

  observeChannels()

}

 

deinit   {

  if let   refHandle = channelRefHandle {

    channelRef.removeObserver(withHandle:   refHandle)

  }

}

   

这将在   view controller 加载时调用新的 observeChannels() 方法。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程