在本教程中,我将介绍怎样创建一个简单的 iOS 聊天 App(用 swift 和 Syncano)。

在第一部分,我们创建了新的项目,并加入了一个 JSQMessagesViewController(然后在上面显示一些測试消息)。

在第二部分,我们将数据存到server并实时同步(当新消息一存到数据库就马上显示,不须要不论什么刷新操作)。

假设你错过了第一部分,你能够去这里阅读。

你能够从第一部分開始,也能够从这里下载第一部分的代码然后開始。

注意,这个项目使用了 CocoaPods,假设你没实用过它。不知道怎样安装它——请參考第一部分。

加入 Syncano

接下来是让人兴奋的环节了——真正将消息发送到后台并接受其它人发送的消息。

注冊 Syncano

假设你还没有账号,请到这里注冊——它仅仅须要花费你 10 秒钟的时间。仅仅须要你提供一个邮箱地址和password。

配置 Syncano

这里登录你的 Syncano 账号。

假设你还没有一个 Syncano 实例(一个实例就是一个项目) 。或者你准备用一个空实例,你能够创建一个新实例:

记住你的实例名称,然后选择它。

然后新建一个类。用这个类保存全部消息:

类名输入 Message,并设置下面字段为:

  • text : String
  • senderid : String
  • attachment : File

我们还须要加入一个频道(Chanel),频道是用来对数据进行实时同步的。

进入 Channels 页面,加入一个频道。频道名字命名为 Messages。other permissions 设置为 publish。

最后,创建一个 API key,API key 用于连接数据库。描写叙述字段随便填写,但 Ignore ACL 必须设置为 True(将右边的开关拉到 ON 位置)。

key 设置完后,记下 key——我们会在后面用到它。

在项目中加入 Syncano

首先。我们须要一个 Syncano 对象,指定连接中要使用的实例名和 API key。这个对象是全部连接共享的。此外还须要一个 Channel 对象用于数据同步。在 ViewController 中加入它们:

let syncanoChannelName = "messages"

class ViewController: JSQMessagesViewController {

    let syncano = Syncano.sharedInstanceWithApiKey(YOUR_API_KEY, instanceName: YOUR_INSTANCE_NAME)
let channel = SCChannel(name: syncanoChannelName) //...
}

将 YOUR_API_KEY 和 YOUR_INSTANCE_NAME 替换成你先前记下的值。

假设你的频道名称和我的不同,也要替换它。

下载和发送消息

在開始和 Syncano 交互之前。我们还须要定义一个类,用于映射我们在 Dashboard 中创建的类。

在 Xcode 中新建一个 Cocoa 类,类名为 Message,继承 SCDataObject。语言为 Swift:

编辑 Message.swift 为:

import UIKit
import syncano_ios class Message: SCDataObject {
var text = ""
var senderId = ""
var attachment : SCFile? override class func extendedPropertiesMapping() -> [NSObject: AnyObject] {
return [
"senderId":"senderid"
]
}
}

我们将类定义成和 Dashboard 中定义的类一样。唯一不同的是。senderId 使用了驼峰命名法。而在 Syncano 上全部的名字都是小写字母的。因此我们告诉 Syncano 这个属性的名字略微有点不同(通过这样的方式,我们的属性名能够保持 iOS 的命名规范)。

在 ViewController.swift 中加入一个扩展:

//MARK - Syncano
extension ViewController { func sendMessageToSyncano(message: JSQMessage) {
let messageToSend = Message()
messageToSend.text = message.text
messageToSend.senderId = self.senderId
messageToSend.channel = syncanoChannelName
messageToSend.other_permissions = .Full
messageToSend.saveWithCompletionBlock { error in
if (error != nil) {
//Super cool error handling
}
}
} func downloadNewestMessagesFromSyncano() {
Message.please().giveMeDataObjectsWithCompletion { objects, error in
if let messages = objects as? [Message]! {
self.messages = self.jsqMessagesFromSyncanoMessages(messages)
self.finishReceivingMessage()
}
}
} func jsqMessageFromSyncanoMessage(message: Message) -> JSQMessage {
let jsqMessage = JSQMessage(senderId: message.senderId, senderDisplayName: message.senderId, date: message.created_at, text: message.text)
return jsqMessage
} func jsqMessagesFromSyncanoMessages(messages: [Message]) -> [JSQMessage] {
var jsqMessages : [JSQMessage] = []
for message in messages {
jsqMessages.append(self.jsqMessageFromSyncanoMessage(message))
}
return jsqMessages
}
}

这些方法用于和 Syncano 进行通讯。

  • sendMessageToSyncano(message: JSQMessage) 将一个 JSQMessage 对象转换成 Syncano 对象然后提交给 Syncano。注意,在设置 senderId 和 text 字段之后还要设置 chanel 字段——channel 用于实时同步。以及 other_permissions 字段——用于指定谁有权訪问这个对象——这里设为 Full,表示全部人。

  • downloadNewestMessagesFromSyncano() 用于下载最新的消息,用server的消息替换掉原来的 messages 数组。

  • jsqMessageFromSyncanoMessage(message: Message) 和 jsqMessagesFromSyncanoMessages(messages: [Message]) 方法用于在 Message 类和 JSQMessage 类之间进行转换。

接下来我们改动代码,让用户输入的消息能够发送到 Syncano。在 didPressSendButton 方法中调用 sendMessageToSyncano 方法:

    override func didPressSendButton(button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: NSDate!) {
let message = JSQMessage(senderId: senderId, senderDisplayName: senderDisplayName, date: date, text: text)
self.messages += [message]
self.sendMessageToSyncano(message)
self.finishSendingMessage()
}

然后,将測试消息替换成真正的 Syncano 消息。

在 viewDidLoad 方法中我们会下载最新的消息。注意,我们已经删除了之前加入的測试消息:

    override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.setup()
self.downloadNewestMessagesFromSyncano()
}

执行程序,你会看到一个空白的窗体。那是由于在server上还没有不论什么聊天消息。发送几条消息然后重新启动 App ——你将看到消息已经存进了server。你能够登入你的 Syncano Dashboard 查看这些消息是否都保存到了 Message 类中。

实时!

这个 App 另一个实时功能没有实现,即每当server收到一条消息,client就能马上收到。

我们能够在后台每隔几秒就刷新一下消息列表。但更好的办法是使用 Syncano 频道。

在 setup() 方法中从频道中获取聊天消息:

    func setup() {
self.senderId = UIDevice.currentDevice().identifierForVendor? .UUIDString
self.senderDisplayName = UIDevice.currentDevice().identifierForVendor?.UUIDString
self.channel.delegate = self
self.channel.subscribeToChannel()
}

我们将频道的托付设置为 self,因此须要让 self 实现 SCChannelDelegate 协议。

在ViewController.swift 中新增一个扩展:

//MARK - Channels
extension ViewController : SCChannelDelegate { func addMessageFromNotification(notification: SCChannelNotificationMessage) {
let message = Message(fromDictionary: notification.payload)
if message.senderId == self.senderId {
//we don't need to add messages from ourselves
return
}
self.messages.append(self.jsqMessageFromSyncanoMessage(message))
self.finishReceivingMessage()
} func updateMessageFromNotification(notification: SCChannelNotificationMessage) { } func deleteMessageFromNotification(notification: SCChannelNotificationMessage) { } func chanellDidReceivedNotificationMessage(notificationMessage: SCChannelNotificationMessage!) {
switch(notificationMessage.action) {
case .Create:
self.addMessageFromNotification(notificationMessage)
case .Delete:
self.deleteMessageFromNotification(notificationMessage)
case .Update:
self.updateMessageFromNotification(notificationMessage)
default:
break
}
}
}

总结

这部分的内容就到此为止了,我们的 App 还是一个半成品。如今,你能够和朋友分享它,也能够继续第三部分。

这部分的代码在这里下载。

在第三部分。我们将学习怎样让用户注冊和通过验证,以及 UI 的改动,怎样将不同用户发送的消息有差别地显示。

敬请关注!

假设你有不论什么问题。请 tweet

用 JSQMessagesViewController 创建一个 iOS 聊天 App - 第 2 部分的更多相关文章

  1. 如何用 React Native 创建一个iOS APP?(三)

    前两部分,<如何用 React Native 创建一个iOS APP?>,<如何用 React Native 创建一个iOS APP (二)?>中,我们分别讲了用 React ...

  2. 如何用 React Native 创建一个iOS APP?(二)

    我们书接上文<如何用 React Native 创建一个iOS APP?>,继续来讲如何用 React Native 创建一个iOS APP.接下来,我们会涉及到很多控件. 1 AppRe ...

  3. 如何用 React Native 创建一个iOS APP?

    诚然,React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用.在 JavaScript 中用 Reac ...

  4. 一个先进的App框架:使用Ionic创建一个简单的APP

    原文  http://www.w3cplus.com/mobile/building-simple-app-using-ionic-advanced-html5-mobile-app-framewor ...

  5. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  6. 教你动手做一个 iOS 越狱 app

    前言 俗话说得好, 万事开头难. 仅仅是上图一个如此简单地不能再简单的小app, 其实都不算是app, 只是注入了一段代码进系统中, 等到特定的函数方法调用的时候就会被我们hook掉, 执行我们写的代 ...

  7. 使用ionic framework创建一个简单的APP

    ionic是一个以cordova为基础的html5前端框架,功能强大,能够快速做出与原生开发相似的应用. 一,安装和配置 1,安装(前提:cordova环境配置完成) npm install -g i ...

  8. Cordova 系列之创建一个iOS项目

    1.打开终端 2.输入命令 $ cd Desktop (PS:Desktop表示放在桌面,你可以选择放任意位置) 3.$  cordova create HelloWorld com.example. ...

  9. 两行代码快速创建一个iOS主流UI框架

    本框架适用于 使用 NavigationController+UITabBarController 的APP 框架QLSNavTab , GitHub地址:https://github.com/qia ...

随机推荐

  1. python--9、进程池

    concurrent.futures模块 进程池中的进程是固定的,若是池中有任务结束后,等待的任务进来后由空闲的进程来处理. 导入方法三连发: from 标题的模块 import 如下:Process ...

  2. Android进入一个新页面,EditText失去焦点并禁止弹出键盘

    android在进入一个新页面后,edittext会自动获取焦点并弹出软键盘,这样并不符合用户操作习惯. 在其父控件下,添加如下的属性,就可以完美解决,使其进入页面后不主动获取焦点,并且不弹出软键盘: ...

  3. 【PL/SQL】九九乘法口诀表

    --输出屏幕信息 SET serveroutput ON; --打印口诀表 DECLARE V_NUMBER1 ); --外层循环变量 V_NUMBER2 ); --内层循环变量 BEGIN .. - ...

  4. html5——多媒体(二)

    基本方法 load() //重新加载视频 play() //播放 pause() //暂停 基本属性 currentTime //视频播放的当前进度. duration //视频的总时间 paused ...

  5. JS——鼠标跟随

    注意事项: 1.pageX.pageY的兼容问题 2.使目标移动鼠标中间位置还必须减去盒子宽度的一半 <!DOCTYPE html> <html lang="en" ...

  6. JS——for

    打印两行星星: <script> for (var i = 0; i < 2; i++) { for (var j = 0; j < 10; j++) { document.w ...

  7. 六时车主 App iOS隐私政策

    本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐私权政策另 ...

  8. 文件下载之ServletOutputStream

    使用response.getOutputStream可以获取ServletOutputStream,从而实现向页面发送流数据.但是需要注意的是,不能使用ajax进行请求,因为这样页面不会有任何反应,可 ...

  9. mysql_数据查询_连接查询

    连接查询 1.连接(join) 也称θ连接,从两个关系的笛卡尔积中选择属性间满足一定条件的元组. 等值连接:θ为“=”的连接运算称为等值连接.从关系R和S的广义笛卡尔积中选取A.B属性值相等的元组. ...

  10. Please, commit your changes or stash them before you can merge

    参照 : https://blog.csdn.net/iefreer/article/details/7679631 用git pull来更新代码的时候,遇到了下面的问题: error: Your l ...