Изменение IP-адреса в Realm Object Server

У меня проблема, когда у Realm Object Server другой IP-адрес. Приложение может войти в систему с помощью Credential, но после этого оно вернет пустые данные, хотя моя база данных находится прямо на этом IP и может быть доступна через Realm Browser. На самом деле, я использую только одну учетную запись на сервере объектов области и создаю пользовательскую таблицу с именем пользователя и паролем, чтобы после того, как она могла подключиться через Credential к серверу, я прочитала имя пользователя и пароль на экране и проверила их информацию в базе данных.

Функция подключения к Realm Object Server:

class func login(username: String, password: String, action: AuthenticationActions, completionHandler: @escaping ()->()) {
    let serverURL = NSURL(string: realmIP)!
    let credential = Credential.usernamePassword(username: username, password: password, actions: [action])
    SyncUser.authenticate(with: credential, server: serverURL as URL) { user, error in
        if let user = user {
            syncUser = user
            let syncServerURL = URL(string: realmURL)!
            let config = Realm.Configuration(syncConfiguration: (user, syncServerURL))
            realm = try! Realm(configuration: config)
        } else if error != nil {

        }
        completionHandler()
    }
}

Запрос из таблицы после входа в систему SyncUser:

class func loginLocal(employee: String) -> Bool{
    let predicate = NSPredicate(format: "employee = %@", employee)
    if (realm != nil) {
        let user = realm?.objects(MyUser.self).filter(predicate)
        if ((user?.count)! > 0) {
            return true
        }
    }
    return false
}

Решение кажется странным, поэтому мне приходится несколько раз вызывать функцию, нажимая кнопку входа в систему, и надеяться, что она пройдет до сервера.

Это мое первое приложение, использующее Realm и Realm Object Server, поэтому у меня нет особого опыта в этой ситуации.

1 ответ

Мне может понадобиться больше информации о том, как вы обрабатываете зарегистрированную область после входа в систему, но из кода, который вы там показали, похоже, что вы случайно получаете доступ к локальной версии области, а не к синхронизированной.

После входа в систему необходимо убедиться, что вы используете тот же Configuration объект всякий раз, когда вы создаете Realm экземпляры после этого. Не рекомендуется создавать, а затем сохранять realm экземпляр внутри блока завершения входа в систему, так как этот блок происходит в фоновом потоке, делая его недоступным где-либо еще.

Если ваше приложение всегда в сети, проще просто установить конфигурацию синхронизации в качестве области по умолчанию для вашего приложения:

SyncUser.authenticate(with: credential, server: serverURL as URL) { user, error in
    if let user = user {
        syncUser = user
        let syncServerURL = URL(string: realmURL)!
        let config = Realm.Configuration(syncConfiguration: (user, syncServerURL))
        Realm.Configuration.defaultConfiguration = config
    } 
    completionHandler()
}

В противном случае вы можете сохранить Configuration в каком-то глобальном объекте, или воссоздайте его каждый раз, когда вам нужно создать Realm пример. Важно помнить, что вы должны убедиться, что ваш Realm Экземпляр использует Configuration объект с успешно вошедшим в систему пользователем, в противном случае он по умолчанию вернется к использованию обычной пустой пустой области.

Другие вопросы по тегам