Finally we figured out how to handle the client reset error. We have taken following steps To avoid the data loss incase user is offline and came online and got reset error.
Save the local realm to another directory
 
Invalidate and nil the realm
 
Initiate realm manual reset  - Call SyncSession.immediatelyHandleError with clientResetToken passed and it will delete the existing realm from directory
 
Show client reset alert - This will intimate user to relaunch the app.
 
On next launch realm creates a fresh realm from ROS.
 
After new realm connects, restore the realm records (if any) from the old realm saved in backup directory above.
 
Delete the backup realm(old realm) from directory.
 switch syncError.code {
 case .clientResetError:
 if let (path, clientResetToken) = syncError.clientResetInfo() {
 // taking backup
 backUpRealm(realm: yourLocalRealm)
 // making realm nil and invalidating
 yourLocalRealm?.invalidate()
 yourLocalRealm = nil
//Initiate realm manual reset  - Call `SyncSession.immediatelyHandleError` with `clientResetToken` passed and it will delete the existing realm from directory
 SyncSession.immediatelyHandleError(clientResetToken)
 // can show alert to user to relaunch the app
 showAlertforAppRelaunch()
 }
 default:
 // Handle other errors...
 ()
 }
}```
 
The back up realm code look like this:
func backUpRealm(realm: Realm?) {
        do {
            try realm?.writeCopy(toFile: backupUrl)
        } catch {
            print("Error backing up data")
        }
    }
After doing this backup will be available at backup path. On next launch device will connect and download a fresh realm from ROS so after device connects restore the realm records from the backup realm saved in the backup path.
The restore merge backup code will look like this. place the below method when realm connects after relauch.The ```restoredRealm`` is  fresh downloaded realm on launch
func restoreAndMergeFromBackup(restoredRealm: Realm?) {
        let realmBackUpFilePath = isRealmBackupExits()
        // check if backup exists or not
        if realmBackUpFilePath.exists {
            let config = Realm.Configuration(
                fileURL: URL(fileURLWithPath: realmBackUpFilePath.path),
                readOnly: true)
            
            let realm = try? Realm(configuration: config)
            
            guard let backupRealm = realm else { return }
            
            //Get your realm Objects
            let objects = backupRealm.objects(YourRealmObject.self)
            
           try? restoredRealm?.safeWrite {
        
                for object in objects {
                // taking local changes to the downloaded realm if it has
                    restoredRealm?.create(YourRealmObject.self, value: object, update: .modified)
                }
                self.removeRealmFiles(path: realmBackUpFilePath.path)
            }
        } else {
            debug("backup realm does not exists")
        }
    }
    
    private func isRealmBackupExits() -> (exists: Bool, path: String) {
        let documentsPath = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
        
        let realmPathComponent =  documentsPath.appendingPathComponent("your_backup.realm")
        
        let filePath = realmPathComponent.path
        let fileManager = FileManager.default
        
        if fileManager.fileExists(atPath: filePath) {
            return (true, filePath)
        }
        
        return (false, "")
    }
    private func removeRealmFiles(path: String) {
        let realmURL = URL(fileURLWithPath: path)
        
        let realmURLs = [
            realmURL,
            realmURL.appendingPathExtension("lock"),
            realmURL.appendingPathExtension("realm"),
            realmURL.appendingPathExtension("management")
        ]
        for URL in realmURLs {
            do {
                try FileManager.default.removeItem(at: URL)
            } catch {
                debug("error while deleting realm urls")
            }
        }
    }```
In our testing we have found that there is a backup made by realm automatically so we deleted it for safety purpose. the path argument you will get in the if let (path, clientResetToken) = syncError.clientResetInfo()
func removeAutoGeneratedRealmBackUp(path: String) {
    do {
        try FileManager.default.removeItem(at: URL(fileURLWithPath: path))
    } catch {
        debug("error while deleting realm backUp path \(path)")
    }
}