因为需求,需要从服务器获取支付结果的通知,而后台已经在POS和安卓端使用MTQQ,没办法iOS端消息推送也只能用MTQQ,查询了一些资料发现MTQQ好像要比信鸽、极光的应用内消息更加简单点,至少iOS端少去了推送证书的配置等一些繁琐的流程。MQTT本质上就是一个TCP长连接而已。
初始化MQTT
// 获取设备uuid
if Keychain.load("kUUID") == nil {
let uuidRef: CFUUIDRef = CFUUIDCreate(kCFAllocatorDefault)
Keychain.save("kUUID", data: CFUUIDCreateString(kCFAllocatorDefault, uuidRef))
}
let uuid: String = Keychain.load("kUUID") as! String
// clientId:用来区分接受消息的设备,此处我用的是设备的UUID,并保存在了钥匙串里,确保唯一性。
mqtt = MQTTSession.init(clientId: uuid, userName: "name", password: "psw")
mqtt?.connectToHost("111.111.111.111", port: 1111)
mqtt?.setDelegate(self)
消息回调
链接状态回调
// 链接状态回调
override func session(session: MQTTSession!, handleEvent eventCode: MQTTSessionEvent) {
switch eventCode {
case MQTTSessionEventConnected:
print("消息推送: connected")
// 链接成功后,订阅主题
self.mqtt?.subscribeTopic("TX_APP_PAY")
case MQTTSessionEventConnectionRefused:
print("消息推送: connection refused")
case MQTTSessionEventConnectionClosed:
print("消息推送: connection closed")
case MQTTSessionEventConnectionError:
print("消息推送: connection error")
print(" reconnecting...")
// 链接错误的话,尝试重新链接
self.mqtt?.connectToHost("111.111.111.111", port: 1111)
case MQTTSessionEventProtocolError:
print("消息推送: protocol error")
default:
break
}
}
接收到消息回调
// 接收到消息回调
override func session(session: MQTTSession!, newMessage data: NSData!, onTopic topic: String!) {
var dic = NSDictionary()
do {
dic =
try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
} catch {
}
print("推送内容:", dic)
print("推送主题:", topic)
}