Changing IP address in Realm Object Server

272 views Asked by At

I have an issue when the Realm Object Server have a different IP. The application can login through by Credential but after that it will return empty data although my database sit right on that IP and can be accessed by Realm Browser. Actually, I only use one account in realm object server and I create a user table with username and password so that after it can connect through Credential to the server, I will read the username and password on screen and check it information in database.

Connect to Realm Object Server function:

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()
    }
}

Query from table after login by 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
}

The solution seems to be weird so that I have to call a function multiple times by pressing my login button and hope that it will go through to the server.

This is my first application using Realm and Realm Object Server so I don't have much experience in this situation.

1

There are 1 answers

0
TiM On

I may need more information on how you're handling the logged in Realm after the login, but from the code you've shown there, it looks like you're accidentally accessing a local version of the Realm and not the synchronized one.

Once logged in, you need to make sure you use the same Configuration object whenever you create Realm instances after that. It's not recommended to create and then save the realm instance inside the login completion block, as this block occurs on a background thread, making it unavailable anywhere else.

If your app is always online, it's easier to simply set the sync configuration as the default Realm for your app:

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()
}

Otherwise, you can either save the Configuration in some sort of global object, or recreate it each time you need to create a Realm instance. The important thing to remember is you need to make sure your Realm instance is using a Configuration object with the successfully logged in user, otherwise it will default back to using a normal, empty local Realm.