Подключение iOS-приложения к Ejabberd Server, размещенному на Amazon
Я принимал Ejabberd
сервер чата на Амазоне и добавил туда двух пользователей, когда я пытался подключить сервер Ejabberd через Adium
, он запрашивает сертификат, тогда только он подключается, сейчас я разрабатываю приложение чата в Swift
используя сервер Ejabberd и XMPP, я настроил весь код, передал имя хоста и номер порта: 5222, но он не подключался к серверу. Нужно ли мне писать программу для получения сертификата сервера и передачи файла сертификата компьютера (.p12) на сервер?
ПРИМЕЧАНИЕ. Я настроил сервер Ejabberd в localhost и с помощью iOS Swift Code. Он отлично работает, когда я отправляю сообщение из приложения iOS, затем он отображается в Adium, а когда пользователь Adium отправляет сообщение, я захожу в Ejabberd Web Admin Panel и могу проверить автономные сообщения.
Вот код в Swift для подключения Ejabberd, размещенного на Amazon:
//
// AppDelegate.swift
// Thanks to Process One for this.
import UIKit
import XMPPFramework
protocol ChatDelegate {
func buddyWentOnline(_ name: String)
func buddyWentOffline(_ name: String)
func didDisconnect()
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, XMPPRosterDelegate, XMPPStreamDelegate {
var window: UIWindow?
var delegate:ChatDelegate! = nil
let xmppStream = XMPPStream()
let xmppRosterStorage = XMPPRosterCoreDataStorage()
var xmppRoster: XMPPRoster
override init() {
xmppRoster = XMPPRoster(rosterStorage: xmppRosterStorage)
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
DDLog.add(DDTTYLogger.sharedInstance())
setupStream()
return true
}
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
disconnect()
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
connect()
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
//MARK: Private Methods
func setupStream() {//fileprivate
//xmppRoster = XMPPRoster(rosterStorage: xmppRosterStorage)
xmppRoster.activate(xmppStream)
xmppStream?.addDelegate(self, delegateQueue: DispatchQueue.main)
xmppRoster.addDelegate(self, delegateQueue: DispatchQueue.main)
}
func goOnline() { //fileprivate
let presence = XMPPPresence()
let domain = xmppStream?.myJID.domain
if domain == "gmail.com" || domain == "gtalk.com" || domain == "talk.google.com" {
let priority = DDXMLElement.element(withName: "priority", stringValue: "24") as! DDXMLElement
presence?.addChild(priority)
}
xmppStream?.send(presence)
}
func goOffline() { //fileprivate
let presence = XMPPPresence(type: "unavailable")
xmppStream?.send(presence)
}
func connect() -> Bool {
xmppStream.hostName = "amazon hosted ejabber ip address"
xmppStream.hostPort=5222
if !(xmppStream?.isConnected())! {
let jabberID = UserDefaults.standard.string(forKey: "userID")
let myPassword = UserDefaults.standard.string(forKey: "userPassword")
if !(xmppStream?.isDisconnected())! {
return true
}
if jabberID == nil && myPassword == nil {
return false
}
xmppStream?.myJID = XMPPJID.init(string: jabberID)
do {
try xmppStream?.connect(withTimeout: XMPPStreamTimeoutNone)
print("Connection success")
return true
} catch {
print("Something went wrong!")
return false
}
} else {
return true
}
}
func disconnect() {
goOffline()
xmppStream?.disconnect()
}
//MARK: XMPP Delegates
func xmppStreamDidConnect(_ sender: XMPPStream!) {
do {
try xmppStream?.authenticate(withPassword: UserDefaults.standard.string(forKey: "userPassword"))
} catch {
print("Could not authenticate")
}
}
func xmppStreamDidAuthenticate(_ sender: XMPPStream!) {
goOnline()
}
func xmppStream(_ sender: XMPPStream!, didReceive iq: XMPPIQ!) -> Bool {
print("Did receive IQ")
return false
}
func xmppStream(_ sender: XMPPStream!, didReceive message: XMPPMessage!) {
print("Did receive message \(message)")
}
func xmppStream(_ sender: XMPPStream!, didSend message: XMPPMessage!) {
print("Did send message \(message)")
}
func xmppStream(_ sender: XMPPStream!, didReceive presence: XMPPPresence!) {
let presenceType = presence.type()
let myUsername = sender.myJID.user
let presenceFromUser = presence.from().user
if presenceFromUser != myUsername {
print("Did receive presence from \(presenceFromUser)")
if presenceType == "available" {
delegate.buddyWentOnline("\(presenceFromUser)@gmail.com")
} else if presenceType == "unavailable" {
delegate.buddyWentOffline("\(presenceFromUser)@gmail.com")
}
}
}
func xmppRoster(_ sender: XMPPRoster!, didReceiveRosterItem item: DDXMLElement!) {
print("Did receive Roster item")
}
}
1 ответ
В конце концов мне удалось решить эту проблему, и я действительно поражен тем, что реализовал приложение чата с использованием сервера Ejabberd, размещенного на Amazon.
Выпуск:
1. Когда я запускал свое приложение, оно не подключалось?
Ответ: Проблема с сертификатом (Сервер - клиентское рукопожатие сертификата решает проблему)
2. Невозможно получить онлайн-приятель? Ответ: я использовал Adium, чтобы сделать всех пользователей онлайн, а затем запустить мое приложение, и это работает как шарм.
Отличное обучение для меня для этого приложения. Если у any1 возникнут проблемы с чатом, не стесняйтесь комментировать, я с нетерпением жду помощи. Спасибо